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,254 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: 3d
|
|
3
|
+
description: ThreeDScene, 3D objects, surfaces, and 3D camera
|
|
4
|
+
metadata:
|
|
5
|
+
tags: 3d, threedscene, surface, sphere, cube, camera
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# 3D Graphics in Manim
|
|
9
|
+
|
|
10
|
+
Create 3D visualizations with ThreeDScene.
|
|
11
|
+
|
|
12
|
+
## ThreeDScene Basics
|
|
13
|
+
|
|
14
|
+
```python
|
|
15
|
+
from manim import *
|
|
16
|
+
|
|
17
|
+
class Basic3D(ThreeDScene):
|
|
18
|
+
def construct(self):
|
|
19
|
+
# Set camera angle
|
|
20
|
+
self.set_camera_orientation(phi=75 * DEGREES, theta=-45 * DEGREES)
|
|
21
|
+
|
|
22
|
+
# Add 3D axes
|
|
23
|
+
axes = ThreeDAxes()
|
|
24
|
+
self.add(axes)
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Camera Orientation
|
|
28
|
+
|
|
29
|
+
```python
|
|
30
|
+
class CameraOrientation(ThreeDScene):
|
|
31
|
+
def construct(self):
|
|
32
|
+
axes = ThreeDAxes()
|
|
33
|
+
|
|
34
|
+
# phi: angle from z-axis (0 = top view, 90 = side view)
|
|
35
|
+
# theta: rotation around z-axis
|
|
36
|
+
# gamma: roll angle
|
|
37
|
+
|
|
38
|
+
self.set_camera_orientation(
|
|
39
|
+
phi=75 * DEGREES,
|
|
40
|
+
theta=-45 * DEGREES,
|
|
41
|
+
gamma=0
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
self.add(axes)
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### Animated Camera Movement
|
|
48
|
+
|
|
49
|
+
```python
|
|
50
|
+
class AnimatedCamera(ThreeDScene):
|
|
51
|
+
def construct(self):
|
|
52
|
+
axes = ThreeDAxes()
|
|
53
|
+
self.add(axes)
|
|
54
|
+
|
|
55
|
+
self.set_camera_orientation(phi=75*DEGREES, theta=0)
|
|
56
|
+
|
|
57
|
+
# Animate camera movement
|
|
58
|
+
self.move_camera(phi=45*DEGREES, theta=90*DEGREES, run_time=3)
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### Continuous Camera Rotation
|
|
62
|
+
|
|
63
|
+
```python
|
|
64
|
+
class RotatingCamera(ThreeDScene):
|
|
65
|
+
def construct(self):
|
|
66
|
+
axes = ThreeDAxes()
|
|
67
|
+
self.add(axes)
|
|
68
|
+
|
|
69
|
+
self.set_camera_orientation(phi=75*DEGREES, theta=0)
|
|
70
|
+
|
|
71
|
+
# Start ambient rotation
|
|
72
|
+
self.begin_ambient_camera_rotation(rate=0.2)
|
|
73
|
+
self.wait(5)
|
|
74
|
+
self.stop_ambient_camera_rotation()
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## 3D Primitives
|
|
78
|
+
|
|
79
|
+
### Sphere
|
|
80
|
+
|
|
81
|
+
```python
|
|
82
|
+
class SphereExample(ThreeDScene):
|
|
83
|
+
def construct(self):
|
|
84
|
+
sphere = Sphere(radius=1, resolution=(20, 20))
|
|
85
|
+
sphere.set_color(BLUE)
|
|
86
|
+
|
|
87
|
+
self.set_camera_orientation(phi=75*DEGREES, theta=-45*DEGREES)
|
|
88
|
+
self.add(sphere)
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### Cube / Prism
|
|
92
|
+
|
|
93
|
+
```python
|
|
94
|
+
class CubeExample(ThreeDScene):
|
|
95
|
+
def construct(self):
|
|
96
|
+
cube = Cube(side_length=2, fill_opacity=0.8)
|
|
97
|
+
cube.set_color(RED)
|
|
98
|
+
|
|
99
|
+
# Rectangular prism
|
|
100
|
+
prism = Prism(dimensions=[3, 1, 2])
|
|
101
|
+
|
|
102
|
+
self.set_camera_orientation(phi=75*DEGREES, theta=-45*DEGREES)
|
|
103
|
+
self.add(cube)
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### Cylinder / Cone
|
|
107
|
+
|
|
108
|
+
```python
|
|
109
|
+
class CylinderCone(ThreeDScene):
|
|
110
|
+
def construct(self):
|
|
111
|
+
cylinder = Cylinder(radius=1, height=2, fill_opacity=0.8)
|
|
112
|
+
cone = Cone(base_radius=1, height=2, fill_opacity=0.8)
|
|
113
|
+
|
|
114
|
+
cylinder.shift(LEFT * 2)
|
|
115
|
+
cone.shift(RIGHT * 2)
|
|
116
|
+
|
|
117
|
+
self.set_camera_orientation(phi=75*DEGREES, theta=-45*DEGREES)
|
|
118
|
+
self.add(cylinder, cone)
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### Torus
|
|
122
|
+
|
|
123
|
+
```python
|
|
124
|
+
class TorusExample(ThreeDScene):
|
|
125
|
+
def construct(self):
|
|
126
|
+
torus = Torus(major_radius=2, minor_radius=0.5)
|
|
127
|
+
|
|
128
|
+
self.set_camera_orientation(phi=75*DEGREES, theta=-45*DEGREES)
|
|
129
|
+
self.add(torus)
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
## 3D Axes
|
|
133
|
+
|
|
134
|
+
```python
|
|
135
|
+
class ThreeDAxesExample(ThreeDScene):
|
|
136
|
+
def construct(self):
|
|
137
|
+
axes = ThreeDAxes(
|
|
138
|
+
x_range=[-4, 4, 1],
|
|
139
|
+
y_range=[-4, 4, 1],
|
|
140
|
+
z_range=[-4, 4, 1],
|
|
141
|
+
x_length=8,
|
|
142
|
+
y_length=8,
|
|
143
|
+
z_length=6,
|
|
144
|
+
)
|
|
145
|
+
|
|
146
|
+
# Add axis labels
|
|
147
|
+
x_label = axes.get_x_axis_label("x")
|
|
148
|
+
y_label = axes.get_y_axis_label("y")
|
|
149
|
+
z_label = axes.get_z_axis_label("z")
|
|
150
|
+
|
|
151
|
+
self.set_camera_orientation(phi=75*DEGREES, theta=-45*DEGREES)
|
|
152
|
+
self.add(axes, x_label, y_label, z_label)
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
## Surface Plots
|
|
156
|
+
|
|
157
|
+
```python
|
|
158
|
+
class SurfacePlot(ThreeDScene):
|
|
159
|
+
def construct(self):
|
|
160
|
+
axes = ThreeDAxes(x_range=[-3, 3], y_range=[-3, 3], z_range=[-2, 2])
|
|
161
|
+
|
|
162
|
+
# Function z = f(x, y)
|
|
163
|
+
surface = axes.plot_surface(
|
|
164
|
+
lambda u, v: np.sin(u) * np.cos(v),
|
|
165
|
+
u_range=[-3, 3],
|
|
166
|
+
v_range=[-3, 3],
|
|
167
|
+
resolution=(30, 30),
|
|
168
|
+
colorscale=[BLUE, GREEN, YELLOW, RED],
|
|
169
|
+
)
|
|
170
|
+
|
|
171
|
+
self.set_camera_orientation(phi=75*DEGREES, theta=-45*DEGREES)
|
|
172
|
+
self.add(axes, surface)
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
### Surface Class (standalone)
|
|
176
|
+
|
|
177
|
+
```python
|
|
178
|
+
class SurfaceExample(ThreeDScene):
|
|
179
|
+
def construct(self):
|
|
180
|
+
def param_func(u, v):
|
|
181
|
+
x = u
|
|
182
|
+
y = v
|
|
183
|
+
z = np.sin(np.sqrt(u**2 + v**2))
|
|
184
|
+
return np.array([x, y, z])
|
|
185
|
+
|
|
186
|
+
surface = Surface(
|
|
187
|
+
param_func,
|
|
188
|
+
u_range=[-3, 3],
|
|
189
|
+
v_range=[-3, 3],
|
|
190
|
+
resolution=(30, 30),
|
|
191
|
+
fill_opacity=0.8,
|
|
192
|
+
)
|
|
193
|
+
surface.set_color_by_gradient(BLUE, GREEN)
|
|
194
|
+
|
|
195
|
+
self.set_camera_orientation(phi=75*DEGREES, theta=-45*DEGREES)
|
|
196
|
+
self.add(surface)
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
## 3D Parametric Curves
|
|
200
|
+
|
|
201
|
+
```python
|
|
202
|
+
class ParametricCurve3D(ThreeDScene):
|
|
203
|
+
def construct(self):
|
|
204
|
+
# Helix
|
|
205
|
+
curve = ParametricFunction(
|
|
206
|
+
lambda t: np.array([
|
|
207
|
+
np.cos(t),
|
|
208
|
+
np.sin(t),
|
|
209
|
+
t * 0.2
|
|
210
|
+
]),
|
|
211
|
+
t_range=[-4*PI, 4*PI],
|
|
212
|
+
color=YELLOW
|
|
213
|
+
)
|
|
214
|
+
curve.set_shade_in_3d(True)
|
|
215
|
+
|
|
216
|
+
self.set_camera_orientation(phi=75*DEGREES, theta=-45*DEGREES)
|
|
217
|
+
self.add(ThreeDAxes(), curve)
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
## Shading in 3D
|
|
221
|
+
|
|
222
|
+
```python
|
|
223
|
+
class Shading3D(ThreeDScene):
|
|
224
|
+
def construct(self):
|
|
225
|
+
sphere = Sphere()
|
|
226
|
+
|
|
227
|
+
# Enable shading for realistic lighting
|
|
228
|
+
sphere.set_shade_in_3d(True)
|
|
229
|
+
|
|
230
|
+
self.set_camera_orientation(phi=75*DEGREES, theta=-45*DEGREES)
|
|
231
|
+
self.add(sphere)
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
## Arrow3D and Line3D
|
|
235
|
+
|
|
236
|
+
```python
|
|
237
|
+
class Vectors3D(ThreeDScene):
|
|
238
|
+
def construct(self):
|
|
239
|
+
axes = ThreeDAxes()
|
|
240
|
+
|
|
241
|
+
arrow = Arrow3D(ORIGIN, [2, 1, 2], color=RED)
|
|
242
|
+
line = Line3D(ORIGIN, [-2, 1, 1], color=BLUE)
|
|
243
|
+
|
|
244
|
+
self.set_camera_orientation(phi=75*DEGREES, theta=-45*DEGREES)
|
|
245
|
+
self.add(axes, arrow, line)
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
## Best Practices
|
|
249
|
+
|
|
250
|
+
1. **Always set camera orientation** - Default view may not show 3D well
|
|
251
|
+
2. **Use set_shade_in_3d for realism** - Adds depth perception
|
|
252
|
+
3. **Use ambient camera rotation sparingly** - Can be disorienting
|
|
253
|
+
4. **Match resolution to detail needed** - Higher res = slower render
|
|
254
|
+
5. **Use colorscale for surfaces** - Shows elevation/value changes
|