Пересечение лучевого бокса во время обхода сцены с матричными преобразованиями

Есть несколько способов тестирования пересечений лучевых боксов:

  1. Используя метод ComputeIntersectionBox (...), который принимает луч и прямоугольник в качестве аргументов и вычисляет ближайшее пересечение луча и прямоугольника. Этот метод работает путем формирования плоскости с каждой из граней коробки и нахождения пересечения с каждой из плоскостей. Как только пересечение найдено, выполняется проверка, находится ли точка на поверхности коробки, проверяя, находится ли точка пересечения между угловыми точками. Когда я смотрю на лучи после запуска этого алгоритма на двух разных прямоугольниках, я получаю правильные пересечения.

  2. Использование метода ComputeIntersectionScene (...) без использования матричных преобразований в сцене, которая имеет две сферы, додекаэдр (треугольную сетку) и два блока. ComputeIntersectionScene (...) рекурсивно проходит все узлы графа сцены и вычисляет ближайшее пересечение с заданным лучом. Этот тест, в частности, не применяет никаких преобразований, которые могут иметь родительские узлы, которые также необходимо применить к их дочерним узлам. С помощью этого теста я также получаю правильные пересечения.

  3. Использование метода ComputeIntersectionScene (...) С матричными преобразованиями. Этот тест работает так же, как и описанный выше, за исключением того, что перед нахождением пересечения между лучом и узлом в сцене луч преобразуется в рамку координат узла, используя обратную матрицу преобразования узла, и после вычисления пересечения это пересечение преобразуется обратно в мировые координаты путем применения матрицы преобразования к точке пересечения.

При тестировании третьим методом на том же файле сцены, как описано в пункте 2, тестировании с 4 лучами (таким образом, один луч пересекает одну сферу, один луч - другую сферу, один луч - один прямоугольник, а один луч - другой прямоугольник), только две сферы пересекаются, и два квадрата не пересекаются. Когда я отлаживаю просмотр своего метода ComputeIntersectionBox (...), он фактически сообщает мне, что луч пересекает каждую плоскость на коробке, но каждая точка пересечения не лежит на коробке.

Это кажется странным поведением, поскольку при использовании теста 2 без преобразований я получаю правильные пересечения ящиков (таким образом, я считаю, что мое пересечение лучей и боксов правильное), а при использовании теста 3 с преобразованиями СО я получаю правильные пересечения сфер ( таким образом, я считаю, что мой преобразованный луч должен быть в порядке).

Есть предложения, где я могу ошибиться?

Заранее спасибо.


person Myx    schedule 01.04.2010    source источник


Ответы (1)


Таким образом, ошибка на самом деле была ошибкой реализации: когда я преобразовывал луч, я преобразовывал указатель на луч, который также преобразовывал все указатели внутри него (поскольку функция рекурсивная). Что мне нужно было сделать, так это сделать отдельную копию моего луча и выполнить преобразование на копии, а не на оригинале.

person Myx    schedule 14.04.2010