2016-12-30 6 views
1

В последнее время я использую источник для вращения на своих 3D-моделях. Однако возникла проблема при вызове функции: ВращениеBetweenVectors, определенное в Учебное пособие 17 ( ссылка: http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-17-quaternions/). Я хочу повернуть вектор _from в вектор _to с использованием метода Quaternion. Два вектора определяются следующим образом и вычисляется кват между ними.Ошибки вращения кватерниона

vec3 _from(0, -0.150401f, 0.93125f), _to(-0.383022f, -0.413672f, 1.24691f); 
quat _rot = RotationBetweenVectors(_from, _to); 

vec3 _to1 = _rot * _from; 
vec3 _to2 = _rot * _from * inverse(_rot); 

то я использую этот кватернизованный _rot умножать вектор _from. Unluckly, результат _to1 и _to2 не равны вектору _to.

_rot gives {x=0.0775952041 y=-0.140000001 z=-0.0226106234 w=0.986847401} 
_to1 gives {x=-0.264032304 y=-0.285160601 z=0.859544873 } 
_to2 gives {x=-0.500465572 y=-0.390112638 z=0.697992325 } 

Я ценю это, если какой-либо друг может помочь мне решить эту проблему? Большое спасибо!

ответ

2

Здесь я вижу две проблемы.

Во-первых, если вы хотите, чтобы вектор v1 вращался и заканчивался точно в том же положении вектора v2, они должны иметь одинаковую длину.

В вашем случае _to имеет разную длину, чем _from. Я предлагаю вам нормализовать их:

_to = normalize(_to); 
_from = normalize(_from); 

Во-вторых, как вы подсказали, вращение с помощью кватернионов осуществляется этим оператором:

v1 = quat * Pin * inverse(quat); 

проблема заключается в том Pin должен быть кватернион тоже не вектор (вы определили _from как vec3). Обратите внимание на то, что в вашем исходном операторе, можно переписать в виде:

vec3 _to2 = (_rot * _from) * inverse(_rot); 

где внутренний Паренс приводит к Vec3, который умножается на inverse(_rot).

Таким образом, чтобы решить эту проблему, то это означает, что ваш оператор должен быть что-то подобное (кватернион умножение):

quat Pin = {0, _from}; 
quat result = _rot * Pin * inverse(_rot); 

Теперь вам нужно только, чтобы преобразовать этот кватернион в Vec3 снова:

_to2 = axis(result); 
+0

спасибо! точно это так. он решен. – Edison

0

Я считаю, вы не можете умножить vec3 на quat, как вы делаете ниже:

vec3 _to1 = _rot * _from; 

Вам необходимо будет преобразовать _from из vec3 в vec4, добавив 1 в четвертом месте, то есть.

vec4 _from2 = vec4(_from, 1); 

Кроме того, конвертировать _rot из quat в матрицу 4х4, скажем _rot2. В учебнике вы ссылаетесь, упоминает, что это может быть сделано с помощью:

mat4 RotationMatrix = quaternion::toMat4(quaternion); 

Тогда вы должны быть в состоянии умножить _from2 на _rot2 получить _to вектор.