在Manim动画制作库中,Camera类是负责管理屏幕显示内容的核心类,其功能涵盖场景设置、对象渲染、坐标转换等多个关键方面。
Camera类作为Manim中渲染流程的核心,在动画制作中主要作用包括:
- 初始化场景:设置背景、分辨率等基本参数
- 渲染对象:通过捕获和渲染
Mobject,生成每一帧的像素数组 - 调整渲染细节:通过调整像素数组、背景颜色等,优化渲染效果
- 生成输出:将像素数组转换为图像或视频帧
Camera类是Manim中实现渲染功能的基础类,它通过管理像素数组和渲染逻辑,将复杂的数学对象转换为可视化的图像或动画。
通过灵活配置参数和使用方法,开发者可以实现高质量的动画渲染效果。
1. Camera概要
Camera类是Manim中的基类,用于管理场景的渲染过程。
它负责将场景中的对象(如Mobject、VMobject、ImageMobject等)转换为像素数组,并最终生成图像或视频帧。
Camera类的核心功能是控制场景的渲染细节,包括背景设置、对象的捕获、以及渲染过程中的各种调整。
1.1. 主要参数
Camera类作为Manim中各种相机的基类,参数很多,主要分为以下几类。
- 背景相关参数:
| 参数名称 | 类型 | 说明 |
|---|---|---|
| background_image | str | 背景图片的路径 |
| background | np.ndarray | 背景内容 |
| background_color | ParsableManimColor | 设置背景颜色 |
| background_opacity | float | 控制背景的透明度 |
- 尺寸相关参数:
| 参数名称 | 类型 | 说明 |
|---|---|---|
| pixel_height | int | 场景的像素高度 |
| pixel_width | int | 场景的像素宽度 |
| frame_height | float | 场景的实际高度 |
| frame_width | float | 场景的实际宽度 |
- 其他参数:
| 参数名称 | 类型 | 说明 |
|---|---|---|
| frame_rate | float | 设置帧率 |
| image_mode | str | 指定图像模式 |
| n_channels | int | 颜色通道数 |
| pixel_array_dtype | str | 规定像素数组的数据类型 |
| cairo_line_width_multiple | float | Cairo 渲染时线条宽度的缩放因子 |
| use_z_index | bool | 决定是否使用 Z 轴索引,用于控制对象的渲染顺序 |
1.2. 主要方法
Camera类的方法也不少,主要有以下几类:
- 渲染相关:
| 名称 | 说明 |
|---|---|
| capture_mobject(mobject) | 捕获单个Mobject并将其渲染到像素数组中 |
| capture_mobjects(mobjects) | 捕获多个Mobject并将它们渲染到像素数组中 |
| display_image_mobject(image_mobject, pixel_array) | 渲染ImageMobject,通过修改像素数组实现 |
| display_vectorized(vmobject, ctx) | 在Cairo上下文中渲染矢量化的VMobject |
| display_point_cloud(pmobject, ...) | 渲染点云对象,通过修改像素数组实现 |
- 背景设置:
| 名称 | 说明 |
|---|---|
| set_background(pixel_array) | 设置背景为指定的像素数组 |
| make_background_from_func(coords_to_colors_func) | 使用函数生成背景像素数组,函数输入为(x, y)坐标,输出为RGBA值 |
| reset() | 将像素数组重置为背景 |
- 帧与像素操作:
| 名称 | 说明 |
|---|---|
| resize_frame_shape(fixed_dimension) | 调整帧的形状以匹配像素的宽高比,fixed_dimension决定固定高度还是宽度 |
| reset_pixel_shape(new_height, new_width) | 重新设置像素的高度和宽度 |
| convert_pixel_array(pixel_array) | 将浮点像素数组转换为有效的 RGB 值 |
| overlay_rgba_array(pixel_array, new_array) | 将 RGBA 数组叠加到现有像素数组上 |
- 辅助功能:
| 名称 | 说明 |
|---|---|
| is_in_frame(mobject) | 检查对象是否在当前帧内 |
| points_to_pixel_coords(points) | 将点坐标转换为像素坐标 |
| thickened_coordinates(pixel_coords, thickness) | 生成加粗的像素坐标 |
| get_mobjects_to_display(mobjects) | 获取需要渲染的对象列表 |
2. 使用示例
下面通过示例来演示相机Camera在动画中常用的方式。
2.1. 使用相机缩放场景
这个示例展示了如何使用 Camera 改变视角来缩放场景,通过改变frame的height和width属性,让场景进行缩放。
注意,下面的示例中物体本身并没有缩放,是通过调整相机来使物体看起来被缩放。
这和之前介绍的物体的缩放动画是不一样的。
# 创建一个简单的圆 c = Circle(radius=0.5, color=BLUE) t = Triangle(color=RED) self.play(Create(c), Create(t)) # 获取当前相机的 frame camera_frame = self.camera.frame # 缩放相机视角 self.play(camera_frame.animate.set(height=4, width=4)) self.wait() # 恢复相机视角 self.play( camera_frame.animate.set( height=config.frame_height, width=config.frame_width, ) )

2.2. 移动相机位置
此示例展示了如何移动相机位置,通过改变相机的 shift 方法,让相机在场景中移动。
注意,下面的示例中物体本身其实没有移动,只是通过移动相机的位置从不同的视角观察物体。
这和之前介绍的物体的移动动画是不一样的。
# 创建一个正方形 s = Square(side_length=2, color=RED) self.play(Create(s)) # 获取当前相机的 frame camera_frame = self.camera.frame # 移动相机位置 self.play( camera_frame.animate.shift( RIGHT * 4 + UP * 2, ) ) self.wait() # 移回相机位置 self.play( camera_frame.animate.shift( LEFT * 4 + DOWN * 4, ) )

2.3. 改变相机背景颜色
该示例演示了如何改变相机的背景颜色,通过修改相机的 background_color 属性,实现背景颜色的动态变化。
# 创建一个三角形 triangle = Triangle(color=YELLOW) self.play(Create(triangle)) # 改变相机背景颜色 self.camera.background_color = GREEN self.wait(0.5) self.camera.background_color = RED self.wait(0.5) # 恢复相机背景颜色 self.camera.background_color = config.background_color

2.4. 相机跟随物体移动
这个示例展示了相机如何跟随一个移动的物体,通过在每一帧更新相机的位置,使其与物体保持相对位置
# 定义曲线函数 def curve_function(t): return np.array([t, t**2 - 2, 0]) # 创建曲线 curve = ParametricFunction( curve_function, t_range=[-2, 2], color=BLUE, ) self.add(curve) # 创建一个点 dot = Dot(color=RED) dot.move_to(curve_function(-2)) self.add(dot) # 获取相机的 frame camera_frame = self.camera.frame def update_camera(camera_frame): # 让相机跟随点移动 camera_frame.move_to(dot.get_center()) # 添加相机更新函数 self.play( camera_frame.animate.scale(0.5).move_to( dot.get_center(), ), ) camera_frame.add_updater(update_camera) # 定义点在曲线上运动的动画 def move_dot_along_curve(mobject, alpha): t = -2 + alpha * 4 mobject.move_to(curve_function(t)) # 播放点在曲线上运动的动画 self.play( UpdateFromAlphaFunc( dot, move_dot_along_curve, ), run_time=3, ) # 移除相机更新函数 camera_frame.remove_updater(update_camera)

3. 附件
文中的代码只是关键部分的截取,完整的代码共享在网盘中(camera.py),
下载地址: 完整代码 (访问密码: 6872)