manim边学边做--标准相机

打印 上一主题 下一主题

主题 900|帖子 900|积分 2700

在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属性,让场景举行缩放。
注意,下面的示例中物体本身并没有缩放,是通过调整相机来使物体看起来被缩放。
这和之前介绍的物体的缩放动画是不一样的。
  1. # 创建一个简单的圆
  2. c = Circle(radius=0.5, color=BLUE)
  3. t = Triangle(color=RED)
  4. self.play(Create(c), Create(t))
  5. # 获取当前相机的 frame
  6. camera_frame = self.camera.frame
  7. # 缩放相机视角
  8. self.play(camera_frame.animate.set(height=4, width=4))
  9. self.wait()
  10. # 恢复相机视角
  11. self.play(
  12.     camera_frame.animate.set(
  13.         height=config.frame_height,
  14.         width=config.frame_width,
  15.     )
  16. )
复制代码

2.2. 移动相机位置

此示例展示了如何移动相机位置,通过改变相机的 shift 方法,让相机在场景中移动。
注意,下面的示例中物体本身其实没有移动,只是通过移动相机的位置从差别的视角观察物体。
这和之前介绍的物体的移动动画是不一样的。
  1. # 创建一个正方形
  2. s = Square(side_length=2, color=RED)
  3. self.play(Create(s))
  4. # 获取当前相机的 frame
  5. camera_frame = self.camera.frame
  6. # 移动相机位置
  7. self.play(
  8.     camera_frame.animate.shift(
  9.         RIGHT * 4 + UP * 2,
  10.     )
  11. )
  12. self.wait()
  13. # 移回相机位置
  14. self.play(
  15.     camera_frame.animate.shift(
  16.         LEFT * 4 + DOWN * 4,
  17.     )
  18. )
复制代码

2.3. 改变相机背景颜色

该示例演示了如何改变相机的背景颜色,通过修改相机的 background_color 属性,实现背景颜色的动态变革。
  1. # 创建一个三角形
  2. triangle = Triangle(color=YELLOW)
  3. self.play(Create(triangle))
  4. # 改变相机背景颜色
  5. self.camera.background_color = GREEN
  6. self.wait(0.5)
  7. self.camera.background_color = RED
  8. self.wait(0.5)
  9. # 恢复相机背景颜色
  10. self.camera.background_color = config.background_color
复制代码

2.4. 相机跟随物体移动

这个示例展示了相机如何跟随一个移动的物体,通过在每一帧更新相机的位置,使其与物体保持相对位置
  1. # 定义曲线函数
  2. def curve_function(t):
  3.     return np.array([t, t**2 - 2, 0])
  4. # 创建曲线
  5. curve = ParametricFunction(
  6.     curve_function,
  7.     t_range=[-2, 2],
  8.     color=BLUE,
  9. )
  10. self.add(curve)
  11. # 创建一个点
  12. dot = Dot(color=RED)
  13. dot.move_to(curve_function(-2))
  14. self.add(dot)
  15. # 获取相机的 frame
  16. camera_frame = self.camera.frame
  17. def update_camera(camera_frame):
  18.     # 让相机跟随点移动
  19.     camera_frame.move_to(dot.get_center())
  20. # 添加相机更新函数
  21. self.play(
  22.     camera_frame.animate.scale(0.5).move_to(
  23.         dot.get_center(),
  24.     ),
  25. )
  26. camera_frame.add_updater(update_camera)
  27. # 定义点在曲线上运动的动画
  28. def move_dot_along_curve(mobject, alpha):
  29.     t = -2 + alpha * 4
  30.     mobject.move_to(curve_function(t))
  31. # 播放点在曲线上运动的动画
  32. self.play(
  33.     UpdateFromAlphaFunc(
  34.         dot,
  35.         move_dot_along_curve,
  36.     ),
  37.     run_time=3,
  38. )
  39. # 移除相机更新函数
  40. camera_frame.remove_updater(update_camera)
复制代码

3. 附件

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

北冰洋以北

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表