私はC++でレイトレーサーを作成しており、シーン内のすべてのオブジェクトとの交差をチェックできる必要があります(最適化は後で行われます)。これを行うには、クラスインスタンスの実行リストを保持する必要があります。新しいインスタンスが作成されたときに更新されるポインターのリストは、初期化後に配列のサイズを増やす方法がないため、機能しません。組み込みの(C ++への)ソリューションがあれば本当に欲しいです。
4 に答える
使用できるSTLコンテナはいくつでもあります。
vector
静的クラスメンバーとしてシーン内のオブジェクトへのポインター(または)を作成し、set
すべてのctorをコレクションに挿入this
し、コレクションからdtor
削除this
します。
// really pseudo-code -- not intended to compile as-is, but I hope it helps
// convey the general idea.
//
class scene_object {
static std::set<scene_object const *> instances;
public:
scene_object() : { instances.insert(this); }
scene_object(scene_object const &other) { instances.insert(this); }
// probably more ctors here...
~scene_object() { instances.delete(this); }
};
std::set<scene_object> scene_object::instances;
Astd::vector
は問題ないはずです(そしてそれはC ++標準の一部です)。
私はC++でレイトレーサーを作成しており、シーン内のすべてのオブジェクトとの交差をチェックできる必要があります[...]
標準的なアプローチは空間グラフです。最も一般的には、八分木が使用されます。これは、八分木が3次元空間で位置を表現できるためです。自明なことに、空間ツリーは次のようになります。
struct SpatialNode {
SpatialNode * children[8];
std::vector<object*> objects;
};
各ノードには、(暗黙的または明示的な)位置とサイズがあります。新しいオブジェクトがワールドシーンに追加されると、ツリーは子(xy、yz、およびzx平面によって分割された八分象限を占有します:上に4つ、下に4つ、左に4つ、右に4つ、後ろに4つ)を通り抜けます。 、前に4)、オブジェクトは、それを完全に含むことができる最小のノードにのみ追加されます。(明らかに、オブジェクトの寸法と、それらが特定の領域内に完全に含まれるかどうかを計算できる必要があります。)
これには、データの入力と検索の両方で、かなり高速であるという利点があります(実際に関連するのはツリーの部分のみです)。ウィキペディア、GameDev.net、および他の場所で読むことができるいくつかの記事があります。