В настоящее время я работаю над документами Revelles, Urena и Lastra. «Эффективный параметрический алгоритм обхода Октри». В 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;
}
}
[Редактировать] Вышеуказанный метод реализует функцию
void ray_parameter( octree *oct, ray r )
из бумаги. Как отметил К. Урена, в статье есть ошибка, которая приводит к тому, что обратный путь неверен. К сожалению, обход пропускается до того, как эта ошибка может войти в игру.
В группе Google, которую можно найти по ссылке C. Urena, кажется, что размер узла октри вычисляется по-разному. Я сделал:
_size = _max - _min;
против
_size = ( _max - _min ) / 2.;
в группе гугл. Я проверю это и выложу еще одно обновление. [/Редактировать]
[Редактировать 2] Применение исправления, упомянутого Карлосом, и уменьшение размера вдвое привело меня к этому:
Сферы должны быть полностью визуализированы, но, по крайней мере, не все лучи для верхней левой четверти отклоняются. [/ Редактировать 2]
[Редактировать 3] Используя разные наборы данных, я получаю, казалось бы, лучшие результаты, похоже, мне придется исследовать некоторые другие части кода.
[/ Редактировать 3]
У меня нет времени на подробный просмотр вашего кода, но, возможно, вам следует проверить на наличие ошибки в оригинальной статье, которая также может присутствовать в вашем коде: вы можете увидеть ее описанную здесь: http://lsi.ugr.es/curena/inves/wscg00/ — есть указатель на группу Google с обсуждением.
Надеюсь, это поможет,
Карлос.
Других решений пока нет …