GLSL: вращение с вектором вращения? - PullRequest
2 голосов
/ 27 января 2012

Я пытаюсь сделать скелетную анимацию с помощью GLSL. Для каждой кости у меня есть перевод (x, y, z) и вращение (шаг, крен, рыскание) (в градусах). Я мог бы построить матрицу 4х4 для каждой кости, но это заняло бы много места в регистре шейдера, поэтому я хотел бы хранить только 6 значений, которые у меня есть на кость, но я не знаю, как это сделать. 1001 *

1 Ответ

3 голосов
/ 27 января 2012

Чего я не знаю, так это как вращать точку, используя вращение vec3, которое у меня есть.

Простой: не надо.

Подача рыскания - ужасный способ кодирования ориентации, особенно для системы анимации. Вместо этого используйте кватернион. Это 4 значения, а не 3, и код для поворота хорошо известен.

Кроме того, он не требует таких тяжелых операций, как sin и cos.

Если вы хотите сравнить и сопоставить необходимые усилия, рассмотрите математику.

Учитывая кватернион q, позицию v, вам нужно сделать это, чтобы повернуть его:

vec3 temp = cross(q.xyz, v) + q.w * v;
vec3 rotated = v + 2.0*cross(q.xyz, temp);

Это немного математики. Теперь рассмотрим, что вы должны сделать для своего дела YPR, учитывая:

vec3 cosYPR = cos(ypr);
vec3 sinYPR = sin(ypr);

Это не все. Но этого достаточно . Это три cos и три sin операции. Это не быстрые операции. Это само по себе, вероятно, занимает столько же времени, сколько вычисление вращения кватерниона / вектора. Но после этого вам нужно сделать несколько умножений и сложений для вычисления матрицы 3х3. И затем, после всего этого, вам все же нужно сделать фактическую матрицу умноженной, чтобы повернуть вектор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...