diff --git a/manimlib/camera/camera_frame.py b/manimlib/camera/camera_frame.py index ce0a5846..61550121 100644 --- a/manimlib/camera/camera_frame.py +++ b/manimlib/camera/camera_frame.py @@ -29,6 +29,7 @@ class CameraFrame(Mobject): self.center_point = center_point self.focal_dist_to_height = focal_dist_to_height self.view_matrix = np.identity(4) + self.default_orientation = Rotation.identity() super().__init__(**kwargs) def init_uniforms(self) -> None: @@ -50,11 +51,15 @@ class CameraFrame(Mobject): def get_orientation(self): return Rotation.from_quat(self.uniforms["orientation"]) + def make_orientation_default(self): + self.default_orientation = self.get_orientation() + return self + def to_default_state(self): self.center() self.set_height(FRAME_HEIGHT) self.set_width(FRAME_WIDTH) - self.set_orientation(Rotation.identity()) + self.set_orientation(self.default_orientation) return self def get_euler_angles(self): @@ -101,7 +106,11 @@ class CameraFrame(Mobject): for i, var in enumerate([theta, phi, gamma]): if var is not None: eulers[i] = var * units - self.set_orientation(Rotation.from_euler("zxz", eulers[::-1])) + if all(eulers == 0): + rot = Rotation.identity() + else: + rot = Rotation.from_euler("zxz", eulers[::-1]) + self.set_orientation(rot) return self def reorient( diff --git a/manimlib/scene/scene.py b/manimlib/scene/scene.py index 5c29d3e6..ec5194ba 100644 --- a/manimlib/scene/scene.py +++ b/manimlib/scene/scene.py @@ -18,6 +18,7 @@ from tqdm.auto import tqdm as ProgressDisplay from manimlib.animation.animation import prepare_animation from manimlib.animation.fading import VFadeInThenOut from manimlib.camera.camera import Camera +from manimlib.camera.camera_frame import CameraFrame from manimlib.config import get_module from manimlib.constants import ARROW_SYMBOLS from manimlib.constants import DEFAULT_WAIT_TIME @@ -63,6 +64,8 @@ class Scene(object): default_window_config: dict = dict() default_file_writer_config: dict = dict() samples = 0 + # Euler angles, in degrees + default_frame_orientation = (0, 0) def __init__( self, @@ -108,6 +111,10 @@ class Scene(object): # Core state of the scene self.camera: Camera = Camera(**self.camera_config) + self.frame: CameraFrame = self.camera.frame + self.frame.reorient(*self.default_frame_orientation) + self.frame.make_orientation_default() + self.file_writer = SceneFileWriter(self, **self.file_writer_config) self.mobjects: list[Mobject] = [self.camera.frame] self.id_to_mobject_map: dict[int, Mobject] = dict() @@ -971,3 +978,8 @@ class SceneState(): class EndScene(Exception): pass + + +class ThreeDScene(Scene): + samples = 4 + default_frame_orientation = (-30, 70)