【发布时间】:2015-01-04 12:07:08
【问题描述】:
主要问题是 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
NB 使用 btAdjustInternalEdgeContacts 并没有任何明显的帮助,尽管正确设置了 tri info 并验证了代码 is 执行是否正常。虽然它确实工作并且对模拟的可靠性有一些小的改进(尽管 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
【问题讨论】:
标签: 3d geometry physics collision bullet