Camera¶
注意
本部分涉及到很多关于 OpenGL 的编写,例如 vertex array object, vertex buffer object, texture 等内容。由于编者对这部分也不是很熟悉,也希望有专业的同学来一起完善这部分内容。
CameraFrame¶
- class manimlib.camera.camera.CameraFrame(**kwargs)¶
相机所拍摄到的帧
- get_center() ndarray¶
获取相机的中心坐标
- get_euler_angles()¶
获取相机的欧拉角
- get_field_of_view() float¶
获取相机的视野
- get_focal_distance() float¶
获取相机的焦距
- get_gamma()¶
获取相机的欧拉角的 gamma 值
- get_height() float¶
获取相机的高度
- get_implied_camera_location() ndarray¶
获取相机的位置
- get_orientation()¶
获取相机旋转
- get_phi()¶
获取相机的欧拉角的 phi 值
- get_shape()¶
获取相机帧宽高
- get_theta()¶
获取相机的欧拉角的 theta 值
- get_width() float¶
获取相机的宽度
- increment_gamma(dgamma: float)¶
增加相机的欧拉角的 gamma 值
- increment_phi(dphi: float)¶
增加相机的欧拉角的 phi 值
- increment_theta(dtheta: float)¶
增加相机的欧拉角的 theta 值
- reorient(theta_degrees: float | None = None, phi_degrees: float | None = None, gamma_degrees: float | None = None)¶
设置相机的欧拉角, set_euler_angles 的另一种写法
- rotate(angle: float, axis: ndarray = array([0., 0., 1.]), **kwargs)¶
以
axis为方向,angle为角度旋转,kwargs中可传入about_point
- set_euler_angles(theta: float | None = None, phi: float | None = None, gamma: float | None = None, units: float = 1)¶
设置相机的欧拉角
- set_field_of_view(field_of_view: float)¶
设置相机的视野
- set_focal_distance(focal_distance: float)¶
设置相机的焦距
- set_gamma(gamma: float)¶
设置相机的欧拉角的 gamma 值
- set_orientation(rotation: Rotation)¶
设置相机旋转(使用四元数)
- set_phi(phi: float)¶
设置相机的欧拉角的 phi 值
- set_theta(theta: float)¶
设置相机的欧拉角的 theta 值
- to_default_state()¶
相机恢复到默认位置
在 manimgl 版本,你可以通过改变 CameraFrame 的属性来控制相机所拍摄到的画面,也就是说,旋转、缩放画面大小都可以用这种方式来完成。
MoveCameraExample¶
class MoveCameraExample(Scene):
def setup(self):
# 初始化坐标系
self.plane = NumberPlane()
self.plane.add_coordinate_labels()
self.add(self.plane)
def t_func(self, t):
# 螺线参数方程
a, b = 3, 3
return np.array([
a * np.cos(t) / t,
b * np.sin(t) / t,
0
])
def construct(self):
# 获取相机帧的引用
frame = self.camera.frame
# 创建螺线
curve = ParametricCurve(self.t_func, t_range=[0.1, 100, 0.05], color=YELLOW)
self.add(curve)
self.play(
curve.animate.set_stroke(width=0.3), # 设置螺线粗细
frame.animate.set_width(2).rotate(PI / 2), # 旋转缩放相机帧
run_time=3
)
self.wait(0.5)
ReorientCameraExample¶
class ReorientCameraExample(Scene):
def setup(self):
# 初始化场景
axes = ThreeDAxes()
self.add(axes)
sphere = Sphere().move_to(axes.coords_to_point(3, 2, 2))
self.add(sphere)
def construct(self) -> None:
# 获取相机帧的引用
camera = self.camera.frame
self.wait()
# 使用四元数旋转(欧拉旋转经常会检测到万向节锁死)
self.play(camera.animate.set_orientation(Rotation([0.8, 0.2, 0.1, 0.9])))
self.wait()
Camera¶
- class manimlib.camera.camera.Camera(ctx: Context | None = None, **kwargs)¶
摄像机
frame_config: 相机帧参数pixel_width: 像素宽度,默认 1920pixel_height: 像素高度,默认 1080frame_rate: 相机帧率,默认 30light_source_position: 光源位置anti_alias_width: 抗锯齿
- clear() None¶
清空帧缓冲
- get_fbo(ctx: Context, samples: int = 0) Framebuffer¶
获取帧缓冲
- get_frame_center() ndarray¶
获取相机帧中心
- get_frame_height() float¶
获取相机帧高度
- get_frame_shape() tuple[float, float]¶
获取相机帧宽高
- get_frame_width() float¶
获取相机帧宽度
- get_image() Image¶
获取当前帧图片
- get_location() tuple[float, float, float]¶
获取相机位置
- get_pixel_array() ndarray¶
获取当前帧 RGB 像素矩阵
- get_pixel_height() int¶
获取画面像素高度
- get_pixel_shape() tuple[int, int]¶
获取画面像素大小
- get_pixel_width() int¶
获取画面像素宽度
- get_raw_fbo_data(dtype: str = 'f1') bytes¶
获取源缓冲数据
- get_render_group(shader_wrapper: ShaderWrapper, single_use: bool = True) dict[str]¶
获取渲染所包含的成员
vbo: vertex data bufferibo: vertex index data buffervao: vertex arrayprog: shader programshader_wrapper: 材质包装single_use: 单次使用
- get_texture() Texture¶
获取贴图资源
- get_texture_id(path: str) int¶
获取资源 id
- init_context(ctx: Context | None = None) None¶
初始化上下文
- init_frame() None¶
初始化相机帧
- refresh_perspective_uniforms() None¶
更新透视变量
- release_render_group(render_group: dict[str]) None¶
释放渲染
- release_texture(path: str)¶
释放资源
- render(render_group: dict[str]) None¶
渲染
- reset_pixel_shape(new_width: int, new_height: int) None¶
重置像素宽高
- resize_frame_shape(fixed_dimension: bool = False) None¶
重置帧大小以匹配画面像素比
fixed_dimension控制高度不变宽度变化,或宽度不变高度变化
- set_ctx_blending(enable: bool = True) None¶
设置上下文混合
- set_ctx_depth_test(enable: bool = True) None¶
设置上下文深度测试
- set_shader_uniforms(shader: moderngl.Program, shader_wrapper: ShaderWrapper) None¶
设置着色器的
uniform变量
ThreeDCamera¶
- class manimlib.camera.camera.ThreeDCamera(ctx: Context | None = None, **kwargs)¶
仅用于保证旧版场景不崩溃
frame_config: 相机帧参数pixel_width: 像素宽度,默认 1920pixel_height: 像素高度,默认 1080frame_rate: 相机帧率,默认 30light_source_position: 光源位置anti_alias_width: 抗锯齿