イェーイ ディスカッション タイプの質問 -- まず最初に、単なる警告です。ディスカッション タイプの質問は、stackoverflow では嫌われる傾向がありますが、それでも私はピッチに参加します。
最初に頭に浮かんだのは、スペースに関する余分なデータがほとんどない、シンプルで、これまで必要としていたすべてのものに対して十分に強力な構造である、ハーフエッジ メッシュデータ構造でした。これは、基本的にすべてのメッシュ構造のニーズをカバーします。
多くの 3D ゲーム エンジンで見られるもう 1 つの解決策は、オブジェクト ツリー システムです (それが正しい名前かどうかはわかりません)。これは、python panda3D ゲーム エンジン、Blender (ちょっと、ブレンダーにはあまり慣れていません)など。アイデアは、他の Object3D オブジェクトを内部の相対位置に含めることができる単純な Object3D クラスを持つことです。この入れ子になった階層は、パーツが集まって他のもののより複雑なパーツを形成する複雑なシステムで非常にうまく機能します。このネストされた階層は、再帰的な O(log n) 衝突アルゴリズムや再帰的なフラスタム カリング (グラフィック用) にも非常に適しています。これはコーディングも非常に簡単です。私は 11 年生のときにオブジェクト ツリーを使用して基本的な 3D エンジンを作成しました。
どのエンジンでも、交点などを計算する何らかの方法が必要になるため、フラスタム カリングや物理衝突などを行うことができます。私が使用した (非常に効率的で、十分にインテリジェントな) トリックは、AABB ツリーでした。オブジェクトのツリーが既にある場合は、すべてのオブジェクトにその AABB を格納して計算させるだけです。AABB ツリー。
とにかく、私はこのようなコードを書いた経験があるので、サンプルを提供できるはずですよね? はい:
public class Object3D {
public LinkedList<Object3D> children;
public AABB aabb; // the AABB of the object -- constructed
// by union of children's AABBs
public void doesIntersect(Object3D obj){
// intersection using AABB-AABB intersection
// sadly web resources are sorely lacking, so I shall handle this one below
}
}
AAABB-AABB 衝突について (知る必要がある場合)
2 つのボックスがあります。各ボックスは軸に沿って配置され、各ボックスには幅、高さ、および深さがあります。それらが衝突するかどうかをテストするために、3つの軸すべてに沿って見たときにそれらが重なり合っているかどうかを確認します。後でいくつかの凝った計算を行いますが、次のことに注意してください。
"Box A and Box B collide" iff "Box A and B have overlapping x coordinates" and
"same for y coordinates" and "same for z coordinates" and
"same for any other dimensions of space you decide to implement".
結局のところ、これはコーディングと計算の両方にとって簡単なチェックです。これが、AABB がオブジェクト ツリーの適切なバウンディング ボリュームを作成する理由です。
さて、議論のために、この答えはどちらかというと一方的なものになりました。とにかく、コメントは素敵です、私が見逃した便利なものがいくつかあると確信しています (verlet 統合、レイトレーシング、しかしそれらはすべて上記のベースで簡単です)