最近,我正在使用源代码在我的3D模型上进行旋转。但是,调用该函数时出现问题: RotationBetweenVectors ,在教程17 中定义( 链接:http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-17-quaternions/)。 我想使用Quaternion方法将vector _from旋转到vector _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);
然后我使用此quat _rot 将向量 _from 相乘。不幸的是, _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 }
如果有朋友可以帮我解决这个问题,我很感激吗? 非常感谢!
答案 0 :(得分: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);
答案 1 :(得分:0)
我相信,您无法将vec3
乘以quat
,如下所示:
vec3 _to1 = _rot * _from;
您必须在第四位添加_from
,才能将vec3
从vec4
转换为1
,即
vec4 _from2 = vec4(_from, 1);
另外,将_rot
从quat
转换为4x4矩阵,例如_rot2
。您参考的教程提到可以使用以下方法完成:
mat4 RotationMatrix = quaternion::toMat4(quaternion);
然后,您应该能够将_from2
乘以_rot2
以获得_to
向量。