Определение Up в матрице просмотра Direct3D, когда камера постоянно движется

В моем приложении Direct3D камеру можно перемещать с помощью мыши или клавиш со стрелками. Но если я жестко запрограммирую (0,1,0) как вектор направления вверх в LookAtLH, кадр станет пустым при некоторых ориентациях камеры.

Я только что на собственном горьком опыте узнал, что при взгляде по оси Y (0,1,0) больше не работает как направление вверх (кажется очевидным?). Я думаю о том, чтобы переключить свое направление вверх на что-то другое для каждого из этих особых случаев. Есть ли более изящный способ справиться с этим?


person Agnel Kurian    schedule 31.10.2008    source источник


Ответы (2)


Предполагая, что вы можете рассчитать вектор, указывающий вперед (то, на что вы смотрите, - ваше положение) и вектор, указывающий вправо (всегда в плоскости XZ, если вы не можете катиться). Нормализуйте оба этих вектора, тогда вверх будет идти вперед x вправо (где x - векторное произведение).

В общем, вы можете подключить свои рыскание, тангаж и крен в матрицу вращения и повернуть векторы осей, чтобы получить вправо, вверх и вперед, но я думаю, что вы используете LookAtLH, чтобы избежать этого.

См. http://en.wikipedia.org/wiki/Rotation_matrix#The_3-Dimension_rotation_matricies

person jakber    schedule 31.10.2008

Изящный способ справиться с этим — использовать Unit Quaternions. Кватернион — это вектор из 4 значений, который кодирует ориентацию в трехмерном пространстве (а не вращение, как утверждают некоторые статьи), а единичный кватернион — это вектор, длина вектора которого равна sqrt(x^2+y^2+z^2+w^ 2) составляет 1,0. Существует набор математических операций для работы с кватернионами, которые аналогичны использованию матриц для кодирования поворотов, с дополнительным бонусом, заключающимся в том, что кватернионы никогда не могут представлять вырожденную ориентацию. Вы можете свободно конвертировать кватернионы в матрицу 3x3 или 4x4, когда вам нужно передать результат на графический процессор.

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

Чтобы измерить это скручивание, вы должны прочитать статью Кена Шумейка «Уменьшение скручивания пучков волокон» в книге Graphics Gems 4. Он показывает хороший способ измерения этого накопленного скручивания и способы его устранения, когда оно вызывает раздражение.

person Fatlimey    schedule 06.11.2008
comment
Решение, которое я использую в настоящее время, таково: i) первоначально определите как (0,1,0) или что-то подходящее и сохраните это в векторе ii) когда пользователь изменит ориентацию камеры, соответственно поверните сохраненный вектор и установите его как новый вектор вверх - person Agnel Kurian; 06.11.2008