manim边学边做--标准相机

Manim动画制作库中,Camera类是负责管理屏幕显示内容的核心类,其功能涵盖场景设置、对象渲染、坐标转换等多个关键方面。

Camera类作为Manim中渲染流程的核心,在动画制作中主要作用包括:

  1. 初始化场景:设置背景、分辨率等基本参数
  2. 渲染对象 :通过捕获和渲染Mobject,生成每一帧的像素数组
  3. 调整渲染细节:通过调整像素数组、背景颜色等,优化渲染效果
  4. 生成输出:将像素数组转换为图像或视频帧

Camera类是Manim中实现渲染功能的基础类,它通过管理像素数组和渲染逻辑,将复杂的数学对象转换为可视化的图像或动画。

通过灵活配置参数和使用方法,开发者可以实现高质量的动画渲染效果。

1. Camera概要

Camera类是Manim中的基类,用于管理场景的渲染过程。

它负责将场景中的对象(如MobjectVMobjectImageMobject等)转换为像素数组,并最终生成图像或视频帧。

Camera类的核心功能是控制场景的渲染细节,包括背景设置、对象的捕获、以及渲染过程中的各种调整。

1.1. 主要参数

Camera类作为Manim中各种相机的基类,参数很多,主要分为以下几类。

  1. 背景相关参数:
参数名称 类型 说明
background_image str 背景图片的路径
background np.ndarray 背景内容
background_color ParsableManimColor 设置背景颜色
background_opacity float 控制背景的透明度
  1. 尺寸相关参数:
参数名称 类型 说明
pixel_height int 场景的像素高度
pixel_width int 场景的像素宽度
frame_height float 场景的实际高度
frame_width float 场景的实际宽度
  1. 其他参数:
参数名称 类型 说明
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类的方法也不少,主要有以下几类:

  1. 渲染相关:
名称 说明
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, ...) 渲染点云对象,通过修改像素数组实现
  1. 背景设置:
名称 说明
set_background(pixel_array) 设置背景为指定的像素数组
make_background_from_func(coords_to_colors_func) 使用函数生成背景像素数组,函数输入为(x, y)坐标,输出为RGBA
reset() 将像素数组重置为背景
  1. 帧与像素操作:
名称 说明
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 数组叠加到现有像素数组上
  1. 辅助功能:
名称 说明
is_in_frame(mobject) 检查对象是否在当前帧内
points_to_pixel_coords(points) 将点坐标转换为像素坐标
thickened_coordinates(pixel_coords, thickness) 生成加粗的像素坐标
get_mobjects_to_display(mobjects) 获取需要渲染的对象列表

2. 使用示例

下面通过示例来演示相机Camera在动画中常用的方式。

2.1. 使用相机缩放场景

这个示例展示了如何使用 Camera 改变视角来缩放场景,通过改变frameheightwidth属性,让场景进行缩放。

注意 ,下面的示例中物体本身并没有缩放,是通过调整相机来使物体看起来被缩放。

这和之前介绍的物体的缩放动画是不一样的。

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)

相关推荐
wang_yb21 小时前
manim边学边做--相机Camera简介
databook·manim
wang_yb1 天前
『Python底层原理』--Python整数为什么可以无限大
python·databook
阑梦清川1 天前
Jupyter里面的manim编程学习
python·jupyter·manim
wang_yb2 天前
『Python底层原理』--Python属性的工作原理
python·databook
wang_yb4 天前
『Python底层原理』--Python对象系统探秘
python·databook
wang_yb6 天前
『Python底层原理』--CPython的变量实现机制
python·databook
wang_yb7 天前
用 just 简化项目命令管理
databook
wang_yb14 天前
『玩转Streamlit』--会话状态管理
streamlit·databook
wang_yb15 天前
manim边学边做--通用变换
databook·manim