主な問題は、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 を使用しても、tri 情報を適切に設定し、コードがbtAdjustInternalEdgeContacts
正常に実行されていることを確認しても、目に見える形では役に立ちません。これは機能し、シミュレーションの信頼性をいくらか向上させますが (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