Box2D テストベッドで RopeJoint を確認してください。さて、ここで別のヒントがあります。関節表示を有効にします。単なる回転ジョイント以上のものがあることを確認してください。
わかりました、説明します。
回転ジョイントは、ストレッチを最適に処理できるようには設計されていません。巨大なボックスでロープを乱すと、ロープの最初の数リンクが狂ったように飛び散り、修正しようとしていることがわかります。大きな力とトルクが適用されているため、彼らはこのように苦しんでいます。何がうまくいかなかったのかを正確に予測するのはかなり難しいと思いますが、基本的には、拘束システムに病的な状況をもたらしました.
何が起こっているかというと、タイムステップごとに計算される個々の修正力が大きすぎて、「ロープを安定させるには最後のリンクを近づける必要がある」という「情報」の伝達に非効率性があるということです。この情報は、タイムステップごとに 1 つのリンクを介して伝播します (または、より正確には、制約の反復ごとに 1 つのリンクがあり、タイムステップごとにこれらの一定数が実行されます)。
たとえば、box2d は次のようになります。
- うーん、最初の回転ジョイントのように見えますが、ロープの最初のリンク (リンク A) が本当に伸びているので、巻き上げるには巨大な力を加える必要があります
- これでリンク A が近くなりました。うーん、ロープのリンク B もかなり調子が悪いようです。リンク A とリンク C に大きな力を加えて、リンク A とリンク C を引き寄せて、この状況を調整します。
- うーん、リンク A をもう一度調整する必要がありますが、少なくとも以前よりは少し少なくなりました...ああ、リンク C も調子が悪いので、かなり大きな力を適用させてください (私たち人間には、間違った方向) リンク B で....
...そしてそれは延々と続きますが、もちろん実際にはそれよりもはるかに複雑で恐ろしいものです. しかし、Z をリンクするまでに、総補正力が無視できる程度にまで散逸している可能性があることがわかります。ビデオで見たものとほとんど同じです。これは、強制的に制約に違反したときに、単純なソルバー システムに起こることです。
さて、解決策は何ですか?
簡単な修正は、最後のリンクに最大距離 (box2d ではロープ ジョイントと呼ばれます) ジョイントを配置することです。実際、テストベッド アプリでは、そのロープ ジョイントをキーで切り替えることができるキーバインド トグルも実装しており、Jそれをオフにすると、まさにあなたが示した問題が発生します。
この最大距離ロープ ジョイントは、ロープの長さを保存する作業を多くの異なる制約に分散させるのではなく、実際のロープの不変条件の 1 つを明示的に強制する制約であるため、状況でのロープの動作が大幅に向上します。リンクがあるので。
その結果、それを伸ばすことはできません。示されているように、巨大なフリークボックスで一時的にそれを大きく妨害することはできますが、もう一方の端が決して行くことができない場所から遠く離れないようにすることを知っているため、はるかに簡単に跳ね返ります.
中央のリンクをロープの長さの半分よりも遠くに置くことはできないなど、より多くの制約を設定することも間違いなく役立ちます。アンカー、その制限がリンクの配置が与えられるべき場所に正確にあることを確認してください。それから、ボックスでそれに夢中になることができ、奇妙なことはほとんどありません. ここでのトレードオフは、2 倍の合計ジョイント コンストレイントが発生することです。