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
: 抗锯齿