2016-12-30 228 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载体。