2014-02-02 1 views
0

Я пытаюсь вычислить единичный вектор, который указывает на мою камеру opengl. Учитывая ротационный кватернион (w, x, y, z), как бы я вычислил поворот единичного вектора вокруг этого кватерниона?Поверните вектор объекта по данному кватерниту

В этом случае единичный вектор может быть ограничен (0,0, -1).

EDIT: Окончательное решение

Для вращения (0,0,1):

vec.x=2*x*z - 2*y*w; 
vec.y=2*y*z + 2*x*w; 
vec.z=1 - 2*x*x - 2*y*y; 

Заметим, что матрица должна быть перенесена для использования с OpenGL.

+0

Вы читали http://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation? –

+0

Я читал мили текста, пытаясь найти эффективное решение. Если я найду это, прежде чем я получу здесь ответ, я отправлю его. – Kent

ответ

3

Преобразуйте кватернион в матрицу вращения 3x3 и примените это вращение к вашему вектору.

Для блока (w, x, y, z) кватернион, эта матрица:

 (1 - 2 * (y * y + z * z)  2 * (x * y - z * w)  2 * (x * z + y * w)) 
    R = ( 2 * (x * y + z * w) 1 - 2 * (x * x + z * z)  2 * (y * z - x * w)) 
     ( 2 * (x * z - y * w)  2 * (y * z + x * w) 1 - 2 * (x * x + y * y)) 

Если вектор имеет такую ​​простую форму, как (0, 0, -1), вам не нужно будет вычислить все 9 коэффициентов матрицы вращения, так как результат умножение матричного вектора использует только некоторые из коэффициентов (последний столбец R).

+0

Я не уверен в этом, но, думаю, вы могли поменять «+» на '-' в записи в северо-восточном углу. –

+0

Я уже закодировал это, но это ужасно неэффективно. Дело в том, чтобы найти решение, которое не зависит от матриц. (вопрос изменен соответствующим образом, и +1 в любом случае) – Kent

+0

@DavidWallace Действительно, спасибо за определение этого. – user3146587

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