边学边做Manim三维场景设计

Manim中,ThreeDScene是一个专门为三维场景设计的类。它通过配置三维相机、支持复杂的相机运动以及管理物体与相机的交互关系,为科学可视化工程仿真数学教育等领域提供了强大的工具。典型应用场景包括:

  1. 三维几何图形的动态演示(如旋转立方体、莫比乌斯环)
  2. 物理过程的三维可视化(如分子运动、流体动力学)
  3. 交互式数学模型的构建(如曲面方程、向量场分析)
  4. 虚拟现实场景的原型开发

1. ThreeDScene概要

ThreeDSceneManim中用于处理三维场景的核心类。与普通的二维场景不同,ThreeDScene提供了对三维空间的全面支持,包括:

  1. 三维对象的创建和操作:可以轻松地在三维空间中放置和移动对象
  2. 相机的自由移动和旋转:通过调整相机的位置和方向,可以实现多种视角和动画效果
  3. 固定对象的显示:某些对象可以被设置为固定在相机帧中,即使相机移动,这些对象也不会改变位置或方向。

1.1. 主要参数

ThreeDScene继承自Scene,所有Scene的参数都适用于ThreeDScene

参数名称 类型 说明
camera_class Camera 指定使用的相机类,默认为ThreeDCamera。这个参数决定了相机的行为和特性
ambient_camera_rotation 设置相机的环境旋转。可以指定旋转的速率和方向
default_angled_camera_orientation_kwargs 设置默认的相机倾斜角度和其他相关参数

1.2. 主要方法

ThreeDScene提供了一系列方法,用于控制相机和对象的行为:

名称 说明
add_fixed_in_frame_mobjects 将指定的对象固定在相机帧中,即使相机移动,这些对象也不会改变位置或方向
add_fixed_orientation_mobjects 将指定的对象固定在相机的方向上,即使相机旋转,这些对象也不会改变方向
begin_3dillusion_camera_rotation 开始一个三维相机旋转的动画效果,可以通过参数控制旋转的速率和方向
begin_ambient_camera_rotation 开始一个环境相机旋转,通常围绕 Z 轴旋转
move_camera 动画化地移动相机到指定的球坐标位置
set_camera_orientation 设置相机的当前方向
stop_3dillusion_camera_rotation 停止所有三维相机旋转的动画效果
stop_ambient_camera_rotation 停止环境相机旋转

2. 使用示例

以下是四个能够展示ThreeDScene特点的动画示例,每个示例都突出了ThreeDScene的独特功能。

2.1. 旋转的立方体

在这个示例中,我们创建了一个立方体,并使用begin_3dillusion_camera_rotation方法让相机围绕立方体旋转,同时立方体自身也在旋转。这种双重旋转效果展示了ThreeDScene在处理复杂三维动画时的强大能力。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from manim import *

class ThreeDSceneExampleCube(ThreeDScene):
def construct(self):
"""旋转的立方体"""
# 创建立方体
cube = Cube(side_length=2, fill_color=BLUE, fill_opacity=0.7)
# 设置相机初始角度
self.set_camera_orientation(phi=75 * DEGREES, theta=30 * DEGREES)
# 将立方体添加到场景
self.play(Create(cube))
# 开始相机旋转(产生3D幻觉)
self.begin_3dillusion_camera_rotation(rate=0.1)
# 让立方体绕RIGHT轴旋转
self.play(Rotate(cube, axis=RIGHT, angle=2 * PI), run_time=5)
# 停止相机旋转
self.stop_3dillusion_camera_rotation()
# 等待一会儿
self.wait()

2.2. 固定在相机帧中的文本

这个示例展示了如何使用add_fixed_in_frame_mobjects方法将文本固定在相机帧中。即使相机旋转,文本始终保持在屏幕的左上角,不会受到相机运动的影响。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from manim import *

class ThreeDSceneExampleText(ThreeDScene):
def construct(self):
"""固定在相机帧中的文本"""
# 创建3D坐标轴
axes = ThreeDAxes()
# 创建文本 - 固定在相机帧中,不会随3D旋转
text = Text("固定的 文本内容", font_size=48, color=GREEN).to_corner(ORIGIN)
self.add_fixed_in_frame_mobjects(text)
self.play(Create(axes)) # 修正了括号
self.wait()
# 设置相机视角
self.set_camera_orientation(phi=75 * DEGREES, theta=30 * DEGREES)
self.begin_3dillusion_camera_rotation(rate=0.5)
self.wait(3)
self.stop_3dillusion_camera_rotation()

2.3. 动态调整相机视角

在这个示例中,我们使用move_camera方法动态调整相机的视角。通过指定新的球坐标位置,相机平滑地移动到新的视角,展示了ThreeDScene在相机动画方面的灵活性。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from manim import *

class ThreeDSceneExamplesphere(ThreeDScene):
def construct(self):
"""动态调整相机视角"""
# 创建球体
sphere = Sphere(radius=2, fill_color=RED, fill_opacity=0.7)
# 添加球体到场景
self.play(Create(sphere))
self.wait(2)
# 设置初始相机视角
self.set_camera_orientation(phi=75 * DEGREES, theta=30 * DEGREES)
self.wait(2) # 短暂等待,让观众看到初始视角
# 动态移动相机到新视角
self.move_camera(
phi=30 * DEGREES, # 垂直角度
theta=120 * DEGREES, # 水平角度
run_time=3 # 动画持续3秒
)
# 等待观察最终视角
self.wait(3)

2.4. 固定方向的对象

这个示例展示了如何使用add_fixed_orientation_mobjects方法固定对象的方向。即使相机旋转,箭头始终保持指向右侧,不会随着相机的旋转而改变方向。

1
2
3
4
5
6
7
8
9
10
11
12
from manim import *

class ThreeDSceneExampleArrow(ThreeDScene):
def construct(self):
axes = ThreeDAxes()
arrow = Arrow3D(start=ORIGIN, end=RIGHT * 3, color=GREEN)
self.add_fixed_orientation_mobjects(arrow)
self.add(axes)
self.set_camera_orientation(phi=75 * DEGREES, theta=30 * DEGREES)
self.begin_3dillusion_camera_rotation(rate=0.5)
self.wait(3)
self.stop_3dillusion_camera_rotation()

这次3D渲染,让我真正理解了电脑配置的重要性,最后一个视频的渲染,我的老电脑要两个来钟头,朋友的电脑十来分钟,所以说Manim日常玩玩就算了,真要想着高深的研究,做出自媒体绚丽的动画,真的需要好电脑。