刚体动力学渗透校正

时间:2017-01-15 07:15:37

标签: simulation physics game-physics physics-engine rigid-bodies

我一直在研究刚体模拟,我仍然不知道如何处理这个问题。 (我使用离散碰撞检测并使用LCP来解决每个接触点的脉冲。)

想象一下固定碗(以C为中心的半球)和碗边缘的颗粒。颗粒在表面上向下滚动到碗的内部。并且在某个时间步长,应该有一个接触点A,并且LCP求解器将给出结果脉冲,使得粒子的速度垂直于矢量CA.但是在更新了一个时间步之后,粒子会沿着这个速度移动一点点并实际上从碗中走出来,经过几个时间步后事情变得更糟。当我使用立方体而不是颗粒时,立方体可以穿透并沉入碗中。

有没有办法避免这种情况?脉冲方法并不完美,碰撞响应后仍然可以穿透。我需要以某种方式纠正穿透,但只是在接触点沿着表面法线移动物体不是一个好主意,因为它可以产生新的穿透。

编辑:

不是碗太薄或时间步长太大的问题。原因是欧拉积分产生多边形而不是圆形。而且我们不能只修改这两个对象的位置,因为如果另一侧有第三个对象,则对象2和3可能会有新的穿透。我认为一种方法是根据穿透深度增加一些弹力,但它不够整洁。

非常感谢您查看Bullet源代码,并对其进行处理。

1 个答案:

答案 0 :(得分:0)

计算一个步骤,获得所有粒子的渗透。计算穿透点出现的球面概率,反映出表面的出现概率,删除穿透概率,从局部概率图中减去其他粒子的概率,将粒子置于最高概率点。

示例:

   o --->   |  

            |        o      penetrated to here

            | %5 %50 %90

 %90 %50 %5 |

 o          |

它左边和右边的概率是相同的(大约%80)所以它现在是静止的,所以它是非弹性碰撞。

现在假设有第二个粒子

  o ---> o  |

         o  |       o      penetrated here

     -100%  | %5 %50 %90

 %90 %0 %-45|

  o      o  | 

因此粒子从其他粒子反弹回来,这些粒子也从墙壁反弹回来,但是它的动量又回到了第一个粒子。然后,左侧的概率更大,因此其最终速度为“左侧”。对所有穿透的颗粒(仅应该是几个?)进行连续处理。

从所有其他粒子概率图中减去N粒子N * M概率,这是N * N * M次操作,其中M是K×L * M的K乘L大小的立方体空间