English 简体中文 繁體中文 한국 사람 日本語 Deutsch русский بالعربية TÜRKÇE português คนไทย french
查看: 2|回复: 0

manim边学边做--标准相机

[复制链接]
查看: 2|回复: 0

manim边学边做--标准相机

[复制链接]
查看: 2|回复: 0

215

主题

0

回帖

655

积分

高级会员

积分
655
COPjS7aQKkj

215

主题

0

回帖

655

积分

高级会员

积分
655
2025-2-25 14:43:31 | 显示全部楼层 |阅读模式
在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))# 获取当前相机的 framecamera_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))# 获取当前相机的 framecamera_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 = GREENself.wait(0.5)self.camera.background_color = REDself.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)# 获取相机的 framecamera_frame = self.camera.framedef 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)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

215

主题

0

回帖

655

积分

高级会员

积分
655

QQ|智能设备 | 粤ICP备2024353841号-1

GMT+8, 2025-3-10 18:22 , Processed in 5.943569 second(s), 29 queries .

Powered by 智能设备

©2025

|网站地图