菜单

Mobject 系统

相关源文件

Mobject(Mathematical Object)系统是 ManimGL 中所有视觉元素的基础构建块。本页面将解释 mobject 的核心架构、它们的层级结构、数据结构以及渲染方式。有关特定 mobject 类型(如文本或 3D 对象)的信息,请参阅 处理 Mobjects

Mobject 层级结构

来源:manimlib/mobject/mobject.py64-895 manimlib/mobject/types/vectorized_mobject.py60-186 manimlib/mobject/types/point_cloud_mobject.py17-52 manimlib/mobject/types/surface.py28-70

基础 Mobject

Mobject 类是整个系统的基础。它定义了:

  1. 数据存储结构
  2. 用于操作点和数据的类方法
  3. 族结构(子 mobject)
  4. 样式和变换的接口
  5. 渲染能力

数据结构

每个 mobject 将其数据存储在结构化的 NumPy 数组中,具体数据类型取决于 mobject 的类型。

来源:manimlib/mobject/mobject.py72-75 manimlib/mobject/types/vectorized_mobject.py61-69 manimlib/mobject/types/point_cloud_mobject.py17-52 manimlib/mobject/types/surface.py28-70

基础 Mobject 的数据结构包含:

  • point:mobject 中每个点的 3D 坐标
  • rgba:每个点的颜色(RGB)和透明度(A)值

VMobject 在此基础上扩展了更多属性,例如描边和填充属性,而 PMobject 和 Surface 等其他类型则拥有其专用的数据结构。

族结构

Mobjects 以层级结构组织,具有父子关系。

关键概念:

  • submobjects:此 mobject 包含的子 mobject 列表
  • parents:包含此 mobject 的父 mobject 列表
  • family:层级结构中的所有 mobject(自身 + 所有子 mobject 的递归集合)

用于操作族结构的方法

  • add(*mobjects):将 mobjects 添加为子 mobject
  • remove(*mobjects):移除子 mobject
  • get_family(recursive=True):获取族中的所有 mobject

来源:manimlib/mobject/mobject.py98-103 manimlib/mobject/mobject.py423-485

VMobject (Vectorized Mobject)

VMobject(Vectorized Mobject)通过更复杂的矢量图形功能扩展了基础 Mobject。VMobjects 使用二次贝塞尔曲线定义其形状。

VMobjects 中的点结构

VMobjects 使用二次贝塞尔曲线表示形状,其中:

  • 点存储在扁平化数组中
  • 每三个连续的点定义一条贝塞尔曲线
  • 模式是:锚点、控制点、锚点、控制点、锚点……

来源:manimlib/mobject/types/vectorized_mobject.py443-456 manimlib/mobject/types/vectorized_mobject.py733-739

样式特性

VMobject 包含更高级的样式功能:

属性描述方法
填充 (Fill)内部颜色和透明度set_fill(color, opacity)
描边边框颜色、宽度和透明度set_stroke(color, width, opacity)
连接类型线段连接处的渲染方式set_joint_type("auto"/"bevel"/"miter")
平滑度曲线插值方式make_smooth(), make_jagged()

来源:manimlib/mobject/types/vectorized_mobject.py159-197 manimlib/mobject/types/vectorized_mobject.py398-410

路径操作

VMobject 提供用于操作路径的方法

  • add_line_to(point):向点添加直线
  • add_cubic_bezier_curve_to():添加三次贝塞尔曲线
  • add_quadratic_bezier_curve_to():添加二次贝塞尔曲线
  • add_smooth_curve_to():添加具有连续切线的曲线
  • close_path():关闭当前路径

来源:manimlib/mobject/types/vectorized_mobject.py505-587

PMobject (Point Mobject)

PMobject(Point Mobject)是 Mobject 的简化版本,专为基于点的图形(如 DotCloud)而设计。与 VMobjects 不同,PMobjects 没有曲线结构,而是表示离散的点。

主要功能

  • 更简单的数据结构,侧重于点和颜色
  • 用于添加和操作单个点的方法
  • 主要用于点云和粒子效果

来源:manimlib/mobject/types/point_cloud_mobject.py17-52 manimlib/mobject/types/dot_cloud.py26-43

Surface

Surface 是一个专门用于 3D 表面的 Mobject。它使用参数化表示来创建 3D 形状。

主要功能

  • 由参数函数 uv_func(u, v) 定义,该函数将 2D 坐标映射到 3D 空间
  • 使用三角剖分进行渲染
  • 支持阴影和光照效果
  • 包括 ParametricSurfaceSphereTorus 等子类

来源:manimlib/mobject/types/surface.py28-70 manimlib/mobject/three_dimensions.py93-122

渲染管道

Mobjects 的渲染通过着色器系统处理,该系统为 OpenGL 渲染准备数据。

着色器系统

Mobjects 使用 ShaderWrapper 对象来管理它们的渲染

  1. ShaderWrapper:所有着色器包装器的基类
  2. VShaderWrapper:VMobjects 的专用包装器

着色器系统

  • 加载和编译 GLSL 着色器
  • 准备顶点缓冲区对象 (VBOs) 和顶点数组对象 (VAOs)
  • 管理用于控制视觉外观的 uniform 变量
  • 处理渲染图元(例如 TRIANGLES、TRIANGLE_STRIP、POINTS)

来源:manimlib/shader_wrapper.py34-62 manimlib/shader_wrapper.py220-243

渲染过程

整体渲染流程

  1. Mobject 的数据被准备并存储在其数据结构中。
  2. 当 Camera 捕获 mobject 时,它会根据需要初始化一个 ShaderWrapper。
  3. ShaderWrapper 准备 OpenGL 对象(着色器、VBO、VAO)。
  4. Camera 设置 uniform 变量,如视图矩阵和光照。
  5. ShaderWrapper 将 mobject 渲染到 Camera 的帧缓冲区。
  6. Camera 处理帧缓冲区以生成最终图像。

来源:manimlib/camera/camera.py225-237 manimlib/shader_wrapper.py194-205

关键操作和变换

点操作

操作点的核心方法

方法描述
set_points(points)设置所有点
append_points(new_points)在末尾添加点
apply_points_function(func)将函数应用于所有点
get_center()获取中心点
get_all_points()获取所有点(包括子 mobject)

来源:manimlib/mobject/mobject.py232-269 manimlib/mobject/mobject.py316-332

转换

变换 mobjects 的方法

方法描述
shift(vector)按向量移动
scale(factor)按比例缩放
rotate(angle, axis)围绕轴旋转
flip(axis)沿轴翻转
stretch(factor, dim)沿维度拉伸
move_to(point)移动到特定点
align_to(mobject, direction)与另一个 mobject 对齐

这些变换会修改mobject及其任何子mobject的点。

来源: manimlib/mobject/mobject.py906-1071

颜色和样式

设置外观的方法

方法描述
set_color(color)设置颜色
set_opacity(opacity)设置透明度
set_stroke(color, width)设置描边属性 (VMobject)
set_fill(color, opacity)设置填充属性 (VMobject)
set_shading(factor)控制3D着色

来源: manimlib/mobject/mobject.py148-155 manimlib/mobject/types/vectorized_mobject.py159-197

子mobject管理

Mobjects可以以各种方式进行分组和排列

方法描述
add(*mobjects)添加子mobjects
remove(*mobjects)移除子mobjects
arrange(direction)将子mobjects排列成一行
arrange_in_grid(rows, cols)将子mobjects排列成网格
sort(key_func)对子mobjects进行排序
shuffle()随机重排子mobjects

来源: manimlib/mobject/mobject.py456-485 manimlib/mobject/mobject.py523-615

动画集成

Mobjects 被设计成可以与动画系统协同工作

  1. `.animate` 属性提供了一种通过方法调用创建动画的方式
  2. Updaters(更新器)允许进行连续动画和响应式行为
  3. 诸如 `interpolate` 和 `pointwise_become_partial` 之类的方法可以实现平滑过渡

来源: manimlib/mobject/mobject.py163-203 manimlib/mobject/mobject.py817-871

创建自定义Mobjects

要创建自定义Mobject

  1. 继承自适当的基类(Mobject, VMobject等)
  2. 重写 `init_points()` 来定义初始形状
  3. 添加用于专门行为的方法
  4. 可以选择重写其他方法,如 `get_color()` 或 `copy()`

对于VMobjects,关键在于使用 `set_points_as_corners()` 等方法或直接使用 `set_points()` 来定义代表锚点和控制点的点序列。

来源: manimlib/mobject/mobject.py151-153 manimlib/mobject/types/vectorized_mobject.py644-657

结论

Mobject系统是ManimGL的核心,为创建数学可视化提供了灵活而强大的基础。从简单的形状到复杂的矢量图形和3D表面,mobjects能够创建各种视觉元素,这些元素可以进行变换、动画处理并以高精度渲染。