2010-04-01 1 views
1

Есть несколько способов, которыми я тестирую свои лучевых коробки перекрестки:Ray-Box Пересечение во время сцены обхода с матрицей трансформирует

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

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

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

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

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

Любые предложения, в которых я мог ошибиться?

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

ответ

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^