0

私は現在、Java で 3D エンジンに取り組んでおり、いくつかの問題に遭遇しました。たとえば、3D (または 2D または 1D) ジオメトリを信頼性の高い単純な方法で作成する信頼性の高い方法です。もちろん、これに対する本当の、率直な答えはありませんが、私は主に、これが議論タイプの投稿になることを期待しています..私の3Dエンジンで。

(私が言いたいことの正確な例として、私は現在、すべてが 3D ポイントで構成されています (実際にはそうなっています) が、ポイントが構成するものをエンジンに伝えるのは難しい作業であり、信頼できるジオメトリを取得するのが難しくなっています) . 多くのポイントを使用するだけでなく、より信頼性の高いシステムが必要です。)

4

1 に答える 1

1

イェーイ ディスカッション タイプの質問 -- まず最初に、単なる警告です。ディスカッション タイプの質問は、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 統合、レイトレーシング、しかしそれらはすべて上記のベースで簡単です)

于 2012-11-06T01:59:01.250 に答える