儿童科学动画教你用简单动画理解影子原理手电筒灯光下影子为何会变大变小实用动画教程
先来个超级有趣的小实验!
今天晚上,你要不要跟爸爸妈妈一起玩个好玩的游戏?对,就是玩影子!
找一个黑黑的房间,关掉所有灯,只留下一支手电筒。然后拿一个你的小玩具——可以是奥特曼,可以是小兔子玩偶,什么都行!
把玩具放在桌上,手电筒照向它,墙上的影子就出现了!
现在,你可以试着把手电筒慢慢靠近玩具,或者慢慢远离玩具……你发现了什么?影子是不是在变来变去?
这个简单的游戏,其实藏着一个超厉害的科学原理!今天我们就来揭开这个秘密~
影子到底是什么?
要理解影子为什么会变大变小,我们得先搞清楚——影子是怎么来的?
想象一下:光就像一群调皮的小兵,它们总是喜欢走直路,从来不转弯。当这些”光小兵”在前进的路上遇到一个挡路的障碍物(比如你的玩具),它们就被挡住了,过不去。
结果呢?在障碍物的后面,就出现了一片”光小兵”去不了的地方——那就是影子!
所以影子其实是光被挡住后留下的”空缺”,是光线走不过去的地方。
动手做动画!用简单代码画一个影子实验
要更好地理解影子的变化规律,我们用编程来做一个超简单的动画实验吧!
你可以跟着这个 Python 代码,自己运行看看效果哦~
import turtle
import time
# 创建一个屏幕
screen = turtle.Screen()
screen.title("影子原理小实验")
screen.bgcolor("black")
# 创建画笔
pen = turtle.Turtle()
pen.speed(0)
pen.hideturtle()
def draw_scene(source_distance, object_height, screen_distance):
"""画出场景:光源、物体、墙壁和影子"""
pen.clear()
# 画光源(手电筒)
pen.penup()
pen.goto(-source_distance, 0)
pen.color("yellow")
pen.dot(20)
pen.write("🔦 手电筒", font=("Arial", 12, "normal"))
# 画物体(小玩具)
pen.penup()
pen.goto(0, -object_height/2)
pen.color("blue")
pen.begin_fill()
pen.goto(0, -object_height/2)
pen.goto(-15, -object_height/2)
pen.goto(-15, object_height/2)
pen.goto(15, object_height/2)
pen.goto(15, -object_height/2)
pen.end_fill()
pen.color("white")
pen.write("🧸 玩具", font=("Arial", 10, "normal"))
# 画墙壁
pen.penup()
pen.goto(screen_distance, -100)
pen.pendown()
pen.color("gray")
pen.width(5)
pen.goto(screen_distance, 100)
pen.width(1)
# 计算并画出影子
# 利用相似三角形原理计算影子高度
shadow_height = object_height * (screen_distance + source_distance) / source_distance
# 画影子
pen.color("darkgray")
pen.begin_fill()
pen.penup()
pen.goto(screen_distance - 10, -shadow_height/2)
pen.pendown()
pen.goto(screen_distance + 10, -shadow_height/2)
pen.goto(screen_distance + 10, shadow_height/2)
pen.goto(screen_distance - 10, shadow_height/2)
pen.end_fill()
pen.color("white")
pen.goto(screen_distance + 20, shadow_height/2 + 10)
pen.write(f"影子高度: {shadow_height:.1f}", font=("Arial", 10, "normal"))
# 画光线(两条边界光线)
pen.color("orange", "rgba(255,200,0,0.3)")
pen.pensize(2)
# 上边界光线
pen.penup()
pen.goto(-source_distance, 0)
pen.pendown()
top_y = object_height/2
slope = (top_y - 0) / (0 - (-source_distance))
pen.goto(screen_distance, slope * (screen_distance + source_distance))
# 下边界光线
pen.penup()
pen.goto(-source_distance, 0)
pen.pendown()
bottom_y = -object_height/2
slope2 = (bottom_y - 0) / (0 - (-source_distance))
pen.goto(screen_distance, slope2 * (screen_distance + source_distance))
# 主程序
def main():
print("🔦 影子原理动画演示 🔦")
print("=" * 40)
print("我们会改变手电筒的距离,看看影子怎么变化!")
print()
# 固定参数
object_height = 60 # 玩具高度
screen_distance = 200 # 玩具到墙的距离
# 测试不同的手电筒距离
distances = [50, 80, 120, 160, 200]
for i, dist in enumerate(distances):
print(f"实验 {i+1}: 手电筒距离玩具 {dist}px")
draw_scene(dist, object_height, screen_distance)
time.sleep(1.5)
print()
print("🎉 你发现了什么?")
print("手电筒越靠近玩具 → 影子越大!")
print("手电筒越远离玩具 → 影子越小!")
if __name__ == "__main__":
main()
运行这段代码后,你会看到一个超级直观的实验动画!光源、玩具、墙壁和影子全部清晰展示。最关键的是,你可以实时看到手电筒距离变化时,影子大小的变化!
为什么影子会变大变小?原理大揭秘!
现在我们来认真讲解一下背后的科学原理——相似三角形!
这个听起来有点难,但其实超级简单,我给你画个图来解释:
手电筒光源
🔦
*
/ \
/ \ ← 光线
/ \
/ \
/ * \
/ (玩具) \
/ | \
/ | \
/ ----+---- \
/ | | | \
/ | | | \
/ |影子| |墙壁 \
/ | | | \
*-------+----+----+---------*
光源 玩具位置 墙壁位置
你看这个图,其实包含了两个相似三角形!
第一个三角形:从光源出发,到玩具顶端的光线,形成一个小的三角形。
第二个三角形:从光源出发,到墙壁上影子顶端的光线,形成一个大的三角形。
因为这两个三角形的角度是一样的(相似三角形),所以它们的边长成比例:
影子高度 / 玩具高度 = (光源到墙的距离) / (光源到玩具的距离)
用这个公式,我们可以算出:
- 当手电筒靠近玩具时,分母变小,影子就变大
- 当手电筒远离玩具时,分母变大,影子就变小
这就是为什么你把手电筒靠近玩具,墙上的影子会突然变得超级大!
来做更详细的实验!记录数据
现在我们来做一个正式的实验,把数据记录下来,看看规律到底是什么。
import matplotlib.pyplot as plt
# 实验数据
toy_height = 5 # 玩具实际高度(厘米)
screen_distance = 100 # 玩具到墙的距离(厘米)
# 不同的手电筒距离(从光源到玩具的距离)
distances = [20, 30, 50, 80, 100, 150, 200]
# 计算影子高度
shadow_heights = []
for d in distances:
# 相似三角形公式
shadow = toy_height * (d + screen_distance) / d
shadow_heights.append(shadow)
print(f"手电筒距离: {d}cm → 影子高度: {shadow:.1f}cm")
print()
print("📊 数据规律分析:")
print(f"玩具实际高度: {toy_height}cm")
print(f"当手电筒距离为 20cm 时,影子放大到 {shadow_heights[0]:.1f}cm,放大了 {shadow_heights[0]/toy_height:.1f} 倍!")
print(f"当手电筒距离为 200cm 时,影子放大到 {shadow_heights[-1]:.1f}cm,放大了 {shadow_heights[-1]/toy_height:.1f} 倍!")
# 画图
plt.figure(figsize=(10, 6))
plt.plot(distances, shadow_heights, 'o-', color='orange', linewidth=2, markersize=8)
plt.xlabel('手电筒到玩具的距离 (cm)', fontsize=12)
plt.ylabel('影子高度 (cm)', fontsize=12)
plt.title('手电筒距离与影子大小的关系', fontsize=14)
plt.grid(True, alpha=0.3)
plt.axhline(y=toy_height, color='red', linestyle='--', label=f'玩具实际高度: {toy_height}cm')
plt.legend()
plt.tight_layout()
plt.savefig('shadow_experiment.png', dpi=150)
plt.show()
运行后你会得到一张漂亮的图表,清楚地显示:手电筒越靠近玩具,影子就越大,而且这个变化不是线性的——靠近的时候变化特别明显!
生活中的影子观察
现在你知道了原理,来观察一下生活中的影子吧!
晚上走路时:
- 如果你走在路灯下,你的影子会变来变去
- 当你靠近路灯时,影子变短
- 当你远离路灯时,影子变长
- 这是因为路灯是点光源,原理和手电筒一样!
白天太阳下:
- 早上的太阳比较低,影子很长
- 中午太阳比较高,影子很短
- 傍晚太阳又低了,影子又变长
- 这和手电筒实验不太一样,因为太阳离地球超级远,光线几乎是平行的
电影放映机:
- 放映机里的影像通过镜头投射到大屏幕上
- 镜头原理和影子放大是类似的——光线通过物体后被放大投射
- 所以如果你把手电筒照在小小的纸片上,墙上的影子会超级大!
进阶挑战:尝试不同的光源!
光有手电筒还不够,我们可以试试不同情况:
1. 太阳光下的影子(平行光)
太阳离地球超级远,所以到达地球的光线几乎是平行的。这时候影子的长度主要取决于太阳的高度角,而不是距离。
太阳 → → → → → → → → → → → 物体 → → 影子
平行光线
你可以用一根直直的火柴棍,放在太阳光下,影子长度基本不变(除非太阳位置变了)。
2. 多个光源的情况
如果你有多个手电筒从不同角度照向玩具,会发生什么?
# 多光源影子实验
def multi_source_shadow():
"""多光源会产生多个影子!"""
import turtle
screen = turtle.Screen()
screen.bgcolor("black")
pen = turtle.Turtle()
pen.speed(0)
pen.hideturtle()
# 画两个光源
pen.color("yellow")
pen.penup()
pen.goto(-150, 100)
pen.dot(15)
pen.write("光源1", font=("Arial", 10))
pen.color("cyan")
pen.penup()
pen.goto(-150, -100)
pen.dot(15)
pen.write("光源2", font=("Arial", 10))
# 画物体
pen.color("white")
pen.penup()
pen.goto(0, 0)
pen.pendown()
pen.goto(0, 50)
pen.goto(-10, 50)
pen.goto(-10, 0)
pen.goto(-10, -50)
pen.goto(10, -50)
pen.goto(10, 0)
pen.goto(10, 50)
pen.goto(0, 50)
# 画墙壁和两个影子
pen.color("gray")
pen.penup()
pen.goto(200, -100)
pen.pendown()
pen.goto(200, 100)
# 光源1的影子
pen.color("darkorange")
pen.begin_fill()
pen.goto(200, -80)
pen.goto(220, -80)
pen.goto(220, 20)
pen.goto(200, 20)
pen.end_fill()
# 光源2的影子
pen.color("darkcyan")
pen.begin_fill()
pen.goto(200, -20)
pen.goto(220, -20)
pen.goto(220, 80)
pen.goto(200, 80)
pen.end_fill()
pen.color("white")
pen.goto(230, -30)
pen.write("影子1(橙色)", font=("Arial", 10))
pen.goto(230, 30)
pen.write("影子2(蓝色)", font=("Arial", 10))
turtle.done()
multi_source_shadow()
你会发现:多个光源会产生多个影子! 每个光源都会产生一个独立的影子,而且影子的方向都不一样!
常见问题解答
Q1:影子为什么有时候边缘清楚,有时候模糊?
这跟光源的大小有关!
- 小光源(比如远处的星星、小手电筒)→ 影子边缘清晰
- 大光源(比如阴天的天空、大的灯管)→ 影子边缘模糊
这是因为大光源发出的光线来自不同方向,有些光能绕到”影子”区域边缘,导致边缘变得模糊。这个模糊的区域叫做半影区。
Q2:为什么月亮上的影子很黑?
因为月亮上没有大气层,阳光没有被散射,所以影子特别黑,边界也特别清晰。你在地球上看到的影子没那么黑,是因为周围有散射光。
Q3:影子有颜色吗?
影子本身没有颜色,它只是”没有光”的地方。但因为周围环境有其他颜色的光反射,影子有时候会呈现淡淡的蓝色或绿色——那是环境光的颜色!
动手小制作:自己做一个”影子剧场”
光看实验还不够,我们来做一个超好玩的影子剧场吧!
材料准备:
- 一个纸箱(鞋盒大小就行)
- 一张白纸
- 一支手电筒
- 剪刀
- 一些废旧纸板或玩具
制作步骤:
- 把纸箱一端剪掉,这一端就是”屏幕”
- 在纸箱另一端侧面开一个小孔,用来放手电筒
- 把白纸贴在这一端作为屏幕
- 在纸箱内部放一个小纸板剪成的人物
- 从外面用手电筒照进去,墙上就会出现影子!
表演时间: 你可以剪出各种形状——小动物、超人、花朵……用这个影子剧场来表演故事!这就是最古老的”电影”啦!
总结一下
今天我们学到了:
✅ 影子是光被挡住后形成的
✅ 手电筒越靠近玩具,影子越大;越远离,影子越小
✅ 这个规律可以用相似三角形来解释
✅ 多个光源会产生多个影子
✅ 光源大小会影响影子的清晰度
是不是超级有趣?下次玩手电筒的时候,记得想想今天学的知识!光这个东西,看起来简单,其实藏着好多好多科学奥秘呢~
如果你对这些实验感兴趣,可以尝试用不同的材料(透明的、半透明的、不透明的)来观察影子的变化,你会发现更多有趣的现象!
