30分钟掌握Manim空间运算:从坐标变换到向量动画实战指南

30分钟掌握Manim空间运算:从坐标变换到向量动画实战指南

【免费下载链接】manim Animation engine for explanatory math videos 【免费下载链接】manim 项目地址: https://gitcode.com/GitHub_Trending/ma/manim

你还在为数学动画中的几何变换代码头痛?还在向量运算中反复调试坐标参数?本文将通过6个核心场景案例,带你零基础掌握Manim空间运算引擎的使用技巧,读完就能独立制作包含坐标系变换、向量场可视化和复杂几何动画的视频内容。

空间运算核心模块速览

Manim的空间运算功能主要集中在两个核心模块,提供从基础坐标转换到高阶向量操作的完整支持:

功能类别核心模块路径关键功能
坐标系统manimlib/mobject/coordinate_systems.py2D/3D坐标系创建、坐标轴刻度定制
向量运算manimlib/mobject/vector_field.py向量场生成、场强可视化
空间变换manimlib/utils/space_ops.py点积计算、坐标旋转、空间投影
几何对象manimlib/mobject/geometry.py可变换图形基类、形状操作接口

Manim空间运算模块架构

从零创建坐标系

创建自定义坐标系是空间运算的基础,通过Axes类可快速实现个性化坐标系统:

from manimlib import *

class CustomCoordinateSystem(Scene):
    def construct(self):
        # 创建带网格的坐标系
        axes = Axes(
            x_range=[-10, 10, 2],  # 范围与刻度间隔
            y_range=[-6, 6, 1],
            axis_config={
                "color": BLUE,
                "include_tip": True,  # 坐标轴箭头
                "numbers_to_exclude": [0]  # 排除原点数字
            }
        )
        # 添加坐标系标签
        labels = axes.get_axis_labels(x_label_tex="x", y_label_tex="y")
        self.add(axes, labels)
        self.wait(2)

这段代码会生成包含网格线和标签的二维坐标系,所有参数均可通过coordinate_systems.py中定义的Axes类进行定制。

三大几何变换实战

Manim提供直观的几何变换API,支持平移、旋转和缩放三大基础操作,所有变换均可通过链式调用组合:

1. 平移变换

square = Square(color=RED).shift(RIGHT * 2 + UP * 1)  # 向右2单位+向上1单位

2. 旋转变换

rotated_square = square.rotate(PI/4, about_point=ORIGIN)  # 绕原点旋转45度

3. 缩放变换

scaled_square = square.scale(0.5, scale_x=2)  # x轴缩放2倍,y轴缩放0.5倍

所有变换方法均定义在geometry.pyPolygon基类中,支持对任意几何对象进行操作。

向量场可视化全攻略

向量场是展示空间向量分布的强大工具,通过VectorField类可实现数学函数的动态可视化:

def vector_field_func(p):
    x, y, z = p
    return np.array([-y, x, 0])  # 旋转向量场公式

class VectorFieldExample(Scene):
    def construct(self):
        field = VectorField(
            vector_field_func,
            x_range=[-5, 5, 1],
            y_range=[-5, 5, 1],
            color=GREEN
        )
        self.add(field)
        # 添加运动粒子展示场线
        particle = Dot(color=RED).move_to(LEFT * 3)
        self.add(particle)
        self.play(MoveAlongPath(particle, field.get_stream_lines()[0]), run_time=4)

这段代码实现了一个逆时针旋转的向量场,配合粒子运动直观展示场线分布。向量场的核心算法在vector_field.py中实现,支持自定义场强计算函数。

3D空间运算进阶技巧

Manim的三维空间运算通过ThreeDScene实现,支持3D坐标系旋转和透视变换:

class ThreeDCoordinateSystem(ThreeDScene):
    def construct(self):
        axes = ThreeDAxes()
        self.set_camera_orientation(phi=75 * DEGREES, theta=30 * DEGREES)
        self.add(axes)
        
        # 绘制三维函数图像
        surface = ParametricSurface(
            lambda u, v: np.array([
                np.cos(u) * (3 + np.cos(v)),
                np.sin(u) * (3 + np.cos(v)),
                np.sin(v)
            ]), u_range=[0, 2*PI], v_range=[0, 2*PI]
        )
        self.add(surface)
        self.begin_ambient_camera_rotation(rate=0.5)  # 自动旋转视角
        self.wait(6)

三维空间的核心变换逻辑在three_dimensions.py中实现,配合camera.py可实现专业级的3D视角控制。

实战案例:物理运动模拟

综合运用空间运算功能,我们可以创建包含重力场、速度向量和轨迹追踪的物理模拟动画:

class ProjectileMotion(Scene):
    def construct(self):
        axes = Axes(x_range=[0, 10], y_range=[0, 5])
        self.add(axes)
        
        # 轨迹计算(忽略空气阻力)
        def trajectory(x):
            return -0.1*x**2 + x  # 抛物线方程
        
        # 创建轨迹曲线
        curve = axes.get_graph(trajectory, color=BLUE)
        self.add(curve)
        
        # 模拟抛射体运动
        projectile = Dot(color=RED)
        self.add(projectile)
        self.play(MoveAlongPath(projectile, curve), run_time=3)
        
        # 添加速度向量
        velocity_vector = Vector(RIGHT + UP, color=GREEN).next_to(projectile)
        self.add(velocity_vector)

这个案例结合了numbers.py的数值计算功能和vector_field.py的向量表示能力,完整实现了物理运动的可视化模拟。

常用空间运算API速查表

掌握这些核心API可解决90%的空间运算场景需求:

完整API文档可参考官方手册docs/source/documentation/utils/index.rst,更多示例场景在example_scenes.py中提供。

通过本文介绍的空间运算技巧,你可以轻松实现从简单几何变换到复杂物理模拟的各类数学动画。收藏本文,下次制作数学可视化视频时直接对照案例修改参数即可快速上手。关注我们,下一期将带来Manim粒子系统与流体动画的高级实现教程。

【免费下载链接】manim Animation engine for explanatory math videos 【免费下载链接】manim 项目地址: https://gitcode.com/GitHub_Trending/ma/manim

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

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

抵扣说明:

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

余额充值