最近这几天,我可算是被一个看着特别简单,但实际把我折磨得够呛的问题给绊住了。我不是寻思着给我家那小侄子弄个小小的电脑游戏玩玩嘛就那种特简单的碰撞球弹射游戏,跟小时候玩的弹珠台差不多。
我寻思着,这有什么难的?两个圆球互相碰一下,换个方向跑,初中物理知识!结果我把代码敲进去,模型拉运行一看——我操!那球撞上去简直是群魔乱舞。

有的球穿模了,直接从另一个球中间过去了;有的撞上去直接原地爆炸,速度方向乱七八糟;最离谱的是,一个慢悠悠的球撞了一个停着的球,结果慢球不动了,停着的球以光速飞走了。我当时就懵了,这他妈跟实际情况完全不一样!
起因:被一个八岁小孩嘲笑了
我为啥这么执着要搞明白?因为我那侄子,他玩了一会儿就扔了,撇着嘴说:“叔叔,你这球是纸糊的吗?撞一下都不弹的。”

我当时那个老脸,简直挂不住。我好歹也是个搞了这么多年技术的,被一个八岁小孩用物理常识给鄙视了。我决定,当天晚上不睡觉了,必须把“碰撞球”这个听起来像幼儿园课题的东西,彻底研究透。
实践过程:从桌上弹珠到数字逻辑
我立马开始搞我的“实物对比实验”:

- 第一步:找参照物。 我把家里的台球杆和台球都搬出来了。台球是最好的参照,因为它够硬,撞击起来能量损失小,轨迹清楚。
- 第二步:观察重点。 我用手机的慢动作功能拍,看两个球撞击那一瞬间,到底发生了什么。我发现,两个球撞击,它们的速度和方向马上就换了。关键是,它们俩在撞击前后的“总推力”好像没怎么变。
- 第三步:寻找核心原理。 我把那些专业的物理名词比如“动量守恒”“弹性碰撞”全过滤掉,只看那些老程序员或者物理爱好者是怎么用人话解释的。我总结出来,就两个核心点在起作用。
简单几句话帮你快速理解
我跟你说,你别管什么公式,就记住这两句话,你就明白了:
第一句话:碰撞前后的“总推力”永远一样(动量守恒)。
你可以把速度乘以质量看成是这个球的“推力”。两个球撞之前,你把它们的“推力”加起来,得到一个总数。它们撞完了,这个总数一点都不会变。只是这两个球重新分配了推力。A把推力传给B,B把推力传给A,总量不变。这就是为什么台球打出去,静止的球会跑,而打过去的球会停住——它的推力全传过去了。
第二句话:撞击要看它们“弹性的程度”(能量损耗)。
这个最关键,它决定了你的球是不是一个“死球”。台球、钢球,它们撞击时变形很少,能量几乎都用来让它们弹开了,所以它们是“高弹性”。如果撞击时,能量都用来形变了(比如撞击声、摩擦热,或者球自己压扁了),那这部分能量就废了,球自然就弹不动了。专业上叫“恢复系数”,你只要记住,系数越接近1,球就越能弹。我一开始就是把这个系数设得太低了,球一撞就跟撞在泥巴上一样。
我根据这两点,回去把代码里的动量分配和弹性系数重新调整了,尤其是把弹性系数拉到了0.95以上。结果,我的小游戏里的碰撞瞬间就真实了!
我那侄子回来玩的时候,这回满意了,还问我:“叔叔,你怎么突然把这个弄好了?”我当时就装出一副云淡风轻的样子,回他:“这是叔叔的绝活,你个小孩不懂。”
通过这事儿我发现,很多看似高深的技术和原理,只要你肯花时间,用最土的办法去实践和简化,总能找到那个能让人听懂的“人话”解释。别被那些公式和术语给吓跑了!

