时间:2025-03-16 09:21
人气:
作者:admin
在Manim中,ThreeDScene是一个专门为三维场景设计的类。
它通过配置三维相机、支持复杂的相机运动以及管理物体与相机的交互关系,为科学可视化、工程仿真、数学教育等领域提供了强大的工具。
典型应用场景包括:
ThreeDScene是Manim中用于处理三维场景的核心类。
与普通的二维场景不同,ThreeDScene提供了对三维空间的全面支持,包括:
ThreeDScene继承自Scene,所有Scene的参数都适用于ThreeDScene,
| 参数名称 | 类型 | 说明 |
|---|---|---|
| camera_class | Camera | 指定使用的相机类,默认为ThreeDCamera。这个参数决定了相机的行为和特性 |
| ambient_camera_rotation | 设置相机的环境旋转。可以指定旋转的速率和方向 | |
| default_angled_camera_orientation_kwargs | 设置默认的相机倾斜角度和其他相关参数 |
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 | 停止环境相机旋转 |
以下是四个能够展示ThreeDScene特点的动画示例,每个示例都突出了ThreeDScene的独特功能。
在这个示例中,我们创建了一个立方体,并使用begin_3dillusion_camera_rotation方法让相机围绕立方体旋转,同时立方体自身也在旋转。
这种双重旋转效果展示了ThreeDScene在处理复杂三维动画时的强大能力。
cube = Cube(side_length=2, fill_color=BLUE, fill_opacity=0.7)
self.set_camera_orientation(phi=75 * DEGREES, theta=30 * DEGREES)
self.begin_3dillusion_camera_rotation(rate=0.1)
self.play(Rotate(cube, axis=RIGHT, angle=2 * PI), run_time=5)
self.stop_3dillusion_camera_rotation()

这个示例展示了如何使用add_fixed_in_frame_mobjects方法将文本固定在相机帧中。
即使相机旋转,文本始终保持在屏幕的左上角,不会受到相机运动的影响。
axes = ThreeDAxes()
text = Text("固定的 文本内容", font_size=48).to_corner(UL)
self.add_fixed_in_frame_mobjects(text)
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()

在这个示例中,我们使用move_camera方法动态调整相机的视角。
通过指定新的球坐标位置,相机平滑地移动到新的视角,展示了ThreeDScene在相机动画方面的灵活性。
sphere = Sphere(radius=2, fill_color=RED, fill_opacity=0.7)
self.add(sphere)
self.set_camera_orientation(phi=75 * DEGREES, theta=30 * DEGREES)
self.move_camera(phi=30 * DEGREES, theta=120 * DEGREES, run_time=3)
self.wait()

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

文中的代码只是关键部分的截取,完整的代码共享在网盘中(threed.py),
下载地址: 完整代码 (访问密码: 6872)