XNA / C # - Сделать компонент Z кватерниона фиксированным углом?Или есть другой способ? - PullRequest
1 голос
/ 14 марта 2012

Я потратил около 3 часов, пытаясь заставить это работать ... В моей развивающейся 3D-игре у меня уже есть камера и мировое матричное пространство. Я хочу сделать так, чтобы при повороте камеры влево или вправо камера также наклонялась / поворачивалась влево или вправо. Однако все методы, которые я попробовал (Slerp, создание новой матрицы и Concatenate, установка quaternion.Z напрямую и т. Д.), Потерпели неудачу.

К счастью, мой бросок рассчитывается как угол, который БУДЕТ возвращать, если вы получили угол Z кватерниона (он увеличивается / уменьшается и возвращается к 0 при перемещении мыши.) Мне интересно, можно ли установить угол для локального угла места для камеры напрямую без проблем. Я ввожу значения от 13 до -13, которые я могу изменить на радианы.

Заранее спасибо:)

1 Ответ

1 голос
/ 15 марта 2012

Допустим, текущую перспективу сцены можно представить как q_c . Когда мышь перемещается вправо, вы хотите, чтобы q_c начал вращаться вокруг своей собственной оси y (при условии, что y равно up, x равно вправо и -z равно вперед ) на величину, возможно, пропорциональную смещению мыши. Таким образом, вы обычно формируете новый кватернион из представления оси / угла q_y = quatFromAxisAngle(turnRate,0,1,0): поверните на turnRate вокруг оси y . Затем вы применяете это преобразование к своему кватерниону, чтобы получить новую перспективу на сцене: q_c ' = q_y * q_c (конечно, с использованием умножения кватернионов).

Теперь, если вы хотите добавить некоторый локальный «крен» в перспективу, вам просто нужно сделать то же самое вокруг оси z , но сохранить копию «развернутого» перспектива:
q_z = quatFromAxisAngle(roll,0,0,-1)
q_d = q_z * q_c '.

Затем вы используете q_d для отображения сцены, но потом выбрасываете ее и всегда работаете с q_c . Таким образом, вы сохраняете постоянную ось up , чтобы вращаться, и когда вы закончите «катиться», вы просто прекращаете применять это окончательное вращение вокруг локальной оси «z».

...