摄影爱好者拍出大片和废片的区别往往在于光位的选择顺光侧光逆光不同光位如何影响画面以及这些光学原理如何解释眼镜矫正视力彩虹日食的形成
你肯定经历过这样的时刻——同一座山、同一个人、同一个下午,朋友随手一拍就是朋友圈爆赞,你拍出来却像是随手糊的。差别到底在哪?说出来你可能不信,不是相机贵不贵,不是参数调没调对,而是光线从哪个方向打过来了。
摄影圈有句话叫”用光写诗”,但写之前你得先懂这个字怎么写。今天咱们不聊那些让你头大的光圈快门ISO,就聊聊光从哪儿来、往哪儿去,以及为什么同样一束光,有人能拍出大片,有人只能收获废片。
光的位置决定了画面的性格
想象你站在一棵树下,阳光从你背后照过来,直射在那棵树身上——这是顺光。你看到的树颜色鲜艳、细节清晰,但整棵树看起来平平的,没有立体感,像一张贴纸。这就是顺光的特点:光线均匀,但缺乏层次。
当光从你的侧面打过来时,画面就活了。半明半暗,亮的地方亮得耀眼,暗的地方暗得有味道。这就是侧光,它是造型利器,能把平面的东西变成有立体感的画面。拍人像时侧光能勾勒出鼻梁的轮廓、下颌的线条;拍建筑时侧光能让砖墙的质感跃然纸上。
逆光最挑人,也最能出片。光线从被摄体的背后打过来,人物变成剪影,轮廓被光勾勒得清清楚楚,发丝都在发光。逆光拍好了就是大片,拍不好就是一团漆黑或者过度曝光的花絮。它是光影的魔术师,但前提是你得知道怎么驯服它。
顺光:最老实的光,也是最容易被忽略的光
顺光就是光线从相机背后照向被摄体,光源、相机、被摄体基本在一条直线上。这听起来是最简单的布光方式,但其实它藏着很多门道。
顺光的时候,被摄体几乎没有任何阴影,色彩饱和度看起来很高。为什么?因为光线均匀地洒在物体表面,没有阴影来”吃掉”颜色。拍花卉、拍风景、拍商品静物,顺光能让你获得最真实、最鲜艳的色彩还原。
但顺光的致命问题是”太平”。没有阴影就没有立体感,画面像是被压扁了。你可以做一个小实验:拿一个橙子放在桌上,从正前方打一束光,你会发现橙子看起来像一个平面的圆盘。然后从侧面打光,那个球体的感觉就出来了。
拍摄顺光照片时,想突破平面的限制,有几个技巧:
找纹理:既然颜色已经饱和了,就找物体表面的纹理细节。比如一面斑驳的老墙、一片落叶的脉络,顺光能让这些细节清清楚楚地呈现。
利用色彩对比:没有阴影衬托时,色彩之间的对比就成了画面的主角。蓝天下的红墙、绿草地上的黄花,顺光下这些色彩碰撞会特别有冲击力。
后期拉层次:现在的后期软件都能在顺光照片上”无中生有”,通过加深减淡工具手动增加阴影和高光,模拟侧光的效果。
侧光:光影雕刻家的秘密武器
侧光是最常用的造型光线,因为它能在画面上创造明暗对比,让平面变成立体。光从左边来,物体的右侧就留下阴影;光从右边来,左侧就暗下去。这种明暗关系就是画面的节奏感。
侧光拍人像的效果特别明显。正面光(顺光)下,人的脸看起来像一张纸;侧光下,鼻梁有了阴影,眼窝有了深邃感,脸颊有了立体轮廓。这就是为什么很多摄影师给人像打光时,会把主灯放在人物侧前方45度到90度的位置。
这里可以用一个简单的数学关系来理解:侧光的强度取决于光线与物体表面的夹角。当光线垂直照射物体表面时,反射最强,亮度最大;当光线与表面夹角变小(即光线趋于平行表面),反射减弱,同时阴影被拉长。
用代码来模拟这个关系:
import numpy as np
import matplotlib.pyplot as plt
# 光线入射角(0度表示垂直照射,90度表示平行于表面)
angles = np.linspace(0, 85, 100) # 单位:度
# 根据朗伯余弦定律,表面接收到的光照强度与入射角的余弦成正比
intensity = np.cos(np.radians(angles))
# 阴影长度与入射角的正切成正比(假设光源高度固定)
shadow_length = np.tan(np.radians(angles))
# 绘制光照强度和阴影长度的关系
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 5))
ax1.plot(angles, intensity, 'b-', linewidth=2)
ax1.set_xlabel('光线入射角 (度)', fontsize=12)
ax1.set_ylabel('相对光照强度', fontsize=12)
ax1.set_title('侧光强度变化曲线', fontsize=14, fontweight='bold')
ax1.grid(True, alpha=0.3)
ax1.set_xlim(0, 85)
ax2.plot(angles, shadow_length, 'r-', linewidth=2)
ax2.set_xlabel('光线入射角 (度)', fontsize=12)
ax2.set_ylabel('相对阴影长度', fontsize=12)
ax2.set_title('侧光阴影长度变化曲线', fontsize=14, fontweight='bold')
ax2.grid(True, alpha=0.3)
ax2.set_xlim(0, 85)
plt.tight_layout()
plt.savefig('side_light_analysis.png', dpi=150, bbox_inches='tight')
plt.show()
这个模拟告诉我们一个重要的摄影规律:侧光角度越大(光线越平行于表面),阴影越长,对比越强烈。但角度也不能太大,否则画面会太暗,细节丢失。
实际拍摄中,摄影师常说的”黄金侧光”是指上午9-10点和下午3-4点的阳光,这时光线角度大约45度左右,既保证了足够的亮度,又能产生漂亮的阴影层次。
逆光:危险的边缘,也是大片诞生的地方
逆光是所有光位中最有戏剧性的,也最容易出错。光线从被摄体背后照来,正面对着相机,这时候被摄体的正面处于阴影中,而边缘却被光线勾勒出明亮的轮廓。
逆光拍人像,如果不做任何补偿,人物的脸会是一片死黑。但如果你学会使用反光板、闪光灯或者后期提亮,逆光能拍出那种发丝发光、轮廓迷人的效果。很多婚纱摄影、艺术人像都偏爱逆光。
逆光的另一个强大应用是拍摄剪影。当背景足够亮(比如夕阳、天空),而前景足够暗时,你只需要对着亮部测光,让前景完全曝光不足,一个简洁有力的剪影就出来了。
# 逆光拍摄时的曝光参数模拟
# 假设背景亮度为1000 lux,人物面部亮度为100 lux(因为背光)
background_lux = 1000 # 背景光照度
subject_lux = 100 # 主体光照度(逆光下)
# 正确的曝光应该针对背景,此时主体会欠曝
# 相机测光系统会让画面整体趋向于18%灰
# 如果针对背景正确曝光
exposure_for_background = {
'aperture': 'f/8',
'shutter_speed': '1/250s',
'iso': 100,
' EV_correct_for_background': 0, # 背景曝光正确
' EV_correct_for_subject': -3, # 主体欠曝3档(剪影效果)
}
# 如果针对主体正确曝光
exposure_for_subject = {
'aperture': 'f/8',
'shutter_speed': '1/30s', # 需要慢4倍快门
'iso': 100,
' EV_correct_for_background': +3, # 背景过曝3档(死白)
' EV_correct_for_subject': 0, # 主体曝光正确
}
print("逆光拍摄的两种曝光策略:")
print(f"策略一(拍剪影):背景曝光正常,主体欠曝{exposure_for_background[' EV_correct_for_subject']}档")
print(f"策略二(拍正面):主体曝光正常,背景过曝{exposure_for_subject[' EV_correct_for_background']}档")
print("\n关键技巧:使用点测光对准亮部(背景),锁定曝光后重新构图拍摄,即可获得完美剪影。")
逆光拍摄时,还有一个常见问题叫”眩光”——光线直接进入镜头,在画面上形成光斑或雾化效果。这听起来像是缺陷,但很多时候这正是逆光的魅力所在。很多电影摄影师故意使用老式镜头来制造眩光效果,因为现代镜头的镀膜太完美了,反而失去了那种梦幻感。
从光影到眼镜:光的折射如何帮我们看见世界
既然聊到了光,就不能不提光是怎么进入我们眼睛的。摄影和视力矫正,本质上都是在处理同一个问题:让光线准确地落在正确的位置上。
人眼的结构其实和照相机非常相似。角膜和晶状体相当于镜头, iris(虹膜)相当于光圈,视网膜相当于感光元件。问题是,每个人的”镜头”焦距不太一样。
近视的人,眼球太长或者晶状体折射力太强,光线聚焦在视网膜前面,看远处的东西就模糊了。远视的人则相反,眼球太短或者折射力太弱,光线聚焦在视网膜后面。散光则是角膜表面不規則,导致光线无法聚焦成一个点。
眼镜的作用,就是通过透镜的折射,把光线的焦点”搬”到视网膜上。
# 近视和远视的光学模拟
# 使用薄透镜公式:1/f = 1/v - 1/u
# 其中 f 是焦距,v 是像距,u 是物距
class EyeOptics:
def __init__(self, focal_length_cornea_lens=17, retina_distance=24):
# 角膜+晶状体的等效焦距约17mm
# 视网膜到晶状体的距离约24mm
self.normal_f = focal_length_cornea_lens
self.retina_dist = retina_distance
def calculate_image_distance(self, object_distance, lens_focal_length):
"""根据薄透镜公式计算像距"""
if object_distance == float('inf'):
# 无穷远物体,像距等于焦距
return lens_focal_length
else:
# 1/v = 1/f - 1/u
image_distance = 1 / (1/lens_focal_length - 1/object_distance)
return image_distance
def analyze_vision_type(self, eye_length, lens_power):
"""分析视力类型"""
# 正常眼:光线恰好聚焦在视网膜上
# 近视:光线聚焦在视网膜前(眼轴过长或折射过强)
# 远视:光线聚焦在视网膜后(眼轴过短或折射过弱)
# 假设看无穷远物体
image_dist = self.calculate_image_distance(float('inf'), lens_power)
if image_dist < eye_length:
return "近视 - 焦点落在视网膜前方"
elif image_dist > eye_length:
return "远视 - 焦点落在视网膜后方"
else:
return "正常视力 - 焦点恰好落在视网膜上"
def calculate_glasses_power(self, eye_length, current_focal_length):
"""计算需要的眼镜度数(屈光度)"""
# 目标:让光线经过眼镜后,焦点落在视网膜上
# 眼镜放在眼睛前方约12mm处
glasses_distance = 12 # mm,眼镜到角膜的距离
# 需要的等效焦距(考虑眼镜位置)
needed_focal_length = eye_length - glasses_distance
# 屈光度 D = 1/f(f 以米为单位)
power = 1 / (needed_focal_length / 1000)
# 实际上需要结合当前眼睛的折射能力来计算
# 简化模型:眼镜度数 = 需要的焦距倒数 - 当前焦距倒数
current_power = 1 / (current_focal_length / 1000)
glasses_power = power - current_power
return glasses_power
# 实例分析
eye = EyeOptics()
# 近视案例:眼轴26mm(正常24mm),折射力正常
myopia_result = eye.analyze_vision_type(eye_length=26, lens_power=17)
print(f"近视案例:{myopia_result}")
# 远视案例:眼轴22mm(正常24mm),折射力正常
hyperopia_result = eye.analyze_vision_type(eye_length=22, lens_power=17)
print(f"远视案例:{hyperopia_result}")
# 正常视力
normal_result = eye.analyze_vision_type(eye_length=24, lens_power=17)
print(f"正常案例:{normal_result}")
近视用凹透镜(发散透镜),让光线先发散再进入眼睛,等效于把焦点往后移;远视用凸透镜(会聚透镜),让光线先会聚再进入眼睛,等效于把焦点往前移。这就是为什么近视眼镜是中间薄边缘厚的,而老花镜是中间厚边缘薄的。
彩虹:大自然的光学魔术
你有没有想过,为什么彩虹总是出现在太阳的对面?为什么彩虹是弧形的?为什么外圈是红色、内圈是紫色?
答案藏在光的折射和反射里。
彩虹的形成需要三个条件:太阳、水滴、和观察者。当阳光射入水滴时,会发生折射(光线从空气进入水,速度变慢,方向改变),然后在水滴内壁发生反射,最后再次折射离开水滴。因为不同颜色的光在水中的折射率不同(红光折射最小,紫光折射最大),白光被分解成了七种颜色。
import numpy as np
import matplotlib.pyplot as plt
# 彩虹形成的光学模拟
# 使用斯涅尔定律:n1*sin(θ1) = n2*sin(θ2)
def snells_law(n1, theta1_degrees, n2):
"""计算折射角"""
theta1_rad = np.radians(theta1_degrees)
sin_theta2 = (n1 / n2) * np.sin(theta1_rad)
# 确保不发生全反射
if abs(sin_theta2) > 1:
return None
return np.degrees(np.arcsin(sin_theta2))
# 水的折射率(不同颜色略有差异)
refractive_indices = {
'red': 1.331, # 红光折射率最低
'orange': 1.333,
'yellow': 1.335,
'green': 1.337,
'blue': 1.340,
'violet': 1.344 # 紫光折射率最高
}
# 模拟光线在水滴中的路径
# 入射角从10度到80度变化
incident_angles = np.linspace(10, 80, 70)
# 计算每种颜色的偏转角
# 偏转角 = (入射角 - 折射角) + (反射角) + (出射折射角 - 折射角)
# 简化模型:一次内反射的彩虹偏转角
# 总偏转角 D = 180° + 2i - 4r (其中i是入射角,r是折射角)
results = {}
for color, n in refractive_indices.items():
deviations = []
for angle in incident_angles:
# 第一次折射(空气→水)
refracted_angle = snells_law(1.0, angle, n)
if refracted_angle is not None:
# 一次内反射后的总偏转角
deviation = 180 + 2*angle - 4*refracted_angle
deviations.append(deviation)
results[color] = deviations
# 找每种颜色的最小偏转角(这就是彩虹角)
print("彩虹角(最小偏转角):")
rainbow_angles = {}
for color, deviations in results.items():
min_deviation = min(deviations)
rainbow_angle = 180 - min_deviation # 观察角 = 180 - 偏转角
rainbow_angles[color] = rainbow_angle
print(f" {color}: 彩虹角 ≈ {rainbow_angle:.1f}°")
# 绘制彩虹角度分布
fig, ax = plt.subplots(figsize=(12, 6))
colors_list = ['red', 'orange', 'yellow', 'green', 'blue', 'violet']
for color in colors_list:
ax.plot(incident_angles, results[color], label=color, linewidth=2)
ax.set_xlabel('入射角 (度)', fontsize=12)
ax.set_ylabel('偏转角 (度)', fontsize=12)
ax.set_title('不同颜色光在水滴中的偏转角度变化', fontsize=14, fontweight='bold')
ax.legend(loc='upper right')
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('rainbow_optics.png', dpi=150, bbox_inches='tight')
plt.show()
print("\n关键结论:")
print("1. 红光偏转角最小(约137°),观察角最大(约42°)→ 出现在彩虹最外圈")
print("2. 紫光偏转角最大(约139°),观察角最小(约40°)→ 出现在彩虹最内圈")
print("3. 所有颜色的最小偏转角都非常接近,形成明显的亮带(彩虹)")
print("4. 观察角在40-42度之间,所以彩虹总是出现在太阳对面42度左右的位置")
这个计算告诉我们,彩虹本质上是一个”聚焦”现象。当太阳光以特定角度射入大量水滴时,每种颜色的光都有一个最小偏转角,在这个角度附近光线最集中,我们就看到了明亮的彩色光带。
彩虹的弧形也是因为这个原因:只有那些恰好在你和太阳连线成42度角的水滴才会把光反射到你的眼睛。这些水滴连起来就是一个圆弧形。如果你站在高处(比如飞机上),理论上可以看到完整的圆形彩虹。
日食:月亮的影子划过大地
日食是另一个可以用光学原理解释的自然奇观。当月亮运行到太阳和地球之间,三者几乎在一条直线上时,月亮的影子就会投射到地球表面,处于影子区域的人就能看到日食。
# 日食模拟
# 计算影子的大小和移动速度
class SolarEclipse:
def __init__(self):
# 天体参数(简化模型)
self.sun_radius = 696340 # km
self.earth_radius = 6371 # km
self.moon_radius = 1737 # km
self.sun_earth_distance = 149600000 # km
self.moon_earth_distance = 384400 # km
# 月亮的轨道速度(约1 km/s)
self.moon_orbital_speed = 1.02 # km/s
def calculate_shadow_size(self):
"""计算本影和半影的大小"""
# 本影锥长度
# 使用相似三角形原理
# (R_sun - R_moon) / L = R_sun / (D + L)
# 其中 L 是本影长度,D 是月地距离
R_s = self.sun_radius
R_m = self.moon_radius
D = self.moon_earth_distance
# 本影长度 L = R_m * D / (R_s - R_m)
umbra_length = R_m * D / (R_s - R_m)
# 判断日食类型
if umbra_length > D:
eclipse_type = "日全食" # 本影能到达地球表面
umbra_radius_at_earth = R_m - (D * (R_s - R_m) / R_s)
elif umbra_length < D:
eclipse_type = "日环食" # 本影锥尖端在地球之前
# 此时没有本影到达地面,只有伪本影
umbra_radius_at_earth = 0 # 本影不接触地面
else:
eclipse_type = "日全食(恰好)" # 全环食
umbra_radius_at_earth = 0
# 半影大小
penumbra_radius = R_m + D * (R_s + R_m) / (R_s - R_m) * (R_s - R_m) / R_s
# 简化:半影在地面的半径约在地面处张角决定
return {
'eclipse_type': eclipse_type,
'umbra_length_km': umbra_length,
'umbra_radius_at_earth_km': umbra_radius_at_earth if 'umbra_radius_at_earth' in dir() else 0,
'penumbra_radius_km': 2000 # 半影覆盖范围约2000km
}
def calculate_shadow_speed(self):
"""计算影子在地面的移动速度"""
# 月亮本影在地面的移动速度 ≈ 月亮轨道速度 + 地球自转速度
# 地球自转线速度在赤道约0.46 km/s
earth_rotational_speed_equator = 0.465 # km/s
moon_speed = self.moon_orbital_speed # km/s
# 影子移动速度(月亮和地球自转同向)
shadow_speed = moon_speed + earth_rotational_speed_equator
return shadow_speed
# 运行模拟
eclipse = SolarEclipse()
shadow_info = eclipse.calculate_shadow_size()
shadow_speed = eclipse.calculate_shadow_speed()
print(f"日食参数分析:")
print(f" 本影长度: {shadow_info['umbra_length_km']:.0f} km")
print(f" 日食类型: {shadow_info['eclipse_type']}")
print(f" 本影在地面的半径: {shadow_info['umbra_radius_at_earth_km']:.0f} km")
print(f" 半影覆盖范围: 约{shadow_info['penumbra_radius_km']:.0f} km")
print(f" 影子在地面的移动速度: 约{shadow_speed:.2f} km/s ({shadow_speed*3600:.0f} km/h)")
print("\n有趣的事实:")
print("1. 日全食时,本影在地面形成的路径宽度约100-250公里")
print("2. 影子以约1700-3000 km/h的速度从西向东移动")
print("3. 日全食的持续时间最长约7.5分钟,通常只有2-3分钟")
print("4. 月亮的视直径和太阳的视直径非常接近(约0.5度),这是巧合")
日食的形成原理其实和手电筒照一个球体在墙上投下影子是一个道理。月亮的本影是一个锥形区域,当这个锥形的尖端碰到地球表面时,处于这个区域的人就看到日全食。如果本影锥的尖端还没到地球就已经结束了(月亮离地球较远时),就会形成日环食——月亮遮不住整个太阳,留下一圈明亮的光环。
从相机到眼睛,从彩虹到日食:光的统一叙事
回到最开始的问题:为什么有人能拍出大片,有人只能拍出废片?
答案不只是”会用光”三个字。真正的高手理解光从哪里来、往哪里去、遇到东西会怎样。顺光时知道如何利用均匀照明突出色彩,侧光时知道如何用阴影塑造立体感,逆光时知道如何用剪影创造戏剧性。
而这些摄影技巧背后的原理,和眼镜矫正视力、彩虹的形成、日食的奇观,用的是同一套物理定律——光的直线传播、折射、反射。光在不同介质界面改变方向,不同颜色的光折射率不同,这些原理既决定了你的照片是好是坏,也决定了你能否清晰地看见世界,以及天空中为什么会突然出现彩虹和日食。
下次你举起相机时,不妨先问自己一个问题:光从哪里来?这个问题的答案,可能就藏着你下一张大片。
