主要问题是 Bullet 2(具体来说是 2.82 - 也许 Bullet 3 还没有检查过它)糟糕地处理边缘碰撞,产生倾斜的反应法线。
测试用例 1:一个小的btBoxShape
,定位 (0,9,0),垂直对齐,落在另一个盒子的(btBoxShape
也由它制成)面上,并列。法线计算正确,碰撞仅发生在 Y(垂直)轴上。盒子在 OY 轴上轻微反弹并保持围绕它的中心。
测试用例 2:一个小盒子,位于 (0,9,0) 垂直对齐,(同上)落在另一个盒子的面上,(这次btBvhTriangleMeshShape
由 2 个共面三角形组成),也对齐。法线计算不正确,碰撞发生在所有轴上。盒子反弹到一边,有时(取决于特定的碰撞坐标)非常明显。
即使对法线进行硬编码并基于它重新计算碰撞点(见下文)也无济于事。
//newNormal was set to hard-coded value of (0,-1,0) before
cp.m_normalWorldOnB = colObj0Wrap -> getWorldTransform().getBasis() * newNormal;
cp.m_positionWorldOnB = cp.m_positionWorldOnA - cp.m_normalWorldOnB * cp.m_distance1;
cp.m_localPointB = colObj0Wrap -> getWorldTransform().invXform( cp.m_positionWorldOnB
尽管正确设置 tri info 并验证代码执行正常,但使用 NBbtAdjustInternalEdgeContacts
并没有任何明显的帮助。虽然它确实有效并且对模拟的可靠性有一些小的改进(尽管 CPU 成本很高),但它仍然不能解决这个特定问题。
问题是:如何修复案例 2 的行为以匹配案例 1。任何如何避免这种情况的建议(欢迎使用代码),或者为什么这不能按应有的方式工作。
进一步参考:
https://github.com/bulletphysics/bullet3/issues/92
http://www.bulletphysics.org/Bullet/phpBB3/viewtopic.php?f=9&t=8113
https://bullet.googlecode.com/files/GDC10_Coumans_Erwin_Contact.pdf
https://code.google.com/p/bullet/issues/detail?id=27
http://www.bulletphysics.org/Bullet/phpBB3/viewtopic.php?f=9&t=4603