北冰洋以北 发表于 4 天前

manim边学边做--标准相机

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

[*]初始化场景:设置背景、分辨率等基本参数
[*]渲染对象:通过捕获和渲染Mobject,生成每一帧的像素数组
[*]调整渲染细节:通过调整像素数组、背景颜色等,优化渲染效果
[*]生成输出:将像素数组转换为图像或视频帧
Camera类是Manim中实现渲染功能的基础类,它通过管理像素数组和渲染逻辑,将复杂的数学对象转换为可视化的图像或动画。
通过机动配置参数和使用方法,开发者可以实现高质量的动画渲染效果。
1. Camera概要

Camera类是Manim中的基类,用于管理场景的渲染过程。
它负责将场景中的对象(如Mobject、VMobject、ImageMobject等)转换为像素数组,并最终生成图像或视频帧。
Camera类的核心功能是控制场景的渲染细节,包括背景设置、对象的捕获、以及渲染过程中的各种调整。
1.1. 主要参数

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

[*]背景干系参数:
参数名称类型说明background_imagestr背景图片的路径backgroundnp.ndarray背景内容background_colorParsableManimColor设置背景颜色background_opacityfloat控制背景的透明度
[*]尺寸干系参数:
参数名称类型说明pixel_heightint场景的像素高度pixel_widthint场景的像素宽度frame_heightfloat场景的实际高度frame_widthfloat场景的实际宽度
[*]其他参数:
参数名称类型说明frame_ratefloat设置帧率image_modestr指定图像模式n_channelsint颜色通道数pixel_array_dtypestr规定像素数组的数据类型cairo_line_width_multiplefloatCairo 渲染时线条宽度的缩放因子use_z_indexbool决定是否使用 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上下文中渲染矢量化的VMobjectdisplay_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,
    )
)https://img2024.cnblogs.com/blog/83005/202502/83005-20250225134614931-1245930393.gif
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,
    )
)https://img2024.cnblogs.com/blog/83005/202502/83005-20250225134614813-578967901.gif
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_colorhttps://img2024.cnblogs.com/blog/83005/202502/83005-20250225134614841-1383784641.gif
2.4. 相机跟随物体移动

这个示例展示了相机如何跟随一个移动的物体,通过在每一帧更新相机的位置,使其与物体保持相对位置
# 定义曲线函数
def curve_function(t):
    return np.array()

# 创建曲线
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)https://img2024.cnblogs.com/blog/83005/202502/83005-20250225134614930-1216312011.gif
3. 附件

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: manim边学边做--标准相机