Files
calesthioandHanzo Dev 7ffb943132 Initial release — OpenMontage: the first open-source agentic video production system
11 production pipelines, 47 tools, 124 agent skills.
Supports cloud APIs (fal.ai, OpenAI, ElevenLabs, Suno, HeyGen, Runway) and
free local providers (diffusers, Piper TTS, WAN 2.1, Hunyuan, CogVideo).

Co-authored-by: Hanzo Dev <[email protected]>
2026-03-29 08:25:17 -07:00

139 lines
4.0 KiB
Python

"""
3D Scene Template for Manim Community
Use this for 3D visualizations with camera rotation and surfaces.
Render: manim -pql your_file.py Your3DScene
"""
from manim import *
import numpy as np
class Your3DScene(ThreeDScene):
"""
Template for 3D scenes.
Inherits from ThreeDScene which provides:
- set_camera_orientation(phi, theta, gamma)
- move_camera()
- begin_ambient_camera_rotation() / stop_ambient_camera_rotation()
- add_fixed_in_frame_mobjects() for 2D overlays
"""
def construct(self):
# ============================================================
# CAMERA SETUP
# ============================================================
# Set initial camera orientation
# phi: angle from z-axis (0 = top-down, 90 = side view)
# theta: rotation around z-axis
self.set_camera_orientation(
phi=70 * DEGREES,
theta=-45 * DEGREES
)
# ============================================================
# 3D AXES
# ============================================================
axes = ThreeDAxes(
x_range=[-3, 3, 1],
y_range=[-3, 3, 1],
z_range=[-2, 2, 1],
x_length=6,
y_length=6,
z_length=4,
)
# Axis labels (stay fixed to camera orientation)
axis_labels = axes.get_axis_labels(
x_label="x",
y_label="y",
z_label="z"
)
self.play(Create(axes))
self.add(axis_labels)
self.wait()
# ============================================================
# 3D OBJECTS
# ============================================================
# --- Basic 3D shapes ---
sphere = Sphere(radius=0.5, color=BLUE).shift(LEFT * 2)
cube = Cube(side_length=0.8, color=RED, fill_opacity=0.8)
self.play(Create(sphere), Create(cube))
self.wait()
# --- 3D Surface ---
# z = sin(sqrt(x^2 + y^2))
surface = Surface(
lambda u, v: axes.c2p(
u, v,
np.sin(np.sqrt(u ** 2 + v ** 2))
),
u_range=[-2.5, 2.5],
v_range=[-2.5, 2.5],
resolution=(20, 20),
fill_opacity=0.6,
)
surface.set_color_by_gradient(BLUE, TEAL, GREEN)
self.play(
FadeOut(sphere),
FadeOut(cube),
Create(surface),
run_time=2
)
self.wait()
# ============================================================
# 2D OVERLAY (Fixed to screen)
# ============================================================
# Title that stays fixed to screen (doesn't rotate with 3D scene)
title = Text("3D Surface Visualization", font_size=36)
title.to_corner(UL)
self.add_fixed_in_frame_mobjects(title)
self.play(Write(title))
# Math equation overlay
equation = MathTex(r"z = \sin\sqrt{x^2 + y^2}")
equation.to_corner(UR)
self.add_fixed_in_frame_mobjects(equation)
self.play(Write(equation))
# ============================================================
# CAMERA MOVEMENT
# ============================================================
# --- Manual camera movement ---
self.move_camera(phi=45 * DEGREES, theta=30 * DEGREES, run_time=2)
self.wait()
# --- Continuous rotation ---
self.begin_ambient_camera_rotation(rate=0.2) # radians per second
self.wait(5)
self.stop_ambient_camera_rotation()
# ============================================================
# CLEANUP
# ============================================================
self.play(
FadeOut(surface),
FadeOut(axes),
FadeOut(axis_labels),
FadeOut(title),
FadeOut(equation),
)
self.wait()
# Run this specific scene:
# manim -pql threed_scene.py Your3DScene