Quaternion Rotation errors
最近,Ia€?m 使用源对我的 3D 模型进行旋转。但是,调用函数时出现了问题:
RotationBetweenVectors,定义在教程 17(
链接:http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-17-quaternions/)。
我想使用四元数方法将向量 _from 旋转到向量 _to 。
两个向量定义如下,并计算它们之间的 quat。
1
2 3 4 5 |
vec3 _from(0, –0.150401f, 0.93125f), _to(–0.383022f, –0.413672f, 1.24691f); quat _rot = RotationBetweenVectors(_from, _to); vec3 _to1 = _rot * _from; |
然后我使用这个quat _rot 来乘以向量_from。不幸的是,结果 _to1 和 _to2 都不等于向量 _to。
1
2 3 |
_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 } |
如果有朋友能帮我解决这个问题,我很感激?
非常感谢!
我在这里看到了两个问题。
首先,如果您希望向量 v1 旋转并在向量 v2 的相同位置完成,它们必须具有相同的长度。
在您的情况下,
1
2 |
_to = normalize(_to);
_from = normalize(_from); |
其次,正如你所提示的,通过四元数的旋转是由这个操作符完成的:
1
|
v1 = quat * Pin * inverse(quat);
|
问题在于 Pin 也必须是四元数,而不是向量(您已将
1
|
vec3 _to2 = (_rot * _from) * inverse(_rot);
|
其中内部括号产生乘以
的 vec3
所以,要解决这个问题,这意味着你的运算符必须是这样的(四元数乘法):
1
2 |
quat Pin = {0, _from};
quat result = _rot * Pin * inverse(_rot); |
现在,你只需要将这个四元数再次转换为 vec3:
1
|
_to2 = axis(result);
|
我相信,您不能将
1
|
vec3 _to1 = _rot * _from;
|
您必须通过在第四位添加
1
|
vec4 _from2 = vec4(_from, 1);
|
此外,将
1
|
mat4 RotationMatrix = quaternion::toMat4(quaternion);
|
然后你应该能够将
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/268879.html