python动画:三维空间中创建各种形状和场景【上】

        Manim中的三维对象类提供了丰富的工具,帮助开发者在三维空间中创建各种形状和场景。这些类包括基本的三维几何体,如立方体、球体、圆锥体等,以及一些更复杂的形状,如圆环面和参数化曲面。通过设置不同的参数,开发者可以自定义这些对象的大小、位置、颜色等属性,从而构建出复杂的三维场景。

        以 Cube 类为例,它用于创建一个三维立方体。该类有几个重要的参数,包括 side_length 用于设置立方体的边长, fill_color 和 stroke_color 用于设置填充和边框的颜色,以及 stroke_width 用于设置边框的宽度。通过组合使用这些参数,开发者可以创造出形状各异的立方体。同时,Cube 类还提供了一些常用的方法,如 shiftrotatescale等,用于对立方体进行平移、旋转和缩放操作。

        另一个例子是 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 类的各个参数:

  1. start: 箭头的起点坐标,是一个包含三个元素的 Numpy 数组,表示 x、y、z 三个坐标。
  2. end: 箭头的终点坐标,也是一个三元素的 Numpy 数组。
  3. thickness: 箭头主体的粗细,是一个浮点数,表示箭身的直径。
  4. height: 箭头尖部的高度,是一个浮点数。
  5. base_radius: 箭头尖部的底部半径,是一个浮点数。
  6. 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 类的参数和一些相关的函数:

  1. base_radius: 圆锥底部的半径,是一个浮点数。
  2. height: 圆锥的高度,是一个浮点数。
  3. direction: 圆锥的方向,是一个包含三个元素的 Numpy 数组,表示 x、y、z 三个轴上的方向。
  4. show_base: 是否显示圆锥的底面,是一个布尔值。
  5. v_range: 圆锥纵向扫描的范围,是一个包含两个元素的列表,分别表示最小和最大值。
  6. u_min: 圆锥横向扫描的最小角度,是一个浮点数。
  7. 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 对象,具有以下参数:

  1. side_length=2: 立方体的边长为 2 个单位。

  2. fill_opacity=0.75: 立方体的填充不透明度为 0.75,即 75% 不透明。

  3. fill_color=ManimColor('#58C4DD'): 立方体的填充颜色为十六进制色码 '#58C4DD'

  4. stroke_width=0: 立方体的边框宽度为 0,即没有边框。

  5. **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 对象,具有以下参数:

  1. radius=1: 圆柱体的半径为 1 个单位。

  2. height=2: 圆柱体的高度为 2 个单位。

  3. direction=array([0., 0., 1.]): 圆柱体的方向向量为 [0, 0, 1],表示沿着 z 轴正方向。

  4. v_range=[0, 6.283185307179586]: 圆柱体的圆周方向上的角度范围从 0 到 2π(即 6.283185307179586)。

  5. show_ends=True: 表示圆柱体的顶端和底端将可见。

  6. resolution=(24, 24): 圆柱体的网格分辨率为 24 × 24。

  7. **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 对象,具有以下参数:

  1. point=array([0., 0., 0.]): 三维点的坐标为 [0, 0, 0]

  2. radius=0.08: 点的半径为 0.08 个单位。

  3. color=ManimColor('#FFFFFF'): 点的颜色为白色。

  4. resolution=(8, 8): 点的网格分辨率为 8 × 8。

  5. **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中创建复杂的三维场景和动画,用于可视化和探索各种数学概念和思想。

 

  • 18
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yasen.M

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值