1.ThreeDAxes
函数
ThreeDAxes
是 Manim 中用于创建三维坐标系的类。在manim中常用的三位坐标绘制函数是:
class ThreeDAxes(x_range=(-6, 6, 1), y_range=(-5, 5, 1), z_range=(-4, 4, 1),
x_length=10.5, y_length=10.5, z_length=6.5, z_axis_config=None,
z_normal=array([0., -1., 0.]), num_axis_pieces=20,
light_source=array([-7., -9., 10.]), depth=None, gloss=0.5, **kwargs)
下面是对该类及其参数的解释:
类及参数说明
-
x_range: 三维坐标系中 X 轴的范围,格式为 (起始值, 结束值, 步长)。默认为 (-6, 6, 1)。
-
y_range: 三维坐标系中 Y 轴的范围,格式同上。默认为 (-5, 5, 1)。
-
z_range: 三维坐标系中 Z 轴的范围,格式同上。默认为 (-4, 4, 1)。
-
x_length: X 轴的长度,默认为 10.5。
-
y_length: Y 轴的长度,默认为 10.5。
-
z_length: Z 轴的长度,默认为 6.5。
-
z_axis_config: 对 Z 轴的配置,通常用于设置轴的颜色、粗细等。
-
z_normal: 定义 Z 轴的“正向”方向,默认为
[0., -1., 0.]
,表示 Z 轴的正方向是负 Y 方向。 -
num_axis_pieces: 轴的细分数量,即轴上分割的部分数,默认为 20。
-
light_source: 光源的位置,影响阴影和光照效果设置,默认为
[-7., -9., 10.]
。 -
depth: 深度配置,用于定义坐标系的深度。缺省为 None。
-
gloss: 光泽度,影响表面的光泽度效果,默认为 0.5。
-
kwargs: 额外的关键字参数,允许传递其他配置。
示例1:
from manim import *
class ThreeDAxesExample1122(ThreeDScene):
def construct(self):
# 创建三维坐标系
axes = ThreeDAxes(
x_range=(-6, 6, 1), # X 轴范围,从 -6 到 6,步长为 1
y_range=(-5, 5, 1), # Y 轴范围,从 -5 到 5,步长为 1
z_range=(-4, 4, 1), # Z 轴范围,从 -4 到 4,步长为 1
x_length=10.5, # X 轴长度
y_length=10.5, # Y 轴长度
z_length=6.5, # Z 轴长度
z_axis_config={"color": BLUE}, # Z 轴颜色配置
z_normal=np.array([0., -1., 0.]), # Z 轴法向量配置
num_axis_pieces=20, # 每个坐标轴的分段数量
light_source=np.array([-7., -9., 10.]), # 光源位置
depth=None, # 深度信息,设置为 None 表示 2D 显示
gloss=0.5, # Glossiness (光泽度)设置,范围 0-1
).add_coordinates() # 添加坐标标记
# 添加坐标系到场景中
self.add(axes)
# 设置视角
self.set_camera_orientation(phi=75 * DEGREES, theta=30 * DEGREES) # 设置相机的旋转角度
# 可以添加一条三维曲线以展示三维坐标系
curve = ParametricFunction(
lambda t: axes.c2p(t, np.sin(t), np.cos(t)), # 使用参数方程生成三维曲线
t_range=np.array([-TAU, TAU]), # t 变量的范围,从 -2π 到 2π
color=YELLOW, # 曲线颜色
)
# 让曲线显示在三维空间中
self.play(Create(curve)) # 播放创建曲线的动画
self.wait(2) # 等待 2 秒
运行结果:
示例2:
from manim import *
class ThreeDAxesExample1123(ThreeDScene):
def construct(self):
# 创建三维坐标系
axes = ThreeDAxes(
x_range=(-6, 6, 1),
y_range=(-5, 5, 1),
z_range=(-4, 4, 1),
x_length=10.5,
y_length=10.5,
z_length=6.5,
z_axis_config={"color": BLUE},
num_axis_pieces=20,
).add_coordinates()
# 添加坐标系到场景中
self.add(axes)
# 创建坐标标签
x_label = MathTex("X").scale(0.7).next_to(axes.x_axis.get_end(), UP)
y_label = MathTex("Y").scale(0.7).next_to(axes.y_axis.get_end(), RIGHT)
z_label = MathTex("Z").scale(0.7).next_to(axes.z_axis.get_end(), OUT)
# 添加坐标系和标签到场景中
self.add(axes, x_label, y_label, z_label)
# 展示 XY 平面
self.set_camera_orientation(phi=90 * DEGREES, theta=0 * DEGREES)
self.wait(2)
# 过渡到 XZ 平面
self.move_camera(phi=0 * DEGREES, theta=0 * DEGREES, run_time=2)
self.wait(2)
# 过渡到 YZ 平面
self.move_camera(phi=90 * DEGREES, theta=90 * DEGREES, run_time=2)
self.wait(2)
# 结束场景
self.play(FadeOut(axes))
运行结果:
示例3:
from manim import *
class SaddleSurfaceScene(ThreeDScene):
def construct(self):
self.camera.background_color =GREEN_E
# 创建三维坐标系
axes = ThreeDAxes(
x_range=(-3, 3, 1),
y_range=(-3, 3, 1),
z_range=(-3, 3, 1),
x_length=6,
y_length=6,
z_length=4,
)
# 定义马鞍表面
surface = Surface(
lambda u, v: axes.c2p(u, v, u * v), # 马鞍表面方程
u_range=[-2, 2],
v_range=[-2, 2],
checkerboard_colors=[RED, GREEN], # 有效的颜色
resolution=(15, 15),
)
# 设置表面的阴影效果
surface.set_shade_in_3d(True)
# 添加到场景
self.add(axes, surface)
# 设置相机的观察角度
self.set_camera_orientation(phi=70 * DEGREES, theta=30 * DEGREES)
# 播放创建表面和坐标系的动画
self.play(Create(surface), FadeIn(axes))
# 共同围绕 z 轴旋转图形和坐标系
self.play(Rotate(VGroup(surface, axes), angle=2 * PI, axis=IN), run_time=8) # 围绕 Z 轴旋转 360 度
self.wait(2) # 等待 2 秒
这段代码是使用 Manim 库创建和可视化一个三维马鞍面(saddle surface)的动画。下面是对代码的逐行解释:
from manim import *
导入 Manim 库,使用它提供的功能来创建动画。
class SaddleSurfaceScene(ThreeDScene):
定义一个名为 SaddleSurfaceScene
的类,继承自 ThreeDScene
。这个类将实现生成三维场景的所有必要方法。
def construct(self):
定义 construct
方法,这是 Manim 中每个场景的主要创建方法。
self.camera.background_color = GREEN_E
设置场景的背景颜色为绿色(GREEN_E
是 Manim 中预定义的绿色)。
# 创建三维坐标系 axes = ThreeDAxes( x_range=(-3, 3, 1),
y_range=(-3, 3, 1), z_range=(-3, 3, 1), x_length=6, y_length=6, z_length=4, )
创建一个三维坐标系对象 axes
,指定 X、Y 和 Z 轴的范围、步长以及长度。这允许我们在三维空间中展示曲面。
# 定义马鞍表面
surface = Surface( lambda u, v: axes.c2p(u, v, u * v), # 马鞍表面方程
u_range=[-2, 2], v_range=[-2, 2],
checkerboard_colors=[RED, GREEN], # 有效的颜色 resolution=(15, 15), )
定义一个 Surface
对象 surface
,表示马鞍面。这里使用一个 lambda 函数来定义 Z 坐标的计算方式:u * v
。u_range
和 v_range
指定了表面在 U 和 V 方向的范围。checkerboard_colors
用于设置表面上的颜色,使其具有颜色效果,resolution
设置了图形的细度。
# 设置表面的阴影效果
surface.set_shade_in_3d(True)
为表面设置三维阴影效果,使其在光照变化时能呈现更好的视觉效果。
# 添加到场景
self.add(axes, surface)
将坐标系和马鞍面添加到场景中,使它们成为可视化的一部分。
# 设置相机的观察角度
self.set_camera_orientation(phi=70 * DEGREES, theta=30 * DEGREES)
设置相机的观察角度(phi
和 theta
分别表示从水平面向上和水平面的角度),以便以特定的视角观察马鞍面。
# 播放创建表面和坐标系的动画
self.play(Create(surface), FadeIn(axes))
使用动画播放功能,在场景中以动态的方式创建表面和渐显坐标系。
# 共同围绕 z 轴旋转图形和坐标系
self.play(Rotate(VGroup(surface, axes),
angle=2 * PI, axis=IN), run_time=8) # 围绕 Z 轴旋转 360 度
使用 Rotate
动画将马鞍面和坐标系组合在一起,围绕 Z 轴进行 360 度的旋转,动画持续 8 秒。
self.wait(2) # 等待 2 秒
等待 2 秒,让观众可以静止观察当前的动画效果。
总而言之,这段代码创建了一个动态的 3D 马鞍面示例,展示了三维曲面和坐标系,并使用了旋转动画来增加视觉效果。
运行结果: