私は現在、Revelles、Urena、および Lastra の論文「An Efficient Parametric Algorithm for Octree Traversal」を実装しています。Ray - Octree 交差アルゴリズムでは、誰かがそれを実装して自分のコードを貼り付けました。私の実装は、計算にいくつかのベクトルを使用したことを除いて、同じである必要があります。ただし、このオクツリーを使用すると、画像の右上部分のみがレンダリングされ、画像の残りの部分についてはオクツリーがトラバースされません。トラバースするかどうかのチェックは、次のメソッドで行われます。
bool Octnode::intersect( Ray r, SurfaceData *sd )
{
unsigned int a = 0;
v3d o = r.origin();
v3d d = r.direction();
if ( r.direction()[0] < 0. ) {
o[0] = _size[0] - r.origin()[0];
d[0] = -r.direction()[0];
a |= 4;
}
if ( r.direction()[1] < 0. ) {
o[1] = _size[1] - r.origin()[1];
d[1] = -r.direction()[1];
a |= 2;
}
if ( r.direction()[2] < 0. ) {
o[2] = _size[2] - r.origin()[2];
d[2] = -r.direction()[2];
a |= 1;
}
v3d t0 = ( _min - o ) / d;
v3d t1 = ( _max - o ) / d;
scalar t = std::numeric_limits<double>::max();
// traversal -- if any -- starts here
if ( t0.max() < t1.min() ) {
return processSubtree( t0, t1, r, &t, sd, a );
} else {
return false;
}
}
[編集]上記のメソッドは関数を実装します
void ray_parameter( octree *oct, ray r )
紙から。C. Urena が指摘したように、トラバーサルが正しくない原因となるエラーが論文に含まれています。残念ながら、このエラーが発生する前にトラバーサルがスキップされます。C. Urena のリンクの後にある Google グループでは、octree ノードのサイズの計算方法が異なるようです。やった:
_size = _max - _min;
対
_size = ( _max - _min ) / 2.;
グーグルグループで。私はそれをテストし、別の更新を投稿します。[/編集]
[編集 2]カルロスが言及した修正を適用し、サイズを半分に縮小すると、ここまで来ました。
球体は完全にレンダリングする必要がありますが、少なくとも左上 4 分の 1 のすべての光線が拒否されるわけではありません。[/編集 2]
[編集 3]異なるデータ セットを使用すると、一見より良い結果が得られます。コードの他の部分を調査する必要があるようです。
[/編集 3]