2016-12-30 230 views
1

最近,我正在使用源代碼在我的3D模型上進行旋轉。但是,調用該函數時發生問題: RotationBetweenVectors,在教程17( 鏈接:http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-17-quaternions/)中定義。 我想使用Quaternion方法將矢量_from旋轉到矢量_to。 兩個矢量定義如下,並計算它們之間的一個四元數。四元數旋轉誤差

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); 

的問題是,針必須是四元數太多,不一個矢量(你已經定義了_from是一個vec3)。其中,在VEC3內的括號結果由inverse(_rot)乘以

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

:請注意,在你原有的運營商,它可以被改寫爲。

因此,要解決這個問題,就意味着你的操作者必須是類似的東西(四元數乘法):

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

現在,你只需要在這個四元數再轉換爲VEC 3:

_to2 = axis(result); 
+0

謝謝!就是這樣。它解決了。 – Edison

0

我相信,你不能乘以vec3quat,你做如下:

vec3 _to1 = _rot * _from; 

您必須將_fromvec3轉換爲vec4,方法是在第四位添加1

vec4 _from2 = vec4(_from, 1); 

而且,從quat轉換_rot到一個4x4矩陣,說_rot2。你指的是教程,提到它可以做到用:

mat4 RotationMatrix = quaternion::toMat4(quaternion); 

那麼你應該能夠繁殖_from2_rot2得到_to載體。