В настоящее время я выполняю работу 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] Применяя исправление, упомянутое Карлосом и уменьшившее размер пополам, привело меня так далеко:
Сферы должны быть полностью визуализированы, но по крайней мере не все лучи для верхнего левого квартала отклоняются. [/Edit 2]
[Редактировать 3] Используя разные наборы данных, я получаю, казалось бы, лучшие результаты, похоже, мне придется исследовать некоторые другие части кода.
[/Edit 3]
У меня нет времени для подробного обзора вашего кода, но, возможно, вам стоит проверить наличие ошибки в оригинальной бумаге, которая может также присутствовать в вашем коде: вы можете увидеть ее здесь: http://lsi.ugr.es/curena/inves/wscg00/ - есть указатель на группу google с обсуждением.
Надеюсь, это поможет, Карлос.