manim-mcp 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +104 -0
- package/dist/demo.mp4 +0 -0
- package/dist/index.js +65 -0
- package/dist/mcp-app.html +142 -0
- package/dist/server.js +1492 -0
- package/package.json +67 -0
- package/references/composer/SKILL.md +154 -0
- package/references/composer/references/3b1b-series-patterns.md +217 -0
- package/references/composer/references/domain-planning-guides/calculus-planning.md +188 -0
- package/references/composer/references/domain-planning-guides/linear-algebra-planning.md +169 -0
- package/references/composer/references/domain-planning-guides/ml-planning.md +286 -0
- package/references/composer/references/domain-planning-guides/number-theory-planning.md +187 -0
- package/references/composer/references/domain-planning-guides/physics-planning.md +249 -0
- package/references/composer/references/domain-planning-guides/probability-planning.md +200 -0
- package/references/composer/references/mathematical-storytelling.md +359 -0
- package/references/composer/references/narrative-patterns.md +221 -0
- package/references/composer/references/opening-patterns.md +284 -0
- package/references/composer/references/pacing-guide.md +289 -0
- package/references/composer/references/scene-archetypes.md +534 -0
- package/references/composer/references/scene-examples.md +379 -0
- package/references/composer/references/visual-techniques.md +480 -0
- package/references/composer/templates/scenes-template.md +147 -0
- package/references/manimce/SKILL.md +166 -0
- package/references/manimce/examples/3d_visualization.py +373 -0
- package/references/manimce/examples/basic_animations.py +212 -0
- package/references/manimce/examples/graph_plotting.py +401 -0
- package/references/manimce/examples/lorenz_attractor.py +172 -0
- package/references/manimce/examples/math_visualization.py +315 -0
- package/references/manimce/examples/updater_patterns.py +369 -0
- package/references/manimce/rules/3b1b-translation.md +594 -0
- package/references/manimce/rules/3d.md +254 -0
- package/references/manimce/rules/advanced-animations.md +594 -0
- package/references/manimce/rules/animation-groups.md +212 -0
- package/references/manimce/rules/animations.md +128 -0
- package/references/manimce/rules/api-pitfalls.md +89 -0
- package/references/manimce/rules/axes.md +214 -0
- package/references/manimce/rules/camera.md +208 -0
- package/references/manimce/rules/cli.md +232 -0
- package/references/manimce/rules/color-conventions.md +444 -0
- package/references/manimce/rules/colors.md +199 -0
- package/references/manimce/rules/config.md +264 -0
- package/references/manimce/rules/creation-animations.md +158 -0
- package/references/manimce/rules/graphing.md +233 -0
- package/references/manimce/rules/grouping.md +220 -0
- package/references/manimce/rules/latex.md +202 -0
- package/references/manimce/rules/lines.md +241 -0
- package/references/manimce/rules/long-form-video.md +552 -0
- package/references/manimce/rules/mathematical-domains.md +689 -0
- package/references/manimce/rules/mobjects.md +116 -0
- package/references/manimce/rules/multi-scene-composition.md +112 -0
- package/references/manimce/rules/pedagogy.md +532 -0
- package/references/manimce/rules/physics-simulations.md +610 -0
- package/references/manimce/rules/positioning.md +211 -0
- package/references/manimce/rules/scenes.md +121 -0
- package/references/manimce/rules/shapes.md +300 -0
- package/references/manimce/rules/styling.md +177 -0
- package/references/manimce/rules/text-animations.md +222 -0
- package/references/manimce/rules/text.md +189 -0
- package/references/manimce/rules/timing.md +227 -0
- package/references/manimce/rules/transform-animations.md +157 -0
- package/references/manimce/rules/updaters.md +226 -0
- package/references/manimce/templates/basic_scene.py +64 -0
- package/references/manimce/templates/camera_scene.py +100 -0
- package/references/manimce/templates/threed_scene.py +138 -0
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: camera
|
|
3
|
+
description: MovingCameraScene, zoom, pan, and camera manipulation
|
|
4
|
+
metadata:
|
|
5
|
+
tags: camera, zoom, pan, frame, movingcamerascene, 3d
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Camera Control
|
|
9
|
+
|
|
10
|
+
Control what the viewer sees with camera manipulation.
|
|
11
|
+
|
|
12
|
+
## MovingCameraScene
|
|
13
|
+
|
|
14
|
+
For 2D scenes with camera movement (zoom, pan).
|
|
15
|
+
|
|
16
|
+
```python
|
|
17
|
+
from manim import *
|
|
18
|
+
|
|
19
|
+
class CameraExample(MovingCameraScene):
|
|
20
|
+
def construct(self):
|
|
21
|
+
circle = Circle()
|
|
22
|
+
square = Square().shift(RIGHT * 3)
|
|
23
|
+
self.add(circle, square)
|
|
24
|
+
|
|
25
|
+
# Access camera frame
|
|
26
|
+
# self.camera.frame is the viewable area
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Zooming
|
|
30
|
+
|
|
31
|
+
### Zoom In/Out by Scaling Frame
|
|
32
|
+
|
|
33
|
+
```python
|
|
34
|
+
class ZoomExample(MovingCameraScene):
|
|
35
|
+
def construct(self):
|
|
36
|
+
dots = VGroup(*[Dot() for _ in range(100)])
|
|
37
|
+
dots.arrange_in_grid(10, 10, buff=0.3)
|
|
38
|
+
self.add(dots)
|
|
39
|
+
|
|
40
|
+
# Zoom in (make frame smaller)
|
|
41
|
+
self.play(self.camera.frame.animate.scale(0.5))
|
|
42
|
+
self.wait()
|
|
43
|
+
|
|
44
|
+
# Zoom out (make frame larger)
|
|
45
|
+
self.play(self.camera.frame.animate.scale(4))
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### Zoom to Specific Width
|
|
49
|
+
|
|
50
|
+
```python
|
|
51
|
+
class ZoomToWidth(MovingCameraScene):
|
|
52
|
+
def construct(self):
|
|
53
|
+
text = Text("Focus on me!")
|
|
54
|
+
self.add(text)
|
|
55
|
+
|
|
56
|
+
# Zoom to fit text with padding
|
|
57
|
+
self.play(
|
|
58
|
+
self.camera.frame.animate.set(width=text.width * 1.5)
|
|
59
|
+
)
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Panning
|
|
63
|
+
|
|
64
|
+
### Move Camera to Location
|
|
65
|
+
|
|
66
|
+
```python
|
|
67
|
+
class PanExample(MovingCameraScene):
|
|
68
|
+
def construct(self):
|
|
69
|
+
c1 = Circle().shift(LEFT * 3)
|
|
70
|
+
c2 = Circle().shift(RIGHT * 3)
|
|
71
|
+
self.add(c1, c2)
|
|
72
|
+
|
|
73
|
+
# Pan to first circle
|
|
74
|
+
self.play(self.camera.frame.animate.move_to(c1))
|
|
75
|
+
self.wait()
|
|
76
|
+
|
|
77
|
+
# Pan to second circle
|
|
78
|
+
self.play(self.camera.frame.animate.move_to(c2))
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### Combined Zoom and Pan
|
|
82
|
+
|
|
83
|
+
```python
|
|
84
|
+
class ZoomAndPan(MovingCameraScene):
|
|
85
|
+
def construct(self):
|
|
86
|
+
square = Square().shift(LEFT * 2)
|
|
87
|
+
triangle = Triangle().shift(RIGHT * 2)
|
|
88
|
+
self.add(square, triangle)
|
|
89
|
+
|
|
90
|
+
# Zoom in and pan simultaneously
|
|
91
|
+
self.play(
|
|
92
|
+
self.camera.frame.animate.scale(0.5).move_to(square)
|
|
93
|
+
)
|
|
94
|
+
self.wait()
|
|
95
|
+
|
|
96
|
+
# Move to triangle (still zoomed)
|
|
97
|
+
self.play(self.camera.frame.animate.move_to(triangle))
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
## Save and Restore Camera State
|
|
101
|
+
|
|
102
|
+
```python
|
|
103
|
+
class SaveRestoreCamera(MovingCameraScene):
|
|
104
|
+
def construct(self):
|
|
105
|
+
circle = Circle()
|
|
106
|
+
self.add(circle)
|
|
107
|
+
|
|
108
|
+
# Save current state
|
|
109
|
+
self.camera.frame.save_state()
|
|
110
|
+
|
|
111
|
+
# Make changes
|
|
112
|
+
self.play(self.camera.frame.animate.scale(0.3).move_to(circle))
|
|
113
|
+
self.wait()
|
|
114
|
+
|
|
115
|
+
# Restore to saved state
|
|
116
|
+
self.play(Restore(self.camera.frame))
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
## auto_zoom
|
|
120
|
+
|
|
121
|
+
Automatically zoom to fit mobjects.
|
|
122
|
+
|
|
123
|
+
```python
|
|
124
|
+
class AutoZoomExample(MovingCameraScene):
|
|
125
|
+
def construct(self):
|
|
126
|
+
squares = VGroup(*[
|
|
127
|
+
Square().shift(RIGHT * i + UP * j)
|
|
128
|
+
for i in range(-2, 3) for j in range(-2, 3)
|
|
129
|
+
])
|
|
130
|
+
self.add(squares)
|
|
131
|
+
|
|
132
|
+
# Zoom to fit specific mobject
|
|
133
|
+
self.play(self.camera.auto_zoom(squares[0]))
|
|
134
|
+
self.wait()
|
|
135
|
+
|
|
136
|
+
# Zoom to fit all with margin
|
|
137
|
+
self.play(self.camera.auto_zoom(squares, margin=1))
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## 3D Camera (ThreeDScene)
|
|
141
|
+
|
|
142
|
+
```python
|
|
143
|
+
class ThreeDCameraExample(ThreeDScene):
|
|
144
|
+
def construct(self):
|
|
145
|
+
axes = ThreeDAxes()
|
|
146
|
+
sphere = Sphere()
|
|
147
|
+
self.add(axes, sphere)
|
|
148
|
+
|
|
149
|
+
# Set initial camera orientation
|
|
150
|
+
self.set_camera_orientation(
|
|
151
|
+
phi=75 * DEGREES, # Angle from z-axis
|
|
152
|
+
theta=-45 * DEGREES # Angle around z-axis
|
|
153
|
+
)
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
### Animated Camera Rotation
|
|
157
|
+
|
|
158
|
+
```python
|
|
159
|
+
class RotatingCamera(ThreeDScene):
|
|
160
|
+
def construct(self):
|
|
161
|
+
axes = ThreeDAxes()
|
|
162
|
+
self.add(axes)
|
|
163
|
+
|
|
164
|
+
self.set_camera_orientation(phi=75 * DEGREES, theta=0)
|
|
165
|
+
|
|
166
|
+
# Continuous rotation
|
|
167
|
+
self.begin_ambient_camera_rotation(rate=0.2)
|
|
168
|
+
self.wait(5)
|
|
169
|
+
self.stop_ambient_camera_rotation()
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### Move 3D Camera
|
|
173
|
+
|
|
174
|
+
```python
|
|
175
|
+
class Move3DCamera(ThreeDScene):
|
|
176
|
+
def construct(self):
|
|
177
|
+
axes = ThreeDAxes()
|
|
178
|
+
self.add(axes)
|
|
179
|
+
|
|
180
|
+
self.set_camera_orientation(phi=75 * DEGREES, theta=-45 * DEGREES)
|
|
181
|
+
|
|
182
|
+
# Animate camera movement
|
|
183
|
+
self.move_camera(
|
|
184
|
+
phi=45 * DEGREES,
|
|
185
|
+
theta=45 * DEGREES,
|
|
186
|
+
run_time=3
|
|
187
|
+
)
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
## Camera Background
|
|
191
|
+
|
|
192
|
+
```python
|
|
193
|
+
class CameraBackground(Scene):
|
|
194
|
+
def construct(self):
|
|
195
|
+
# Set background color
|
|
196
|
+
self.camera.background_color = BLUE_E
|
|
197
|
+
|
|
198
|
+
circle = Circle()
|
|
199
|
+
self.add(circle)
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
## Best Practices
|
|
203
|
+
|
|
204
|
+
1. **Use MovingCameraScene for zoom/pan** - Regular Scene camera is static
|
|
205
|
+
2. **Save state before complex movements** - Easy to restore
|
|
206
|
+
3. **Use auto_zoom for dynamic content** - Automatically fits content
|
|
207
|
+
4. **Keep camera movements smooth** - Don't make viewers dizzy
|
|
208
|
+
5. **Use 3D camera rotation sparingly** - Can be disorienting
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: cli
|
|
3
|
+
description: Command-line interface, rendering options, and quality flags
|
|
4
|
+
metadata:
|
|
5
|
+
tags: cli, render, quality, preview, command, terminal
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Manim CLI
|
|
9
|
+
|
|
10
|
+
The `manim` command-line interface for rendering scenes.
|
|
11
|
+
|
|
12
|
+
## Basic Usage
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
# Render a scene
|
|
16
|
+
manim file.py SceneName
|
|
17
|
+
|
|
18
|
+
# With preview (opens video after rendering)
|
|
19
|
+
manim -p file.py SceneName
|
|
20
|
+
|
|
21
|
+
# Preview with low quality (fast)
|
|
22
|
+
manim -pql file.py SceneName
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Quality Flags
|
|
26
|
+
|
|
27
|
+
Quality presets for different use cases:
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
# Low Quality: 854x480, 15fps (fast for testing)
|
|
31
|
+
manim -ql file.py SceneName
|
|
32
|
+
|
|
33
|
+
# Medium Quality: 1280x720, 30fps
|
|
34
|
+
manim -qm file.py SceneName
|
|
35
|
+
|
|
36
|
+
# High Quality: 1920x1080, 60fps
|
|
37
|
+
manim -qh file.py SceneName
|
|
38
|
+
|
|
39
|
+
# 2K Quality: 2560x1440, 60fps
|
|
40
|
+
manim -qp file.py SceneName
|
|
41
|
+
|
|
42
|
+
# 4K Quality: 3840x2160, 60fps
|
|
43
|
+
manim -qk file.py SceneName
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### Common Combinations
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
# Preview + Low Quality (development workflow)
|
|
50
|
+
manim -pql file.py SceneName
|
|
51
|
+
|
|
52
|
+
# Preview + High Quality (final check)
|
|
53
|
+
manim -pqh file.py SceneName
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## Preview Flag
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
# -p: Open video after rendering
|
|
60
|
+
manim -p file.py SceneName
|
|
61
|
+
|
|
62
|
+
# Without -p: Render only (no auto-open)
|
|
63
|
+
manim file.py SceneName
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## Rendering Multiple Scenes
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
# Render all scenes in file
|
|
70
|
+
manim -a file.py
|
|
71
|
+
|
|
72
|
+
# Render specific scenes
|
|
73
|
+
manim file.py Scene1 Scene2 Scene3
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## Output Options
|
|
77
|
+
|
|
78
|
+
### Save Last Frame Only
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
# -s: Save only the last frame as PNG
|
|
82
|
+
manim -s file.py SceneName
|
|
83
|
+
|
|
84
|
+
# With quality
|
|
85
|
+
manim -sql file.py SceneName
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### Output Format
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
# GIF output
|
|
92
|
+
manim --format gif file.py SceneName
|
|
93
|
+
|
|
94
|
+
# PNG sequence
|
|
95
|
+
manim --format png file.py SceneName
|
|
96
|
+
|
|
97
|
+
# WebM (default is MP4)
|
|
98
|
+
manim --format webm file.py SceneName
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### Custom Output Directory
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
manim -o custom_name file.py SceneName
|
|
105
|
+
manim --media_dir /path/to/output file.py SceneName
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
## Frame Control
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
# Start from specific animation number
|
|
112
|
+
manim -n 5 file.py SceneName
|
|
113
|
+
|
|
114
|
+
# Render frames from animation 3 to 7
|
|
115
|
+
manim -n 3,7 file.py SceneName
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## Resolution and FPS
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
# Custom resolution
|
|
122
|
+
manim -r 1920,1080 file.py SceneName
|
|
123
|
+
|
|
124
|
+
# Custom frame rate
|
|
125
|
+
manim --fps 24 file.py SceneName
|
|
126
|
+
|
|
127
|
+
# Both
|
|
128
|
+
manim -r 1280,720 --fps 30 file.py SceneName
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## Transparency
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
# Render with transparent background
|
|
135
|
+
manim -t file.py SceneName
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
## Renderer Selection
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
# Cairo renderer (default, 2D)
|
|
142
|
+
manim --renderer cairo file.py SceneName
|
|
143
|
+
|
|
144
|
+
# OpenGL renderer (3D, faster preview)
|
|
145
|
+
manim --renderer opengl file.py SceneName
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
## Other Useful Flags
|
|
149
|
+
|
|
150
|
+
```bash
|
|
151
|
+
# Verbose output
|
|
152
|
+
manim -v DEBUG file.py SceneName
|
|
153
|
+
|
|
154
|
+
# Quiet mode
|
|
155
|
+
manim -v WARNING file.py SceneName
|
|
156
|
+
|
|
157
|
+
# Show progress bar
|
|
158
|
+
manim --progress_bar display file.py SceneName
|
|
159
|
+
|
|
160
|
+
# Disable caching
|
|
161
|
+
manim --disable_caching file.py SceneName
|
|
162
|
+
|
|
163
|
+
# Write to movie even if no animations
|
|
164
|
+
manim --write_to_movie file.py SceneName
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
## Help
|
|
168
|
+
|
|
169
|
+
```bash
|
|
170
|
+
# Show all options
|
|
171
|
+
manim --help
|
|
172
|
+
|
|
173
|
+
# Show render command options
|
|
174
|
+
manim render --help
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
## Other Commands
|
|
178
|
+
|
|
179
|
+
```bash
|
|
180
|
+
# Check installation and dependencies
|
|
181
|
+
manim checkhealth
|
|
182
|
+
|
|
183
|
+
# Initialize new project
|
|
184
|
+
manim init
|
|
185
|
+
|
|
186
|
+
# Show config values
|
|
187
|
+
manim cfg show
|
|
188
|
+
|
|
189
|
+
# Write current config to file
|
|
190
|
+
manim cfg write
|
|
191
|
+
|
|
192
|
+
# List installed plugins
|
|
193
|
+
manim plugins -l
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
## Jupyter Notebook Support
|
|
197
|
+
|
|
198
|
+
Use the `%%manim` cell magic in Jupyter notebooks:
|
|
199
|
+
|
|
200
|
+
```python
|
|
201
|
+
%%manim -qm -v WARNING MyScene
|
|
202
|
+
class MyScene(Scene):
|
|
203
|
+
def construct(self):
|
|
204
|
+
circle = Circle()
|
|
205
|
+
self.play(Create(circle))
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
Flags work the same as CLI (`-qm`, `-ql`, etc.).
|
|
209
|
+
|
|
210
|
+
## Typical Development Workflow
|
|
211
|
+
|
|
212
|
+
```bash
|
|
213
|
+
# 1. Develop with fast preview
|
|
214
|
+
manim -pql scene.py MyScene
|
|
215
|
+
|
|
216
|
+
# 2. Check at medium quality
|
|
217
|
+
manim -pqm scene.py MyScene
|
|
218
|
+
|
|
219
|
+
# 3. Final render at high quality
|
|
220
|
+
manim -qh scene.py MyScene
|
|
221
|
+
|
|
222
|
+
# 4. Create GIF for sharing
|
|
223
|
+
manim --format gif -qm scene.py MyScene
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
## Best Practices
|
|
227
|
+
|
|
228
|
+
1. **Use -pql for development** - Fast iteration cycle
|
|
229
|
+
2. **Use -qh for final output** - Good quality, reasonable render time
|
|
230
|
+
3. **Use -s for thumbnails** - Quick last-frame capture
|
|
231
|
+
4. **Use -a sparingly** - Renders everything, can be slow
|
|
232
|
+
5. **Use --format gif for demos** - Easy to share and embed
|