Manim中的三维对象类提供了丰富的工具,帮助开发者在三维空间中创建各种形状和场景。这些类包括基本的三维几何体,如立方体、球体、圆锥体等,以及一些更复杂的形状,如圆环面和参数化曲面。通过设置不同的参数,开发者可以自定义这些对象的大小、位置、颜色等属性,从而构建出复杂的三维场景。
以 Cube
类为例,它用于创建一个三维立方体。该类有几个重要的参数,包括 side_length
用于设置立方体的边长, fill_color
和 stroke_color
用于设置填充和边框的颜色,以及 stroke_width
用于设置边框的宽度。通过组合使用这些参数,开发者可以创造出形状各异的立方体。同时,Cube
类还提供了一些常用的方法,如 shift
、rotate
和scale
等,用于对立方体进行平移、旋转和缩放操作。
另一个例子是 Sphere
类,它用于创建三维球体。除了 fill_color
和 stroke_color
等基本参数外,Sphere
还有一个 radius
参数,用于设置球体的半径大小。通过调整这个参数,开发者可以创造出不同尺寸的球体。同时,Sphere
类还提供了 get_center
和 get_surface_points
等方法,用于获取球体的中心点坐标和表面点坐标,为后续的场景构建和动画设计提供便利。
1.Arrow3D
这个类用于创建三维箭头,由一个圆柱体线和一个圆锥体组成。可以通过设置长度、半径和箭头尖端的属性来自定义箭头
Arrow3D(start=array([-1., 0., 0.]), end=array([1., 0., 0.]), thickness=0.02,
height=0.3, base_radius=0.08, color=ManimColor('#FFFFFF'), **kwargs)
来解释 Arrow3D
类的各个参数:
start
: 箭头的起点坐标,是一个包含三个元素的 Numpy 数组,表示 x、y、z 三个坐标。end
: 箭头的终点坐标,也是一个三元素的 Numpy 数组。thickness
: 箭头主体的粗细,是一个浮点数,表示箭身的直径。height
: 箭头尖部的高度,是一个浮点数。base_radius
: 箭头尖部的底部半径,是一个浮点数。color
: 箭头的颜色,可以使用 Manim 预定义的颜色字符串,也可以使用 HEX 颜色码。
下面是一个使用 Arrow3D
类的示例代码:
from manim import *
class Example3DArrow01(ThreeDScene):
def construct(self):
# 设置场景视角
self.set_camera_orientation(phi=75 * DEGREES, theta=-45 * DEGREES)
axes = ThreeDAxes()
# 创建三维箭头
arrow = Arrow3D(
start=np.array([-1., 0., 0.]), # 起点坐标
end=np.array([3., 3, 3.]), # 终点坐标
thickness=0.02, # 箭身粗细
height=0.3, # 箭头高度
base_radius=0.08, # 箭头底部半径
color=ManimColor('#00FFFF') # 箭头颜色
)
# 将箭头添加到场景中
self.add(axes,arrow)
2.Cone
这个类用于创建圆锥体,通过设置高度和半径来定义。
Cone(base_radius=1, height=1, direction=array([0., 0., 1.]), show_base=False,
v_range=[0, 6.283185307179586], u_min=0, checkerboard_colors=False, **kwargs)
Cone
类的参数和一些相关的函数:
base_radius
: 圆锥底部的半径,是一个浮点数。height
: 圆锥的高度,是一个浮点数。direction
: 圆锥的方向,是一个包含三个元素的 Numpy 数组,表示 x、y、z 三个轴上的方向。show_base
: 是否显示圆锥的底面,是一个布尔值。v_range
: 圆锥纵向扫描的范围,是一个包含两个元素的列表,分别表示最小和最大值。u_min
: 圆锥横向扫描的最小角度,是一个浮点数。checkerboard_colors
: 是否使用棋盘格颜色,是一个布尔值。
1.func(u, v)
func(u, v)
函数用于计算圆锥表面上某个点的位置坐标。它接受两个参数 u
和 v
,分别表示圆锥的水平角度和垂直高度,返回该点的三维坐标。
2.get_direction()
get_direction()
函数用于获取圆锥的当前方向,返回一个包含三个元素的 Numpy 数组。
3.set_direction(direction)
set_direction(direction)
函数用于设置圆锥的方向,需要传入一个包含三个元素的 Numpy 数组。
下面是一个使用 Cone
类的示例代码:
from manim import *
class Example3DCone(ThreeDScene):
def construct(self):
# 设置场景视角
self.set_camera_orientation(phi=75 * DEGREES, theta=-45 * DEGREES)
axes = ThreeDAxes()
# 创建一个圆锥
cone = Cone(
base_radius=1,
height=1,
direction=np.array([2, 2,3]),
show_base=True,
checkerboard_colors=False
)
# 将圆锥添加到场景中
self.add(axes,cone)
# 改变圆锥的方向
cone.set_direction(np.array([0, 0., 5.]))
3.Cube
Cube: 这个类用于创建三维立方体,是一个由6个正方形面组成的规则多面体。
Cube(side_length=2, fill_opacity=0.75, fill_color=ManimColor('#58C4DD'),
stroke_width=0, **kwargs)
Cube
对象,具有以下参数:
-
side_length=2
: 立方体的边长为 2 个单位。 -
fill_opacity=0.75
: 立方体的填充不透明度为 0.75,即 75% 不透明。 -
fill_color=ManimColor('#58C4DD')
: 立方体的填充颜色为十六进制色码'#58C4DD'
。 -
stroke_width=0
: 立方体的边框宽度为 0,即没有边框。 -
**kwargs
: 这是一个关键字参数,它允许在创建Cube
对象时传递任何其他关键字参数,这些参数可能被Cube
类或其父类使用。
总的来说,这段代码创建了一个边长为 2 个单位,填充颜色为 '#58C4DD'
(一种浅蓝色),填充不透明度为 75%,并且没有边框的立方体对象。
示例
from manim import *
class CubeExample(ThreeDScene):
def construct(self):
self.set_camera_orientation(phi=75*DEGREES, theta=-45*DEGREES)
axes = ThreeDAxes()
cube = Cube(side_length=3, fill_opacity=0.7, fill_color=BLUE)
self.add(cube)
4.Cylinder
Cylinder 这个类用于创建圆柱体,可以通过设置高度、半径和方向来定义。
Cylinder(radius=1, height=2, direction=array([0., 0., 1.]),
v_range=[0, 6.283185307179586], show_ends=True, resolution=(24, 24), **kwargs)
Cylinder
对象,具有以下参数:
-
radius=1
: 圆柱体的半径为 1 个单位。 -
height=2
: 圆柱体的高度为 2 个单位。 -
direction=array([0., 0., 1.])
: 圆柱体的方向向量为[0, 0, 1]
,表示沿着 z 轴正方向。 -
v_range=[0, 6.283185307179586]
: 圆柱体的圆周方向上的角度范围从 0 到 2π(即 6.283185307179586)。 -
show_ends=True
: 表示圆柱体的顶端和底端将可见。 -
resolution=(24, 24)
: 圆柱体的网格分辨率为 24 × 24。 -
**kwargs
: 这是一个关键字参数,它允许在创建Cylinder
对象时传递任何其他关键字参数,这些参数可能被Cylinder
类或其父类使用。
示例:
from manim import *
class ExampleCylinder(ThreeDScene):
def construct(self):
axes = ThreeDAxes()
cylinder = Cylinder(radius=2, height=3)
self.set_camera_orientation(phi=75 * DEGREES, theta=30 * DEGREES)
self.add(axes, cylinder)
总的来说,这段代码创建了一个半径为 1 个单位,高度为 2 个单位,沿 z 轴正方向的圆柱体对象。该圆柱体的圆周方向上的角度范围从 0 到 2π,顶端和底端都可见,网格分辨率为 24 × 24。
5.Dot3D
Dot3D这个类用于创建三维球形点,可以作为三维场景中的一个点使用。
Dot3D(point=array([0., 0., 0.]), radius=0.08, color=ManimColor('#FFFFFF'),
resolution=(8, 8), **kwargs)
Dot3D
对象,具有以下参数:
-
point=array([0., 0., 0.])
: 三维点的坐标为[0, 0, 0]
。 -
radius=0.08
: 点的半径为 0.08 个单位。 -
color=ManimColor('#FFFFFF')
: 点的颜色为白色。 -
resolution=(8, 8)
: 点的网格分辨率为 8 × 8。 -
**kwargs
: 这是一个关键字参数,它允许在创建Dot3D
对象时传递任何其他关键字参数,这些参数可能被Dot3D
类或其父类使用。
总的来说,这段代码创建了一个位于三维坐标系原点 [0, 0, 0]
、半径为 0.08 个单位、颜色为白色、网格分辨率为 8 × 8 的三维点对象。
from manim import *
class Dot3DExample(ThreeDScene):
def construct(self):
self.set_camera_orientation(phi=75*DEGREES, theta=-45*DEGREES)
axes = ThreeDAxes()
dot_1 = Dot3D(point=axes.coords_to_point(0, 0, 1), color=RED)
dot_2 = Dot3D(point=axes.coords_to_point(2, 0, 0), radius=0.1, color=BLUE)
dot_3 = Dot3D(point=[0, 0, 0], radius=0.1, color=ORANGE)
self.add(axes, dot_1, dot_2,dot_3)
这些类提供了丰富的参数和方法,允许你自定义三维对象的外观和行为,如大小、颜色、方向等。利用这些类,你可以在Manim中创建复杂的三维场景和动画,用于可视化和探索各种数学概念和思想。