mirror of
https://github.com/hanzoai/video.git
synced 2026-11-03 04:21:39 +00:00
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]>
139 lines
4.0 KiB
Python
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
|