Camera

注意

本部分涉及到很多关于 OpenGL 的编写,例如 vertex array object, vertex buffer object, texture 等内容。由于编者对这部分也不是很熟悉,也希望有专业的同学来一起完善这部分内容。

CameraFrame

class manimlib.camera.camera.CameraFrame(**kwargs)

相机所拍摄到的帧

get_center() → numpy.ndarray

获取相机的中心坐标

get_euler_angles()

获取相机的欧拉角

get_field_of_view() → float

获取相机的视野

get_focal_distance() → float

获取相机的焦距

get_gamma()

获取相机的欧拉角的 gamma 值

get_height() → float

获取相机的高度

get_implied_camera_location() → numpy.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: Optional[float, None] = None, phi_degrees: Optional[float, None] = None, gamma_degrees: Optional[float, None] = None)

设置相机的欧拉角, set_euler_angles 的另一种写法

rotate(angle: float, axis: numpy.ndarray = array([0., 0., 1.]), **kwargs)

axis 为方向,angle 为角度旋转,kwargs 中可传入 about_point

set_euler_angles(theta: Optional[float, None] = None, phi: Optional[float, None] = None, gamma: Optional[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: scipy.spatial.transform._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: Optional[moderngl.context.Context, None] = None, **kwargs)

摄像机

  • frame_config : 相机帧参数

  • pixel_width : 像素宽度,默认 1920

  • pixel_height : 像素高度,默认 1080

  • frame_rate : 相机帧率,默认 30

  • light_source_position : 光源位置

  • anti_alias_width : 抗锯齿

capture(*mobjects: manimlib.mobject.mobject.Mobject, **kwargs) → None

捕获 mobjects 中的物体

clear() → None

清空帧缓冲

get_fbo(ctx: moderngl.context.Context, samples: int = 0) → moderngl.framebuffer.Framebuffer

获取帧缓冲

get_frame_center() → numpy.ndarray

获取相机帧中心

get_frame_height() → float

获取相机帧高度

get_frame_shape() → tuple

获取相机帧宽高

get_frame_width() → float

获取相机帧宽度

get_image() → PIL.Image.Image

获取当前帧图片

get_location() → tuple

获取相机位置

get_pixel_array() → numpy.ndarray

获取当前帧 RGB 像素矩阵

get_pixel_height() → int

获取画面像素高度

get_pixel_shape() → tuple

获取画面像素大小

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 buffer

  • ibo : vertex index data buffer

  • vao : vertex array

  • prog : shader program

  • shader_wrapper : 材质包装

  • single_use : 单次使用

get_texture() → moderngl.texture.Texture

获取贴图资源

get_texture_id(path: str) → int

获取资源 id

init_context(ctx: Optional[moderngl.context.Context, None] = None) → None

初始化上下文

init_frame() → None

初始化相机帧

refresh_perspective_uniforms() → None

更新透视变量

release_render_group(render_group: dict) → None

释放渲染

release_texture(path: str)

释放资源

render(render_group: dict) → 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: Optional[moderngl.context.Context, None] = None, **kwargs)

仅用于保证旧版场景不崩溃

  • frame_config : 相机帧参数

  • pixel_width : 像素宽度,默认 1920

  • pixel_height : 像素高度,默认 1080

  • frame_rate : 相机帧率,默认 30

  • light_source_position : 光源位置

  • anti_alias_width : 抗锯齿