пятница, 9 декабря 2011 г.

Кватернион и матрица вращения OpenGL

Кваренион - это такая четырехкомпонентная сущность, с помощью которой можно задавать вращения в трехмерном пространстве. Их преимущество перед матрицами, соответствующим этим поворотам, состоит в том, что для них, кватернионов, нет так называемой "шарнирной блокировки" и что вычисления кватернионной математики менее ресурсоемки, чем для соответствующих матричных операций. Но в OpenGL пока еще манипулируют поворотами в пространстве с помощью матриц. Посмотрим, как соотносятся кватернион и соответствующая ему матрица, задающая поворот.
Кватернион представляется в виде черырех чисел x, y, z, w:

где:
угол альфа выражается в радианах, а е - это единичный вектор, вокруг которого совершается вращение.
Вектор v переводится вращением в вектор v' с помощью кватерниона так:

Матрица поворота выражается через компоненты кватерниона следующим способом:

Не забываем, что в OpenGL матрицы разворачиваются по столбцам, а не построкам. Таким образом, если матрицу обозначаем через matrixOfRotation, то, используя синтаксис языка си мы ее элементы запишем следующим образом:


matrixOfRotation[0] = 1.0f - 2.0f*( y*y + z*z );
matrixOfRotation[1] = 2.0f * ( x*y + z*w);
matrixOfRotation[2] = 2.0f * ( x*z - y*w);
matrixOfRotation[3] = 0.0f;
matrixOfRotation[4] = 2.0f * ( x*y - z*w );
matrixOfRotation[5] = 1.0f - 2.0f*( x*x + z*z );
matrixOfRotation[6] = 2.0f * ( z*y + x*w );
matrixOfRotation[7] = 0.0f;
matrixOfRotation[8] = 2.0f * ( x*z + y*w );
matrixOfRotation[9] = 2.0f * ( y*z - x*w );
matrixOfRotation[10] = 1.0f - 2.0f*( x*x + y*y );
matrixOfRotation[11] = 0.0f;
matrixOfRotation[12] = 0;
matrixOfRotation[13] = 0;
matrixOfRotation[14] = 0;
matrixOfRotation[15] = 1.0f;


Комментариев нет: