Только верхняя правая часть изображения отображается при использовании октодерева

0

В настоящее время я выполняю работу Revelles, Urena и Lastra "Эффективный параметрический алгоритм для Octree Traversal". В алгоритмах пересечения Ray-Octree кто-то реализовал его и вставил свой код. Моя реализация должна быть одинаковой, за исключением того, что я использовал некоторые векторы для вычисления. Однако, используя этот 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;
  }
}

[Edit] Вышеупомянутый метод реализует функцию

void ray_parameter( octree *oct, ray r )

из статьи. Как указал К. Урена, в документе есть ошибка, которая приводит к неправильному обходу. К сожалению, обход пропущен до того, как эта ошибка может вступить в игру. В группе Google, которая может быть найдена, ссылаясь на ссылку C. Urena, кажется, что размер octree-узла вычисляется по-разному. Я сделал:

_size = _max - _min;

против

_size = ( _max - _min ) / 2.;

в группе Google. Я проверю это и опубликую другое обновление. [/Редактировать]

[Edit 2] Применяя исправление, упомянутое Карлосом и уменьшившее размер пополам, привело меня так далеко:

Изображение 174551

Сферы должны быть полностью визуализированы, но по крайней мере не все лучи для верхнего левого квартала отклоняются. [/Edit 2]

[Редактировать 3] Используя разные наборы данных, я получаю, казалось бы, лучшие результаты, похоже, мне придется исследовать некоторые другие части кода.

Изображение 174551Изображение 174551

[/Edit 3]

Теги:
algorithm
raytracing
octree

1 ответ

1
Лучший ответ

У меня нет времени для подробного обзора вашего кода, но, возможно, вам стоит проверить наличие ошибки в оригинальной бумаге, которая может также присутствовать в вашем коде: вы можете увидеть ее здесь: http://lsi.ugr.es/curena/inves/wscg00/ - есть указатель на группу google с обсуждением.

Надеюсь, это поможет, Карлос.

  • 0
    Это решило бы проблему, о которой я еще не знал, но не ту, о которой я спрашивал. Но ваша ссылка предоставила подсказку, что может быть не так, смотрите редактирование.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню