0

私は現在、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]

4

1 に答える 1