在参数曲面上行走测地线的交互式 3D 可视化。
理解曲面的空间中的弯曲形态是古典几何学习的难点。该可视化项目的主要目的是帮助微分几何学生建立对常见曲面几何直观,亦可作为几何爱好者的日常消遣。“寻找 K = 0”小游戏考验玩家对于曲面弯曲性质的整体理解。以第一人称视角在非定向曲面上行走,是非常有趣的体验,使用户直观感受法向量的内外反转。
习题:证明 Klein 瓶在 R^3 中的浸入一定存在 Gauss 曲率恰好为 0 的点。
作者的话:这是很久以前就在期待的一个项目,然而期末周时间实在仓促,只得实现这样一个基础版本,仍有较多改进空间。不过在双曲抛物面和 Klein 瓶上行走的体验确实令人印象深刻!
主要算法是较为朴素的步进式数值模拟,其中涉及各种数学计算。对边界条件的讨论需要细致,非紧曲面需要避免掉进虚空;紧曲面需要避免边界跳变。特别是不可定向曲面的法向量处理较为繁琐。
每个曲面由参数映射 𝝋: ℝ² → ℝ³ 定义。玩家在世界空间中的速度 v 是曲面上沿运动方向的单位切向量。每帧以固定弧长步进:
- 转向:绕法线 n 旋转 v,旋转角 = κ_g × ds(κ_g 由鼠标偏移决定)
- 步进:将 v 转换为参数方向 (ds, dt),更新参数坐标 s ← s + ds·δ、t ← t + dt·δ
- 平行移动:步进后保持 ℝ³ 中的速度向量不变,投影到新位置的切平面上——即一阶近似的协变导数 ∇_γ' γ' = 0,这正是测地线方程的解
- 球坐标曲面(球面、椭球面):走到极点时反射 s 参数、经度移位 π,
ds取反使玩家沿对跖子午线离开 - 周期曲面(圆柱面、环面):s、t 自动绕回
- Klein 瓶:跨越 s 边界时同时翻转 t 和 dt,并反转法线符号以保持相机在外侧;每次跨越翻转鼠标控制符号(dirSign)以保持操控手感一致
作者的话:原本希望借助符号计算库实现自定义曲面。然而,随着工程进度的推进,需要考虑的问题变得多了起来:参数范围,曲面正则性检验,奇点局部数值算法的行为异常……出于鲁棒性考虑,该功能被暂时放弃了。这可能需要更好的思路和更细致的实现。
按下 Space 前进,移动鼠标控制测地曲率——鼠标在屏幕上的左右偏移量决定了路径向左或向右弯曲的程度。中心红色十字准星的旋转角速度正比于测地曲率。
点击左上角图标切换曲面,共 9 种:
| 曲面 | 参数方程 |
|---|---|
| 平面 | 𝝋(s, t) = (s, t, 0) |
| 单位球面 | 𝝋(s, t) = (sin s cos t, sin s sin t, cos s) |
| 椭球面 | 𝝋(s, t) = (1.6 sin s cos t, 1.0 sin s sin t, 0.8 cos s) |
| 椭圆抛物面 | 𝝋(s, t) = (s, t, s² + t²) |
| 双曲抛物面 | 𝝋(s, t) = (s, t, s² − t²) |
| 单叶双曲面 | 𝝋(s, t) = (cosh s cos t, cosh s sin t, sinh s) |
| 圆柱面 | 𝝋(s, t) = (cos s, sin s, t) |
| 环面 | 𝝋(s, t) = ((1.5 + 0.6 cos t) cos s, (1.5 + 0.6 cos t) sin s, 0.6 sin t) |
| Klein 瓶(浸入) | 𝝋(s, t) = ((3 + cos(s/2) sin t − sin(s/2) sin 2t) cos s, (3 + cos(s/2) sin t − sin(s/2) sin 2t) sin s, sin(s/2) sin t + cos(s/2) sin 2t) |
每帧的步进采用平行移动近似:世界空间的速度向量保持不变,步进后只投影到新位置的切平面。
- 球坐标曲面的南北极穿越:走到极点时反射 s 参数、经度移位 π,
ds取反使玩家沿对跖子午线离开 - 周期参数的曲面(圆柱面、环面):s 和 t 自动绕回
- Klein 瓶的拓扑环绕:跨越 s 边界时同时翻转 t 和 dt,并反转法线符号以保持相机在外侧
左上角实时显示:
- 当前曲面名称与参数方程 𝝋(s, t)
- 当前参数坐标 (s, t)
- 测地曲率 κ_g(鼠标控制值)
- 法曲率 κ_n(沿运动方向)
- Gauss 曲率 K
- 平均曲率 H
- Three.js 3D 渲染
- 纯前端,零依赖构建(ES Module via esm.sh)
切换到 Klein 瓶 模式,在曲面上步行探索。当你恰好站在 Gauss 曲率 |K| < 0.001 的位置时,屏幕中央会弹出 "Congratulations" 提示。
每次选择 Klein 瓶只会触发一次,切换其他曲面再回来可重新挑战。
大部分不涉及核心数学逻辑的工程性代码由 DeepSeek V4 Flash 完成,其漏洞经过人工检查和修复,代码功能和安全性得到人工测试。