Manim實現陰影特效
本文將詳細介紹如何在Manim中實現2D和3D陰影特效,提升動畫的視覺層次感和真實感。
1. 實現原理
Manim中的陰影特效主要通過創建對象副本、調整透明度、應用變換和模糊效果來實現。
下面我們將結合代碼詳細解析其實現原理。
1.1. 3D陰影實現原理
3D陰影效果更加復雜,需要考慮空間感和光影關系。
代碼中提供了兩種3D陰影實現:基礎版Shadow3D和增強版RealisticShadow3D。
class Shadow3D(Animation):
def __init__(
self,
mobject,
shadow_color=BLACK,
shadow_opacity=0.3,
blur_radius=0.1,
direction=DOWN + RIGHT,
distance=0.5,
sharpness=1.0,
**kwargs
):
# 創建陰影對象
self.shadow = mobject.copy()
self.shadow.set_color(shadow_color)
self.shadow.set_fill(opacity=shadow_opacity)
self.shadow.set_stroke(opacity=shadow_opacity)
# 設置陰影位置
shadow_offset = direction * distance
self.shadow.shift(shadow_offset)
# 使用單個對象和變換創建模糊效果
self.shadow_blur = None
if blur_radius > 0:
self.shadow_blur = self.shadow.copy()
scale_factor = 1.0 + (1.0 - sharpness) * 0.1
opacity_factor = 0.5 + (1.0 - sharpness) * 0.3
self.shadow_blur.scale(scale_factor)
self.shadow_blur.set_fill(opacity=shadow_opacity * opacity_factor)
self.shadow_blur.set_stroke(opacity=shadow_opacity * opacity_factor)
# 創建對象組
if self.shadow_blur:
self.shadow_group = VGroup(self.shadow_blur, self.shadow, mobject)
else:
self.shadow_group = VGroup(self.shadow, mobject)
super().__init__(self.shadow_group, **kwargs)
Shadow3D類在2D陰影的基礎上增加了銳度參數(sharpness)和模糊處理,通過調整縮放因子和透明度來模擬不同銳度的陰影效果。
值得注意的是,為了優化性能,代碼采用了單個對象和變換來創建模糊效果,而不是多個副本,大大減少了渲染開銷。
1.2. 增強版3D陰影實現
class RealisticShadow3D(Animation):
def __init__(
self,
mobject,
shadow_color=BLACK,
shadow_opacity=0.4,
blur_radius=0.2,
direction=DOWN + RIGHT,
distance=0.5,
light_source=3 * UP + 3 * RIGHT + 3 * OUT,
**kwargs
):
# 存儲光源位置
self.light_source = light_source
# 創建陰影對象和位置設置
self.shadow = mobject.copy()
self.shadow.set_color(shadow_color)
self.shadow.set_fill(opacity=shadow_opacity)
self.shadow.set_stroke(opacity=shadow_opacity)
shadow_offset = direction * distance
self.shadow.shift(shadow_offset)
# 模糊效果處理
self.shadow_blur = None
if blur_radius > 0:
self.shadow_blur = self.shadow.copy()
self.shadow_blur.scale(1.05) # 輕微放大
self.shadow_blur.set_fill(opacity=shadow_opacity * 0.7)
self.shadow_blur.set_stroke(opacity=shadow_opacity * 0.7)
# 創建對象組
if self.shadow_blur:
self.shadow_group = VGroup(self.shadow_blur, self.shadow, mobject)
else:
self.shadow_group = VGroup(self.shadow, mobject)
super().__init__(self.shadow_group, **kwargs)
RealisticShadow3D類進一步增強了3D陰影的真實感,主要特點是加入了光源位置參數(light_source),允許用戶更精確地控制陰影的投射方向和形狀,從而模擬出更真實的光照效果。
2. 使用示例
下面我們通過幾個具體場景來展示如何使用這些陰影特效。
2.1. 3D陰影效果示例
class Shadow3DExample(ThreeDScene):
def construct(self):
# 創建3D對象
cube = Cube(side_length=2, fill_opacity=0.8, fill_color=BLUE)
sphere = Sphere(radius=1, fill_opacity=0.8, fill_color=RED)
# 設置相機位置
self.set_camera_orientation(phi=75 * DEGREES, theta=-45 * DEGREES)
# 為3D對象添加陰影
cube_shadow = Shadow3D(
cube,
shadow_color=GRAY,
shadow_opacity=0.4,
blur_radius=0.1,
direction=DOWN + RIGHT,
distance=0.3,
)
sphere_shadow = Shadow3D(
sphere,
shadow_color=GRAY,
shadow_opacity=0.3,
blur_radius=0.15,
direction=DOWN + RIGHT,
distance=0.4,
)
# 添加到場景并播放動畫
self.add(cube_shadow.shadow_group)
self.add(sphere_shadow.shadow_group)
cube.shift(2 * LEFT)
sphere.shift(2 * RIGHT)
self.play(FadeIn(cube_shadow.shadow_group), FadeIn(sphere_shadow.shadow_group))
# 添加旋轉和移動動畫
self.play(
Rotate(cube_shadow.shadow_group, PI, axis=UP),
Rotate(sphere_shadow.shadow_group, PI, axis=RIGHT),
run_time=3,
)
self.play(
cube_shadow.shadow_group.animate.shift(UP),
sphere_shadow.shadow_group.animate.shift(DOWN),
run_time=2,
)
self.wait()

這個示例展示了如何在3D場景中使用陰影效果。通過設置相機位置和調整各種參數,可以創建出具有空間感的陰影效果。
代碼還演示了如何將陰影效果與其他動畫(如旋轉和移動)結合使用。
2.2. 真實感3D陰影效果示例
class RealisticShadow3DExample(ThreeDScene):
def construct(self):
# 創建3D對象
cone = Cone(base_radius=1, height=2, fill_opacity=0.8, fill_color=GREEN)
cylinder = Cylinder(radius=1, height=2, fill_opacity=0.8, fill_color=YELLOW)
# 設置相機位置
self.set_camera_orientation(phi=75 * DEGREES, theta=-45 * DEGREES)
# 為對象添加真實感3D陰影
cone_shadow = RealisticShadow3D(
cone,
shadow_color=GRAY,
shadow_opacity=0.5,
blur_radius=0.2,
direction=DOWN + RIGHT,
distance=0.4,
light_source=3 * UP + 3 * RIGHT + 3 * OUT,
)
cylinder_shadow = RealisticShadow3D(
cylinder,
shadow_color=GRAY,
shadow_opacity=0.4,
blur_radius=0.25,
direction=DOWN + 0.5 * RIGHT,
distance=0.5,
light_source=3 * UP + 2 * LEFT + 2 * OUT,
)
# 添加到場景并播放動畫
self.add(cone_shadow.shadow_group)
self.add(cylinder_shadow.shadow_group)
cone.shift(2 * LEFT)
cylinder.shift(2 * RIGHT)
self.play(
FadeIn(cone_shadow.shadow_group), FadeIn(cylinder_shadow.shadow_group)
)
# 添加旋轉和移動動畫
self.play(
Rotate(cone_shadow.shadow_group, PI, axis=UP),
Rotate(cylinder_shadow.shadow_group, PI, axis=RIGHT),
run_time=3,
)
self.play(
cone_shadow.shadow_group.animate.shift(UP),
cylinder_shadow.shadow_group.animate.shift(DOWN),
run_time=2,
)
self.wait()

這個示例展示了如何使用RealisticShadow3D類創建更真實的3D陰影效果。
通過設置不同的光源位置(light_source),可以為不同的3D對象創建符合物理規律的陰影效果。
3. 總結
3.1. 陰影特效的特點
- 多層次實現:提供了從簡單到復雜的多種陰影實現方式,適應不同場景需求。
- 參數化控制:所有陰影效果都提供了豐富的參數,如顏色、透明度、模糊半徑、方向、距離等,方便精細調整。
- 性能優化:通過使用單個對象和變換來創建模糊效果,而不是多個副本,大大提高了渲染效率。
- 3D支持:專門提供了3D陰影實現,支持在3D場景中創建具有空間感的陰影效果。
- 真實感增強:增強版的
RealisticShadow3D類考慮了光源位置,能夠創建更符合物理規律的陰影效果。
3.2. 使用場景
- 數學可視化:為幾何圖形添加陰影,增強視覺層次感,幫助觀眾更好地理解空間關系。
- 文字動畫:為標題和重點文字添加陰影效果,提高視覺沖擊力。
- 圖表展示:為數據圖表添加陰影,增強立體感和可讀性。
- 物理演示:模擬真實世界的光照和陰影效果,用于物理概念的講解。
- 藝術創作:利用多層陰影和不同參數組合,創建獨特的藝術效果。
通過本文介紹的陰影特效實現方法,您可以為Manim動畫添加更加生動、立體的視覺效果,提升動畫的專業度和觀賞性。
無論是教學演示、學術報告還是藝術創作,這些陰影特效都能為您的作品增添亮點。

浙公網安備 33010602011771號