跑在自写求解器上的物理游戏。
Verlet Voyage 是给 6 到 10 岁孩子玩的物理冒险游戏。它跑在我从零写的 Verlet 积分系统和碰撞引擎上,所以里面的东西会拉长、弹起、变形,不像刚体那样硬邦邦的。玩家带着 Golf 穿过一关关手工做的关卡去找 Orb,靠动手尝试弄明白因果,全程没有文字说明。
画面是风格化的 3D,渲染成 2D 的样子。没有任何说明文字,能试什么,靠画面和物理反应提示。每一关都是一个小小的物理游乐场。
它也是我毕业论文的实践部分。论文讨论的是物理反馈和孩子的能动感。
“原创 / 未用网络素材”这句话,指的是核心算法、素材、交互和模型,这些都是我自己做的。音乐和天空盒材质不算在内。
可供性、情感、MDA。
理论背景
- 可供性理论:从 Gibson 的生态心理学到 Norman 在 HCI 里的用法:视觉和材质上的线索怎么暗示人可以做什么,尤其是在给孩子做的、不靠语言的界面里。
- 情感设计:一个系统不用文字,只靠自己的行为和反应,怎么把情感传出去。
- MDA:机制、动态、美学这套框架,用来把底层的 Verlet 模拟,和涌现出来的玩法、游戏的手感连起来。
比较分析
研究了 Angry Birds、Getting Over It 和 World of Goo,看不同的物理模型怎么影响玩家的能动性和情绪基调。
用自写物理代替刚体
- Verlet 积分,模拟粒子和连在一起的点,让它们的运动随时间推进依然自然。
- 约束求解,把各点的相对位置守住,同时留出柔韧和变形的余地。
- 碰撞检测,自己写的,不用引擎自带的碰撞体,专门处理柔软、弹性和撞击时的表现。
模拟我调了很多轮,为的是让年纪小的玩家玩起来轻快,也容得下失误。
Verlet 和 Euler,放在一起看
物理引擎推着每个点往前走,一次走一小步时间。最简单的算法是显式 Euler 法:用上一步的位置和速度,算出下一步的。放到弹簧上,这样每走一步都会多出一点能量,振动越来越大,最后物体散架。Verlet 积分不一样,它记住每个点现在的位置和上一步的位置,速度由这两个位置算出来。弹簧的能量不会越滚越多;而且因为速度是从位置推出来的,游戏可以直接把点挪到该在的地方,把物体拢在一起。Golf 就是靠这样保持形状的。
显式 Euler
Verlet
交互与关卡。
以玩家为中心的交互
操作简单,没有文字和教程,物理反应做得细。
物理就是表达
拉长、弹起、晃动,都调过,为的是不用一个字就把因果讲清楚。
涌现式玩法
每一关不止一种过法。线索藏在画面和物理里,路要玩家自己找。
操作与发射
像拉弹弓:玩家从 Golf 身上往后拖,朝想去的反方向松手。发射的力全部来自自写求解器里的张力、弹性和软体回弹。
- 瞄准:点住或按住拖动,一条虚线指出预计的轨迹。
- 张力:线拉得多长,力就多大。长线甩得猛,短线只轻轻一推,方便精确控制。
- 松手:Golf 起飞时微微变形,然后弹回原形,撞到东西也有自然的反应。
十关的节奏

- 第 1、2 关,入门:简单的发射,宽松的布局,先建立信心。
- 第 3、4 关,弹跳场:带角度的表面和反弹。
- 第 5、6 关,动态弧线:预判运动,顺着弧线瞄准。
- 第 7、8 关,软约束区:靠变形和弹性挤过去。
- 第 9、10 关,综合解谜:前面所有东西合在一起。
视觉与 UI
整个世界由圆润的形状搭成(圆、弧、平滑的曲线),和有弹性的物理配得上。弹跳板和能变形的区域用明暗、饱和度和形状区分出来,不用另加说明。UI 以图标为主,文字很少。配色偏暖(橙、黄、奶油色),橙色的 Golf 和黑色的 Orb 对比强烈,视线自然落在他们身上。
声音
声音方面:碰撞音效帮人听懂物理;界面音效确认操作、奖励进度;安静的背景音乐每一关略有变化。
2025 年 5 月,在 UCL BA Media 毕业展展出。
Verlet Voyage 在 2025 年 5 月的 UCL BA Media 毕业展上展出。观众在桌边用鼠标玩,画面显示在墙上挂着的屏幕上。桌上的平板显示标题画面,桌上和墙上摆着橙色和黑色的气球,正是 Golf 和 Orb 的颜色。



技术附录:求解器、关卡编辑器、着色器
求解器、编辑器、着色器。
核心系统

模拟循环是这样的:用户施力,球得到一个冲量。VerletBall 做积分和约束求解,更新自己。然后处理粒子和约束各自的碰撞。粒子位置更新。这个循环一直跑,直到球停下。
- 球体约束:定长约束加上自定义的弹性行为,保住形状和体积。
- 充气约束:可选的内压约束,受力时也让球保持圆鼓鼓的。
- 碰撞:和地面的碰撞,和静态几何体边缘的碰撞,和运动物体之间的动态碰撞。
场景由静态粒子(墙、钉子)、能被推动的动态粒子,以及把它们像弹簧一样连起来的约束搭成。反重力区和定向力加进来一些故意不写实的运动。
自写的关卡编辑器
瓦片地图和预制体拼装撑不起一个由物理驱动的世界,所以我在 ParticleController 组件里做了一个编辑器,直接在 Scene 视图里画碰撞环境。
- 按住不同的键放几何体:S 放一个静态粒子,当墙或锚点;A 放一个动态粒子,并连到上一个静态粒子;W 放一个独立的静态粒子。
- 点两个已有的粒子,就用一条约束把它们连起来。约束的类型、粗细、颜色和材质,可以按类型分别设置。
- 还有一个约束创建模式,复合结构或迷宫那样的结构,设计师可以手动定义连接关系。
- 关卡把位置、静态/动态状态和约束数据序列化成类似 JSON 的结构,方便复用。加载是故意延后的,等物理和渲染都准备好了再实例化。
着色器与效果
一个边缘着色器把物体的轮廓勾出来,让软软的、玩具一样的素材依然清楚好认。做法是用 Sobel 算子看相邻像素的亮度,分别求水平和垂直方向的梯度,合成边缘强度,再和物体本身的颜色混合。出来的是一条平滑、清楚的轮廓线,年纪小的玩家更容易看明白哪是哪。过关时有一个彩纸粒子系统,颜色随机,朝固定方向喷出来,作为奖励。
球的迭代

Alpha、beta、复盘。
Alpha 阶段的试玩测试是非正式的形成性测试,对象是目标年龄段的孩子。重点看孩子怎么理解软体的运动和物理反馈。交互上的改动都是从这里来的。
Beta 阶段测试的人更多了,改动也更大:关卡布局全部重做,发射系统重新设计以便更好地控制,还修了打断游戏流程的 bug。
做得好的
- 一套完全自写的 Verlet 积分和基于约束的物理系统,真的做出来了,没有用 Unity 的刚体引擎。
- 统一的 3D 转 2D 美术风格,小玩家看得清楚。
- 适合孩子的交互方式,建立在物理可供性上,几乎没有教程和文字。
- 原创的着色器和声音层,加强了触感反馈和情绪基调。
- 和孩子做的非正式 beta 试玩测试看来,操作是直观的,物理交互也带得出情感。
可以改进的
- 自写的碰撞系统不支持旋转和复合形状,谜题的复杂度因此受限。
- 关卡场景可以更多变一些,帮玩家认路。
- 第 4 关到第 6 关之间难度跳得太猛,让一些测试者很受挫。
- 小屏幕上的 UI 适配:早期的移动端版本里,有些按钮错位了。
- 故事太薄。加环境叙事或过场动画会好一些。
致谢
这是我的学位作品。感谢父母和朋友给的反馈,感谢 UCL 的老师们在学术和创作上的指导,特别是 William Sykes 先生和 Dane Sutherland 博士。