import numpy as np
self.play(
Create(cut_edge_line := Line(
start=np.array([-2, -0.5, -1]) + DOWN * 0.3,
end=np.array([-2, 0.5, -1]) + DOWN * 0.3,
color=YELLOW,
stroke_width=2,
)),
Write(cut_label),
run_time=1.5,
)
self.wait(1)
# 旋转展示
self.begin_ambient_camera_rotation(rate=0.3)
self.wait(2)
# 8. 自动演示拓扑变换(简化的动画)
# 创建一个小球体代表空间点
point = Sphere(radius=0.1).set_color(RED)
point.move_to(klein_bottle_func(0, 0))
self.play(FadeIn(point))
# 让点沿着瓶面移动
self.play(
UpdateFromAlphaFunc(
point,
lambda m, a: m.move_to(klein_bottle_func(2 * np.pi * a, 0))
),
run_time=3,
)
# 9. 循环展示
self.play(
FadeOut(cut_edge_line),
FadeOut(cut_label),
FadeOut(point),
*[strip.animate.set_opacity(0.8) for strip in strips],
run_time=2,
)
# 展示最终结构
self.play(
Rotate(strips, angle=2 * np.pi, axis=UP),
run_time=4,
rate_func=rate_funcs.smooth,
)
self.begin_ambient_camera_rotation(rate=0.2)
self.wait(3)
# 停止旋转并等待
self.stop_ambient_camera_rotation()
self.wait(1)
# 淡出所有元素
self.play(
*[FadeOut(mobj) for mobj in self.mobjects if mobj not in [title]],
title.animate.set_opacity(0),
run_time=2,
)
self.play(FadeOut(axes))
# don't remove below command for run button to work
%manim -qm -v WARNING KleinBottleScene
一、克莱因瓶的数学模型
1.1 克莱因瓶的拓扑定义
克莱因瓶(Klein Bottle)是德国数学家菲利克斯·克莱因(Felix Klein)于1882年提出的单侧闭曲面,它是最基本的不可定向曲面之一。
拓扑学定义:克莱因瓶是由一个圆柱体经过以下操作构造而成:
核心性质:克莱因瓶内部与外部连通,没有明确的内外之分(不可定向性)。
1.2 参数方程
克莱因瓶在三维空间中的标准参数方程为:

其中:
- u \\in [0, 2\\pi)\\):绕瓶体一周的角度
- r > 0\\):瓶身主半径(本代码取 \\(r=2\\))
该方程对应的几何结构可分解为三个阶段:
二、代码实现的数学原理
2.1 参数化函数设计
def klein_bottle_func(u, v):
"""克莱因瓶参数方程"""
x = (r + np.cos(u/2)*np.sin(v) – np.sin(u/2)*np.sin(2*v)) * np.cos(u)
y = (r + np.cos(u/2)*np.sin(v) – np.sin(u/2)*np.sin(2*v)) * np.sin(u)
z = np.sin(u/2)*np.sin(v) + np.cos(u/2)*np.sin(2*v)
return np.array([x, y, z]) + UP*0.5
数学分析:
- 系数 r+cos(u/2)sinv−sin(u/2)sin2vr+cos(u/2)sinv−sin(u/2)sin2v 决定了瓶体的径向距离
- \\cos(u/2)\\) 和 \\(\\sin(u/2)\\) 项产生半频率调制,这正是莫比乌斯带扭转特性的体现
2.2 参数域划分
| u | 圆周角 | [0,2π] | 绕瓶体轴线旋转 |
| v | 母线参数 | [0,4π] | 形成双层结构 |
采样策略:代码将 vv-范围 [0,4π]划分为7段(每段宽为 ),用于创建7种不同颜色的色带,增强拓扑结构的可视化效果。
三、代码模块功能详解
3.1 场景配置模块
class KleinBottleScene(ThreeDScene):
def construct(self):
self.camera.background_color = BLACKBOARD_GREEN
self.set_camera_orientation(phi=70°, theta=-35°, zoom=0.85)
| background_color | 设置场景背景色(黑绿色),模拟物理黑板 |
| phi=70° | 相机俯仰角(相对于水平面的角度) |
| theta=-35° | 相机水平旋转角(逆时针为负) |
| zoom=0.85 | 相机缩放系数(0.85倍) |
3.2 二维界面固定模块
self.add_fixed_in_frame_mobjects(title, group1, group2, group3)
该调用将四个信息组固定在屏幕坐标系上,不受三维相机旋转的影响,确保文字始终面向观众。
3.3 三维坐标轴创建模块
axes = ThreeDAxes(
x_range=[-4, 4, 1], # x:从-4到4,刻度间隔1
y_range=[-4, 4, 1], # y:从-4到4,刻度间隔1
z_range=[-3, 3, 1], # z:从-3到3,刻度间隔1
x_length=7, # 显示长度7单位
y_length=7,
z_length=5,
)
颜色渐变设置:
for axis in [axes.x_axis, axes.y_axis, axes.z_axis]:
axis.set_color(color=[RED, WHITE, RED])
- 每条轴使用红-白-红渐变着色
- 渐变色数组在Manim中自动插值
3.4 文本与公式生成模块
| Text() | 纯文本 | 无数学公式支持 | 标题、标签 |
| MathTex() | LaTeX公式 | 数学渲染 | 参数方程(eq1) |
| MarkupText() | 富文本 | 支持\\n换行 | 性质清单(eq2, eq3) |
示例说明:
eq1 = MathTex(
r"x = \\cos u \\left( r + \\cos\\frac{u}{2} … \\right)\\\\", # 第一行
r"y = \\sin u …\\\\", # 第二行
r"z = …", # 第三行
)
- MathTex 中,\\\\ 表示换行,保持等距排列
- \\\\left(…\\\\right) 实现自适应用括号
3.5 表面构建模块
Simulated 表面构建代码如下(原代码未显示完整但基于Manim惯例):
surface = Surface(
lambda u, v: klein_bottle_func(u, v), # 参数方程
u_range=[0, 2*PI], # u参数范围
v_range=[v_min, v_max], # v参数范围(分段)
resolution=(32, 16), # 网格分辨率
fill_opacity=0.7, # 表面不透明度
stroke_width=0.1, # 网格线宽度
fill_color=color, # 表面填充色
)
核心参数解析:
| resolution=(32,16) | 在u方向32个采样点,v方向16个采样点 | 控制网格细密度 |
| fill_opacity=0.7 | 表面填充不透明度为0.7 | 使表面半透明,可见内部结构 |
| stroke_width=0.1 | 网格线条宽 | 显示线框架构 |
| fill_color | 单色填充 | 7种颜色之一 |
3.6 动画创建模块
推断动画序列:
# 1. 创建坐标轴
self.play(Create(axes), run_time=0.5)
# 2. 逐条显示色带
for strip in strips:
self.play(Create(strip), run_time=0.3)
# 3. 相机旋转
self.begin_ambient_camera_rotation(rate=rate_funcs.linear)
self.wait(3)
- Create(): 显示对象的轮廓并逐步填充
- begin_ambient_camera_rotation(): 自动旋转相机,速率函数为线性(恒定速度)
四、关键数学算法解释
4.1 莫比乌斯带的推广
克莱因瓶本质上可看作两个莫比乌斯带的边界粘合的产物。代码中的参数包含:
4.2 自交结构
当 u=0 且 v=2π时,zz分量首先对 sin 项使表面自身穿透,形成所谓的“瓶颈”自交区域。在数学上,r=2 的选择避免了参数等价点造成的退化。
五、代码优缺点分析
优点
待改进处
六、结语
本文通过数学方程与Manim可视化实现了克莱因瓶的三维展示,核心在于将拓扑学定义转化为精确的参数化方程,并利用Manim强大的3D表面渲染能力呈现了该不可定向曲面的奇异特征。该代码既是数学教学的直观工具,也是三维视化技术的典型应用案
网硕互联帮助中心


评论前必须登录!
注册