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 * vu_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 马鞍面示例,展示了三维曲面和坐标系,并使用了旋转动画来增加视觉效果。

运行结果:

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部