gpt4 book ai didi

c++ - 四元数旋转错误

转载 作者:行者123 更新时间:2023-11-30 03:35:16 25 4
gpt4 key购买 nike

最近,我正在使用源代码对我的 3D 模型进行旋转。但是调用函数的时候出现了问题:RotationBetweenVectors,定义在教程17(链接:http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-17-quaternions/ ).我想使用四元数方法将 vector _from 旋转到 vector _to 。定义如下两个 vector ,并计算它们之间的四次方差。

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 乘以 vector _from。不幸的是,结果 _to1_to2 都不等于 vector _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 }

如果有 friend 能帮我解决这个问题,我将不胜感激?非常感谢!

最佳答案

我在这里看到两个问题。

首先,如果您希望 vector v1 旋转并在 vector v2 的相同位置精确结束,则它们必须具有相同的长度。

在您的例子中,_to 的长度与 _from 不同。我建议你将它们标准化:

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

其次,正如您所提示的那样,此运算符通过四元数进行旋转:

v1 = quat * Pin * inverse(quat);

问题是 Pin 也必须是四元数,而不是 vector (您已将 _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);

关于c++ - 四元数旋转错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41389912/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com