)
ManimGL 3D 渲染完全指南摄像机系统、立体几何、参数曲面与光照实战OpenMontage 视频管线【免费下载链接】OpenMontageWorlds first open-source, agentic video production system. 12 production pipelines, 100 tools, 700 agent skill and production-knowledge files. Turn your AI coding assistant into a full video production studio.项目地址: https://gitcode.com/GitHub_Trending/op/OpenMontage本篇指南以 OpenMontage 仓库中 3D in ManimGL 技能规则为骨架系统讲解 3Blue1Brown 版 ManimGLmanimlib的 3D 能力。与 Manim CommunityManimCE不同ManimGL不要求专门的ThreeDScene子类任意普通Scene配合灵活的frame摄像机系统即可完成三维渲染。读完你将掌握frame.reorient()摄像机姿态控制、Sphere/Cube/Surface/Torus/Cylinder 等立体几何图元、贴图曲面、ThreeDAxes 坐标轴、fix_in_frame()固定 UI、光源与 Gloss/Shadow 材质以及一套可以直接照抄的完整 3D 场景工作流可直接用于制作数学科普与教学类动画。为什么在 OpenMontage 中使用 ManimGL 做 3DOpenMontage 将其 agentic 视频制作能力组织为一套技能skills体系其中 manimgl-best-practices 专门沉淀了 ManimGL 的创作规则并被 动画管线 相关角色如 scene-director、compose-director与 manim-usage.md 作为创作参考引用。在数学、物理、深度学习概念可视化等教学场景中三维空间直观呈现结构关系是最具表现力的形式之一。仓库中已经内置了大量可直接运行与二次开发的 3D 示例例如 bloch_sphere_3d.py布洛赫球量子态可视化、three_d_surfaces.py参数曲面、blocks_3d.py立体堆叠与 lorenz_attractor.py混沌吸引子配套的 3D 场景模板 与 参数曲面参考 则提供了拿来即改的起点。在把这些内容交给 ManimGL 运行前请先确认环境按 SKILL.md 所述安装的是manimglPyPI 包名而非社区版manim——两者 API 差异显著。ManimGL 3D 基础搭建创建 3D 对象3D 场景的核心是frame摄像机画面框普通Scene下即可获得from manimlib import * class Basic3DScene(Scene): def construct(self): # Get camera frame frame self.camera.frame # Set 3D orientation frame.reorient(20, 70) # theta, phi in degrees # Create 3D objects sphere Sphere(radius2) sphere.set_color(BLUE, opacity0.7) self.add(sphere)这里有一个值得注意的兼容细节规则文件 3d.md 中通过self.camera.frame获取摄像机框而技能总览 SKILL.md 明确指出 ManimGL 更常用self.frame直取同一对象self.frame与self.camera.frame在 ManimGL 中均指向相机框。在仓库示例 bloch_sphere_3d.py 中使用的正是frame self.frame随后调用frame.reorient(14, 76, 0)完成初始姿态。实际书写时两者可任选保持场景内统一即可。渲染与调试命令运行上述场景并输出视频可参照 模板头部的用法注释 与技能 CLI 规则# 渲染并预览 manimgl scene.py Basic3DScene # 写入视频文件 manimgl scene.py Basic3DScene -w # 低质量快速测试开发阶段强烈推荐 manimgl scene.py Basic3DScene -l # 在第 20 行处进入交互调试 manimgl scene.py Basic3DScene -se 203D 场景计算开销远高于 2D开发期请始终使用-l低质量模式或-se交互模式迭代最后再以高质量完整渲染。摄像机系统Camera Frame Controlframe.reorient()3D 视角的一等公民reorient()是控制 3D 摄像机朝向的首选方法。其完整签名为# frame.reorient(theta, phi, gamma0, centerORIGIN, height8)其中theta、phi、gamma的单位为角度degree。组合出常用视角# Front view frame.reorient(0, 0) # Isometric view frame.reorient(20, 70) # Top-down view frame.reorient(0, 90) # Side view frame.reorient(90, 90)代码注释把theta理解为绕 z 轴的水平角方位角phi为自 z 轴量起的极角——3D 模板 用theta: azimuthal / phi: polar做了一致说明reorient(20, 70)即略显斜俯视的等轴测风格默认角度。而 three_d_surfaces.md 中的注释reorient(-30, 70, 0) # phi, theta, gamma参数顺序标注略有出入——这正是源码文档常见的口头顺序差异实践时以不断渲染试看来校准你的预期视角为准。reorient也接受其余关键字center指定观察中心height指定视框高度等价于缩放。动画化摄像机运动class AnimatedCamera(Scene): def construct(self): frame self.camera.frame # Create object cube Cube() self.add(cube) # Animate camera rotation self.play(frame.animate.reorient(30, 60)) self.wait() # Continuous rotation frame.add_updater(lambda m, dt: m.increment_theta(0.2 * dt)) self.wait(10)两种动效各有适用场景self.play(frame.animate.reorient(...))适合剪辑式切镜add_updater让角度随每帧刷新持续累加适合环绕展示。Frame 方法速查# Set Euler angles frame.set_euler_angles(theta30*DEGREES, phi70*DEGREES) # Increment angles (useful for rotation) frame.increment_theta(10*DEGREES) frame.increment_phi(5*DEGREES) frame.increment_gamma(2*DEGREES) # Get current angles theta frame.get_theta() phi frame.get_phi()set_euler_angles/increment_*/get_theta/get_phi提供了比reorient更底层的读写接口前者适合需要精确读取当前欧拉角的逻辑如基于当前视角再偏移固定量后者的animate形式如frame.animate.increment_theta(360*DEGREES)则常被用于 360° 环绕动画。除角度增量外ManimGL 还提供了开箱即用的环境环绕参见 bloch_sphere_3d.pyframe.add_ambient_rotation(3 * DEG) # 每帧 3° 的持续环境旋转该示例还用frame.scale(...)、frame.set_height(...)调整视野范围并以vector.always.set_perpendicular_to_camera(frame)让矢量始终面向镜头广告牌效果这些都是构建旋转场景 始终可读标注的利器。3D 立体几何图元Sphere球体sphere Sphere( radius2, resolution(20, 20), # (u_resolution, v_resolution) colorBLUE ) sphere.set_opacity(0.7)resolution(u, v)决定经纬向网格密度低分辨率渲染快但棱角明显高分辨率平滑但开销大。地球贴图等精细场景建议提到(40, 40)见下文纹理章节。Cube立方体cube Cube( side_length2, colorGREEN, fill_opacity0.8 )Surface参数曲面# Parametric surface surface Surface( lambda u, v: np.array([u, v, u**2 v**2]), u_range(-2, 2), v_range(-2, 2), resolution(20, 20) )Surface接收一个把参数对(u, v)映射到空间点(x, y, z)的函数配合u_range/v_range/resolution即可描述任意形状。这是 3D 数学可视化的核心工具详见下文参数曲面专节。ManimGL 还提供别名ParametricSurface等价类在 模板 与 three_d_surfaces 参考 中两者混用。Torus环面torus Torus( r12, # Major radius r20.5, # Minor radius colorYELLOW )r1为主半径中心到管道轴线r2为次半径管道粗细。Cylinder圆柱cylinder Cylinder( height3, radius1, colorRED )3D 线段与平面图形# 3D Line line Line3D( start[-2, -2, -2], end[2, 2, 2], colorWHITE, width0.05 ) # 3D Disk disk Disk3D(radius1.5, colorPURPLE) # 3D Square square Square3D(side_length2, colorORANGE)纹理贴图曲面为 3D 对象添加纹理TexturedSurface允许把一张图片本地路径或 URL包裹到已有曲面上常用于地球仪、材质球等写实表现class TexturedSphere(Scene): def construct(self): frame self.camera.frame frame.reorient(20, 70) # Create sphere with texture sphere Sphere(radius2) # Apply texture from URL or local file textured_sphere TexturedSurface( surfacesphere, # Can use URL or local path image_filepath/to/texture.jpg ) self.add(textured_sphere) # Rotate camera self.play(frame.animate.increment_theta(360*DEGREES), run_time10)注意此处的用法同时给出两种传参形态——TexturedSurface(surfacesphere, image_file...)关键字形式与TexturedSurface(sphere, texture.jpg)位置形式在 模板 TexturedSphereTemplate 中均有示例位置形式第一个参数是曲面对象、第二个是图片源。地球贴图示例earth Sphere(radius2, resolution(40, 40)) textured_earth TexturedSurface( earth, https://upload.wikimedia.org/wikipedia/commons/thumb/4/4d/Whole_world_-_land_and_oceans.jpg/1280px-Whole_world_-_land_and_oceans.jpg )resolution提高到(40, 40)是为了让贴图采样更平滑使用远程 URL 时需要网络可用若在隔离环境或追求渲染确定性建议下载到本地后用本地路径替换。3D 坐标轴与参考平面ThreeDAxesaxes ThreeDAxes( x_range(-5, 5, 1), y_range(-5, 5, 1), z_range(-5, 5, 1), width10, height10, depth10 ) axes.add_coordinate_labels(font_size20)x_range/y_range/z_range遵循(min, max, step)三要素width/height/depth控制渲染尺度。仓库示例中常简写为ThreeDAxes((-1, 1), (-1, 1), (-1, 1))再整体scale(2.0)bloch_sphere_3d.py或省略步进ThreeDAxes(x_range(-3, 3), ...)见 complex scene 示例 下方完整代码。用 NumberPlane 充当 3D 参考面# XY plane xy_plane NumberPlane( x_range(-5, 5), y_range(-5, 5) ) # XZ plane (horizontal floor) xz_plane NumberPlane( x_range(-5, 5), y_range(-5, 5) ) xz_plane.rotate(90*DEGREES, axisRIGHT)因为 3D 场景中 z 轴常被当作高度把二维NumberPlane绕RIGHTx 轴旋转 90° 即得到水平地面。这也是 bloch_sphere_3d.py 中构造半透明参考网格的方法——它进一步用background_lines.set_stroke(opacity0.5)与faded_lines.set_stroke(opacity0.25)压暗网格避免干扰主体。若想让平面呈暗色地板 淡网格的 3D 舞台感还可用技能总览提到的self.set_floor_plane(xz)快速设定观察面。参数曲面进阶自建数学曲面参数曲面的表现力在于任意的(u, v) - (x, y, z)映射。抛物面与波浪面是最常用的两种# Paraboloid paraboloid Surface( lambda u, v: np.array([ u, v, u**2 v**2 ]), u_range(-2, 2), v_range(-2, 2), resolution(30, 30), colorBLUE ) # Wave surface wave Surface( lambda u, v: np.array([ u, v, np.sin(u) * np.cos(v) ]), u_range(-PI, PI), v_range(-PI, PI), resolution(40, 40) )three_d_surfaces.md 还收录了两类值得复用的参数化球面带经纬线用ParametricCurve沿固定phi画纬度圆与环面参数式((R r·cos v)·cos u, (R r·cos v)·sin u, r·sin v)以及经典鞍面z x² - y²与圆锥展开等变体可直接迁移。叠加网格线 SurfaceMeshSurfaceMesh让数学曲面呈现丝网结构突出参数化骨架# Create surface surface Sphere(radius2) # Add mesh overlay mesh SurfaceMesh(surface) mesh.set_stroke(BLUE, width1, opacity0.5) self.add(surface, mesh)注意mesh需要基于同一个 surface 对象构建二者叠加渲染即可获得实体 网格双重表达。set_stroke(WHITE, width0.5, opacity0.3)一类细线风格在 Complex 3D 场景 中作为呈现 sinc 函数z sin(√(x²y²))波纹结构的关键手法出现。让 UI 元素固定在画面中fix_in_frame()摄像机旋转时3D 对象会随之转动但标题、说明文字这类 2D UI 不应跟着漂走。fix_in_frame()正是为此而生——它将 mobject 固定在屏幕空间class FixedLabels(Scene): def construct(self): frame self.camera.frame frame.reorient(20, 70) # 3D object that rotates with camera cube Cube() self.add(cube) # 2D title that stays fixed title Text(3D Cube, font_size60) title.to_edge(UP) title.fix_in_frame() # Stays in screen space self.add(title) # Rotate camera self.play(frame.animate.reorient(50, 80), run_time3)使用要点技能总览 SKILL.md 明确提醒调用在 mobject 上而非场景上——title.fix_in_frame()而非scene.fix_in_frame(title)与 ManimCE 的self.add_fixed_in_frame_mobjects(mob)是等价物但调用位置不同为让标题在旋转中始终清晰常配合title.set_backstroke(BLACK, 5)描边模板 ThreeDSceneTemplate 已内建该组合写法。光照与材质光源 Light Source# Access light source light self.camera.light_source # Move light light.move_to([10, 10, 10]) # Animate light movement self.play(light.animate.move_to([0, 0, 10]), run_time2)光源本身是普通 mobject可以move_to、可以被animate——这让打光动画如掠过物体表面的高光成为可能。Gloss 与 Shadow 材质参数# Add gloss to objects sphere Sphere(radius2) sphere.set_gloss(0.8) # 0 to 1 # Add shadow sphere.set_shadow(0.5) # 0 to 1set_gloss(v)取值 0~1控制镜面高光强度金属/釉面质感靠高 gloss 营造set_shadow(v)取值 0~1控制自阴影强度为对象增加体量感。模板 LightingTemplate 组合了set_gloss(0.9)的高光球体 动态光源先在[5,5,5]与[-5,-5,5]之间移动灯光再让相机旋转 180°演示材质 布光 运镜三者联动的效果。一个完整的复杂 3D 场景把上述能力组装起来即可得到坐标轴 参数曲面 网格 固定标题 多阶段运镜的一体化场景class Complex3DScene(Scene): def construct(self): frame self.camera.frame frame.reorient(20, 75) # Create axes axes ThreeDAxes( x_range(-3, 3), y_range(-3, 3), z_range(-3, 3) ) # Create parametric surface surface Surface( lambda u, v: np.array([ u, v, np.sin(np.sqrt(u**2 v**2)) ]), u_range(-3, 3), v_range(-3, 3), resolution(30, 30), colorBLUE ) surface.set_opacity(0.7) # Add mesh mesh SurfaceMesh(surface) mesh.set_stroke(WHITE, 0.5, opacity0.3) # Add title (fixed in frame) title Text(Sinc Function Surface, font_size48) title.to_edge(UP) title.fix_in_frame() title.set_backstroke(BLACK, 5) # Build scene self.add(axes, surface, mesh, title) self.wait() # Rotate camera smoothly self.play( frame.animate.reorient(45, 70), run_time3 ) self.wait() # Add continuous rotation frame.add_updater(lambda m, dt: m.increment_theta(20 * dt)) self.wait(10)该结构即 3D 模板 ThreeDSceneTemplate 的浓缩版模板进一步演示了ShowCreation(axes)先画轴、ShowCreation(sphere/cube)再出主体、动画结束后frame.clear_updaters()清理更新器的完整编排顺序建议新场景直接以模板为起点复制改造。交互式 3D 控制ManimGL 内置了开箱即用的 3D 交互调试能力。运行manimgl渲染时若进入交互/预览模式可以通过键盘鼠标直接手转场景按住d 移动鼠标旋转摄像机按住z 滚动滚轮缩放按r摄像机复位到默认位置按q退出交互模式进阶玩法是-se交互窗口与self.embed()在 Interactive3DTemplate 中取消self.embed()注释后以manimgl templates/3d_scene.py Interactive3DTemplate -se 30启动即可在 IPython shell 中调用touch()进入上述触摸交互态边调角度边写代码是排查视角不对、物体穿模、标注被遮挡类问题的最高效路径。最佳实践清单把 规则文件 末尾的经验总结为可执行守则优先reorient()比手写欧拉角更清晰、意图更明确UI 一律fix_in_frame()标题、图例等 2D 元素在镜头旋转时必须固定保证可读性分辨率按需分配最终渲染用高resolution如(40, 40)开发调试用低值换速度用透明度表现深度set_opacity(0.7)左右让半透明曲面能看到后面多层结构不再互相遮蔽重视打光调节light_source位置高 gloss 时尤其明显比盲目调色更能提升质感持续旋转交给 updateradd_updater(lambda m, dt: m.increment_theta(k * dt))获得帧级平滑优于逐帧play开发期主动降帧率/质量3D 场景开销大用-l、-se控制迭代节奏别让渲染拖慢创作循环。高频模式与运镜配方环绕物体 360° 展示# 360-degree rotation self.play( frame.animate.increment_theta(360*DEGREES), run_time10, rate_funclinear )rate_funclinear保证匀速转动避免默认缓入缓出造成的忽快忽慢。创建地面地板floor NumberPlane( x_range(-10, 10), y_range(-10, 10), background_line_style{stroke_color: GREY, stroke_width: 1} ) floor.rotate(90*DEGREES, RIGHT) floor.shift(2*DOWN)把网格绕 x 轴放平并下移 2 个单位即得到有纵深的舞台地面适合承载漂浮的几何体。多机位切换演示# Show from different angles angles [(0, 0), (20, 70), (45, 45), (90, 90)] for theta, phi in angles: self.play(frame.animate.reorient(theta, phi)) self.wait()逐个视角停留模拟分镜切机位用于完整呈现对象拓扑结构若希望过渡更电影感可在每次reorient间插入稍长的wait或改用run_time参数控制速度。在本仓库中如何定位与复用这些资产所有 ManimGL 3D 相关资料集中在.agents及与之镜像的.claude目录下按角色清晰分层规则文档Rules3d.md 为 3D 主题入口配套 camera.md摄像机/欧拉角/fix_in_frame、styling.mdgloss/shadow/backstroke、cli.md 与 config.md渲染配置可运行示例Examples3D 场景矩阵见 examples/ 目录其中 three_d_surfaces.py、bloch_sphere_3d.py、lorenz_attractor.py、cube_projection_3d.py 覆盖了从数学曲面到物理系统的大类需求参考文档见 three_d_surfaces.md 等场景模板Templates3d_scene.py 内含普通 3D、参数曲面、交互探索、贴图球、光照演示共 5 套模板每个类都带可执行manimgl命令与注释说明仓库级调用面OpenMontage 还在创作侧提供 manim-usage.md 指导 agent 何时选用 Manim 类可视化并在工具层通过 math_animate.py 封装数学动画入口由 test_math_animate_safety.py 保障渲染安全边界——当 ManimGL 素材产出需要进入 OpenMontage 的 动画管线 流水线时可沿这条链路继续深入。最后提醒一点内容合规与复用的注意本技能目录的代码大量改编自 3Blue1Brown 的公开视频仓库其授权遵循 LICENSE.txt 所载的 CC BY-NC-SA 4.0——即需署名、非商业、衍生作品同协议共享。在把它纳入任何生产或商业管线前请先确认你的使用场景与该授权相容。【免费下载链接】OpenMontageWorlds first open-source, agentic video production system. 12 production pipelines, 100 tools, 700 agent skill and production-knowledge files. Turn your AI coding assistant into a full video production studio.项目地址: https://gitcode.com/GitHub_Trending/op/OpenMontage创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考