エンジンは、物理エンジンで「フェーズロック」(同じ場所にある複数のオブジェクト)をどのように回避しますか?


8

最初にフェーズロックについて説明します。質量がゼロではない2つのオブジェクトが同じ空間を占めているが、エネルギーがゼロ(速度なし)である場合。

それらはゼロ速度解像度ベクトルで永遠にぶつかりますか、それとも外部の力が相互作用するまで一緒にロックされたままですか?

自作のエンジンで、キャラクターをツリーにロードして移動すると、衝突を通知して元の場所に戻ることに気づきました。これは、衝突が発生したときにインパルスを実装することで解決できたと思います。私の最後の場所(私の実装のようなもの)にジャンプするだけではありません。

しかし、私は自分のエンジンをより堅牢にしていますが、他のほとんどの物理エンジンがこのケースをどのように処理するかについて興味があります。移動速度のない同じ場所で始まるオブジェクトは、ランダムな方向に互いに発射するだけですか?または何かが起こるまで彼らはそこに座っていますか?一般的にどのオプションが最善のアプローチですか?


3
私は実際の実装について話すことはできません(したがって、回答ではなくコメントです)が、私の経験では、物理エンジンは通常、2つのオブジェクトをお互いからゆっくりと押し出します。たとえば、2つのボックスが互いに重なり合ってスポーンした場合、完全に分離するまでゆっくりと互いに押し離されます。これがどのように実装されるかについては、検討が必要です。
kevintodisco

ええ、私はこれを実装する方法についてそれほど多くを求めていないので、これはやや奇妙な質問だと思います。ご協力ありがとうございます。
C0M37

回答:


4

私はこの種の回答が無回答になると思います...

衝突の検出と解決に使用される実装と基本的なアプローチに依存する場合があると思います(剛体物理エンジンの80%のようです)。先日、自分で作った物理エンジンでこの問題にぶつかり、オブジェクトをNaN空間に投げ込んだだけなのです。

別のオブジェクトとまったく同じ場所にオブジェクトをスポーンさせましたが、どちらも同じ形状でした。この特定のケースでは、接触ジェネレータは非常に悪い値を作りました。接触の任意の値を選択することで修正しました(基本的に、小さい/軽いオブジェクトをまっすぐ上に押します)。しかし、これはかなりカットアンドドライなケースでした。

椅子がテーブルの内側にスポーンする場合、それらが飛んだり動けなくなったりするかどうかは、生成される接点に依存します。私の場合、私は制約ベースのシステムを使用していません(少なくともまだ使用していません)ので、オブジェクトは振動して眠りに落ちるのと同じくらい爆破する可能性があります。私が使用しているようなペネトレーション+インパルスシステムでは、醜いものすべてとそれがどのように発生するかを簡単に確認できます。制約ベースのシステムがこの問題をどのように解決するか、またはそれを検出するかどうか、私にはわかりません...介入なしでは制約に到達できないようであり、それらのタイプのエンジンに標準的な方法があるかどうかわかりません。

他の人が言うべきことは確かに賢いでしょうが、これはコメントするには長すぎました。


回答ありがとうございます。私はこの質問を、彼らが同じ状況に巻き込まれた場合に他の人が見つけるべき救命いかだのようなものとして質問したいと思いました。
C0M37 2012

Lol @PSpeed over here ^^
SHiRKiT

0

これは2つの方法で処理されます。

  1. 衝突可能なオブジェクト間のオーバーラップを修正する
  2. オブジェクトが衝突した場合にオブジェクトを押し離す「通常の」力を生成します。

ただし、これは速度/時間を区別する場合にのみ機能します。タイルベースのゲームでは機能せず、1つのオブジェクトがオブジェクトをトンネリングしたり、他のオブジェクトから視覚的に押し出されたりするなど、アーティファクトが表示されます。

タイルベースのゲームの場合、オブジェクトが移動した場合のオブジェクトの位置を確認することで、予測的なアプローチをとることができます。動きがフェーズロックを引き起こす場合は、動きを許可しないでください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.