30分钟掌握Manim空间运算:从坐标变换到向量动画实战指南
你还在为数学动画中的几何变换代码头痛?还在向量运算中反复调试坐标参数?本文将通过6个核心场景案例,带你零基础掌握Manim空间运算引擎的使用技巧,读完就能独立制作包含坐标系变换、向量场可视化和复杂几何动画的视频内容。
空间运算核心模块速览
Manim的空间运算功能主要集中在两个核心模块,提供从基础坐标转换到高阶向量操作的完整支持:
| 功能类别 | 核心模块路径 | 关键功能 |
|---|---|---|
| 坐标系统 | manimlib/mobject/coordinate_systems.py | 2D/3D坐标系创建、坐标轴刻度定制 |
| 向量运算 | manimlib/mobject/vector_field.py | 向量场生成、场强可视化 |
| 空间变换 | manimlib/utils/space_ops.py | 点积计算、坐标旋转、空间投影 |
| 几何对象 | manimlib/mobject/geometry.py | 可变换图形基类、形状操作接口 |
从零创建坐标系
创建自定义坐标系是空间运算的基础,通过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.py的Polygon基类中,支持对任意几何对象进行操作。
向量场可视化全攻略
向量场是展示空间向量分布的强大工具,通过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%的空间运算场景需求:
- 坐标转换:
axes.coords_to_point(x, y)coordinate_systems.py#L156 - 向量点积:
dot_product(v1, v2)space_ops.py#L42 - 旋转变换:
rotate_vector(vector, angle)space_ops.py#L89 - 距离计算:
distance_between_points(p1, p2)space_ops.py#L23
完整API文档可参考官方手册docs/source/documentation/utils/index.rst,更多示例场景在example_scenes.py中提供。
通过本文介绍的空间运算技巧,你可以轻松实现从简单几何变换到复杂物理模拟的各类数学动画。收藏本文,下次制作数学可视化视频时直接对照案例修改参数即可快速上手。关注我们,下一期将带来Manim粒子系统与流体动画的高级实现教程。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



