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
: 像素宽度,默认 1920pixel_height
: 像素高度,默认 1080frame_rate
: 相机帧率,默认 30light_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 bufferibo
: vertex index data buffervao
: vertex arrayprog
: shader programshader_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
变量