自己写的简单物理引擎中遇到的一个微妙的不知如何在标题简述清楚的问题?

pngx
  • 87


如gif, 在地面上摆放完全相同的刚体, 但右下的刚体旋转了90°, 结果明明其它条件都完全一致这个右下的刚体就明显的抖动了起来, 怎么也想不到为什么会产生这种问题.....

图中红色的点是根据图形重叠的部分裁剪出的碰撞点

我实现碰撞反馈的方式和box2d基本是相同的
对于每个碰撞点都仅考虑这一个碰撞点和两个刚体, 根据两个刚体的速度/质量/碰撞点坐标求出在该点两个刚体对对方造成的碰撞冲量, 对两个刚体都立即施加这个碰撞冲量改变速度, 依次对所有碰撞点都如此操作; 然后在同一帧内重复以上步骤n次直到最后每次迭代中每个碰撞点上产生的碰撞冲量都足够小
对多个相互接触的物体来说碰撞是相互影响的, 每次仅考虑一对刚体求出的碰撞冲量实际上是不正确的, 但迭代很多次的话每次迭代的碰撞冲量都会逐渐趋近于0, 最后施加了碰撞冲量后的速度也会越来越接近正确的值

因为即使是在同一条边上的两个碰撞点计算和施加碰撞冲量都不是同时的, 于是即使放在平面上可能会产生受力不对称造成小幅度的旋转, 但只要迭代比较多次还是能消除这种误差的

像图里那样右下的刚体就是一直有小幅度的旋转, 可是不知道为什么经过很多帧的很多次迭代都没能把那个小幅度旋转消除

而且这种情况只对特定的角度和特定尺寸数值的刚体才会出现, 其它条件都是相同的, 把裁剪出的碰撞点/碰撞法线方向/嵌入深度之类图形上的数值输出也没找到什么问题, 误差离double的精度还比较远, 把和图形相关的position correct关掉这个问题也依然出现, 感觉完全没道理啊.....
把迭代精度设高会好一些, 但是迭代次数也会涨好几倍, 堆叠一多还是没能消除抖动

为什么仅仅改了个放置方向碰撞冲量就变得很难收敛了呢, 可能的原因有哪些呢?

一开始以为是canvas对某些特定的数值画线时刚好遇到斜率变动大的地方, 但仔细观察之后不仅仅是在抖动而是真的会慢慢位移.....


试着给刚体创建一个边长是20的正方形为形状, 直接放在平面上, 在其中两条平行的边贴地的情况下会发生抖动
改成创建一个边长是20的"正菱形"为刚体形状, 把刚体变换矩阵角度设置成45°, 然后完全不会有抖动现象
(我: ?????)

回复
阅读 3k
1 个回答

推测:计算机有精度问题,很接近0的时候,应该直接将值设置为0,否则计算精度误差会引起抖动

宣传栏