我一直在研究刚体模拟,我仍然不知道如何处理这个问题。 (我使用离散碰撞检测并使用LCP来解决每个接触点的脉冲。)
想象一下固定碗(以C为中心的半球)和碗边缘的颗粒。颗粒在表面上向下滚动到碗的内部。并且在某个时间步长,应该有一个接触点A,并且LCP求解器将给出结果脉冲,使得粒子的速度垂直于矢量CA.但是在更新了一个时间步之后,粒子会沿着这个速度移动一点点并实际上从碗中走出来,经过几个时间步后事情变得更糟。当我使用立方体而不是颗粒时,立方体可以穿透并沉入碗中。
有没有办法避免这种情况?脉冲方法并不完美,碰撞响应后仍然可以穿透。我需要以某种方式纠正穿透,但只是在接触点沿着表面法线移动物体不是一个好主意,因为它可以产生新的穿透。
编辑:
不是碗太薄或时间步长太大的问题。原因是欧拉积分产生多边形而不是圆形。而且我们不能只修改这两个对象的位置,因为如果另一侧有第三个对象,则对象2和3可能会有新的穿透。我认为一种方法是根据穿透深度增加一些弹力,但它不够整洁。
非常感谢您查看Bullet源代码,并对其进行处理。
答案 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大小的立方体空间