两个物体斜向接触时,相对运动可以分成沿接触法线和沿切线的两部分。只改变法线分量,就能构造一个没有摩擦的二维碰撞模型,而不必把整个速度向量都反向。
先把规则写清楚
本例法线n是单位向量,由物体A指向B,切线取负ny、nx。相对速度是B减A;其法线分量小于零才视为正在接近。冲量大小为负的(一加恢复系数)乘该分量,再除以两质量倒数之和。A减去冲量除质量乘法线,B加上相应项。
本例输入与推演结果
六组独立接触状态,长度和时间使用同一套单位,所有分数保留精确值。
输入质量、速度、法线、恢复系数 | 相对法线速度 | 冲量 | A后速度 | B后速度 | 动能前后 {'mass': [6, 1], 'a': [-2, 4], 'b': [-1, -2], 'n': ['3/5', '4/5'], 'e': '0'} | -21/5 | 18/5 | ['-59/25', '88/25'] | ['29/25', '22/25'] | 125/2→2747/50 {'mass': [2, 2], 'a': [0, -2], 'b': [4, 2], 'n': ['0', '1'], 'e': '1/2'} | 4 | 0 | ['0', '-2'] | ['4', '2'] | 24→24 {'mass': [3, 4], 'a': [-5, -3], 'b': [3, 0], 'n': ['3/5', '4/5'], 'e': '1'} | 36/5 | 0 | ['-5', '-3'] | ['3', '0'] | 69→69 {'mass': [7, 6], 'a': [0, -4], 'b': [-1, 4], 'n': ['3/5', '4/5'], 'e': '0'} | 29/5 | 0 | ['0', '-4'] | ['-1', '4'] | 107→107 {'mass': [6, 7], 'a': [3, -2], 'b': [-3, -4], 'n': ['1', '0'], 'e': '1/2'} | -6 | 378/13 | ['-24/13', '-2'] | ['15/13', '-4'] | 253/2→2155/26 {'mass': [4, 6], 'a': [-2, -1], 'b': [2, -4], 'n': ['4/5', '-3/5'], 'e': '1'} | 5 | 0 | ['-2', '-1'] | ['2', '-4'] | 70→70这里的编号只用来辨认本例中的对象,不能当成另一份记录里的固定身份。阅读表格时先找到输入,再顺着运算顺序对照输出;空列表、零值和不存在的结果有不同含义,不能混用。表中分数保留精确值,小数显示仅为阅读方便。
怎样自己复核
逐项比较碰撞前后总动量,两个坐标方向都应保持。碰撞后的相对法线速度应是原值乘负恢复系数,而各物体切线速度不变。恢复系数在零到一之间时,总动能不能增加;正在远离的两物体不再施加冲量。
练习时分别把恢复系数设为零和一,观察法线相对速度与能量变化。质量很大的一方速度变化较小,但本例质量都有限,不能直接把其中一个当成完全不动的墙。若法线不是单位向量,必须先调整公式,不能照搬这里的数值。
适用范围
这是一次已经确定接触方向的速度响应,不负责寻找首次接触时刻、修正穿透或处理旋转。没有摩擦意味着切向冲量为零,不意味着两个物体原本没有切向速度。
本例是一套可复现的游戏机制练习,不依赖具体品牌或某个软件的默认设置。修改任何边界约定、输入参数或操作顺序后,应重新推演并保存中间状态。发现差异时先定位第一处不一致,再判断是规则不同还是计算错误,不要只把最终答案调整到看起来相同。
