使用Manim制作哥特玫瑰裙动画

这段代码使用 Manim 数学动画库创建了一个名为“哥特玫瑰裙”的三维参数曲面可视化。其核心是通过包含正弦和余弦函数的参数方程生成大量空间点云,这些点的分布规律模拟了带有复杂褶皱纹理的裙摆形状。代码设置了环绕相机旋转和整体缩放动画,让观众能从各个角度观察曲面的细节,同时在屏幕角落固定显示数学公式,将抽象的数学表达式与直观的视觉图形结合在一起,体现了数学的艺术美感。

来看代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
from manim import *
import numpy as np

class GothicRoseSkirt(ThreeDScene):

def construct(self):

self.set_camera_orientation(phi=75 * DEGREES,
theta=-90 * DEGREES,
distance=10)

# 公式显示
formula = MathTex(
r"\begin{cases}",
r"x = \sin u \cdot (15\sin v - 4\sin 3v) \\",
r"y = 8\cos u \\",
r"z = \sin u \cdot (15\cos v - 5\cos 2v - 2\cos 3v - \cos v)",
r"\end{cases}",
font_size=28,
color=YELLOW
).to_corner(UL).set_opacity(0.8)

self.add_fixed_in_frame_mobjects(formula)

def parametric_surface(u, v, scale_factor):
x = np.sin(u) * (15 * np.sin(v) - 4 * np.sin(3 * v))
y = 8 * np.cos(u)
z = np.sin(u) * (15 * np.cos(v) - 5 * np.cos(2 * v) - 2 * np.cos(3 * v) - np.cos(v))
return np.array([x * scale_factor, y * scale_factor, z * scale_factor])

points = VGroup()
u_samples = 40
v_samples = 80
scale_factor = 0.14
color = RED

for i in range(u_samples):
u = (i / u_samples) * PI
for j in range(v_samples):
v = (j / v_samples) * 2 * PI
position = parametric_surface(u, v, scale_factor)
radius = 0.03
dot = Dot(position, radius=radius, color=color)
points.add(dot)

self.add(points)

self.begin_ambient_camera_rotation(rate=0.5)

# 修复:保存原始位置,缩放后恢复
original_positions = [dot.get_center() for dot in points]

for i in range(4):
# 缩放动画
self.play(points.animate.scale(1.2),
run_time=3.14,
rate_func=there_and_back)

# 每次循环后恢复位置(可选)
if i < 3: # 最后一次不需要恢复
for dot, orig_pos in zip(points, original_positions):
dot.move_to(orig_pos)

self.stop_ambient_camera_rotation()

来看代码演示的效果,3D类的视频,一般都是时间段体积大,涉及网络加载的原因,估计会影响到播放效果:

涉及到的参数方程

1
2
3
x = sin(u) * (15sin(v) - 4sin(3v))
y = 8cos(u)
z = sin(u) * (15cos(v) - 5cos(2v) - 2cos(3v) - cos(v))

好了,今天的教程就到这里,感谢大家来到老刘博客。