在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
属性,让场景进行缩放。
注意 ,下面的示例中物体本身并没有缩放,是通过调整相机来使物体看起来被缩放。
这和之前介绍的物体的缩放动画是不一样的。
python
# 创建一个简单的圆
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
方法,让相机在场景中移动。
注意 ,下面的示例中物体本身其实没有移动,只是通过移动相机的位置从不同的视角观察物体。
这和之前介绍的物体的移动动画是不一样的。
python
# 创建一个正方形
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
属性,实现背景颜色的动态变化。
python
# 创建一个三角形
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. 相机跟随物体移动
这个示例展示了相机如何跟随一个移动的物体,通过在每一帧更新相机的位置,使其与物体保持相对位置
python
# 定义曲线函数
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)