我儿子August喜欢捏捏乐。他能花很长时间反复捏,比较哪一个回弹更慢,挑出最软的那个,再决定哪一个手感更好。他对我在电脑上做的东西通常没什么兴趣。
所以看到「为朋友而做」这个主题时,我决定不解决又一个开发者问题,而是给他做点东西:Squishy Lab,一个浏览器里的捏捏乐游乐场,数字捏捏乐真的会变形,会留下凹痕,再慢慢弹回原状。
一开始只是一个紫色团子,后来有点收不住了。
十个捏捏乐,各有各的手感
现在里面有十个捏捏乐,包括麻薯、草莓、香蕉、猫、奶酪和花生。它们可以有不同的表面质感和表情,你可以把自己的话印上去,选字体和颜色,听到随压力变化的「凝胶」或「脆脆」音效,还能把结果导出成PNG。
但对我来说最重要的部分,是August真的喜欢它。他已经决定要让他的朋友们都来试试。
这大概是我能收到的最好的用户测试了。
项目完全开源,代码放在GitHub上,也有可以直接玩的线上版本。
不是缩放动画,是软体模拟
我不想让捏捏乐效果只是一个缩放动画或者着色器把戏。每个物体下面都跑着一个小型体积软体模拟:一个216个粒子、750个四面体的XPBD笼子,驱动Three.js里一个焊接好的5402个顶点的表面。
压力是局部的。按得越久,凹痕会逐渐加深、变宽;不同材质抵抗压缩的方式不一样;一个延迟的变形状态让泡沫有了缓慢恢复的感觉。物理以固定的120 Hz运行,而可见的表面、文字和小细节都跟着变形的身体走。
Blender被用作部分形状和细节的制作工坊,但运行时并不需要它。实际体验完全在浏览器里跑。
AI站在确定性系统之上
AI是叠在那套确定性系统之上的,而不是取代它。
用户可以写一句:「让它更硬一点,但保持同样的颜色,并且让它慢慢恢复。」然后一个开放权重模型会把这句话翻译成一小段经过验证的材质补丁。
流程是这样的:
- 自然语言
- 开放权重模型
- 经过验证的材质规格
- 确定性编译器
- 软体模拟
换句话说,自然语言负责表达意图,模型负责把它变成可校验的参数,真正决定手感的还是那套跑在浏览器里的物理模拟。
整个项目从「给儿子做一个」开始,最后变成了一个能捏、能听、能印字、能导出的小工具。而它最好的验证方式,就是August已经替它找好了第一批用户——他的朋友们。
热门跟贴