【问题标题】:Quaternion Rotation errors四元数旋转错误
【发布时间】:2017-05-14 09:09:19
【问题描述】:

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

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。不幸的是,结果 _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 }

如果有朋友能帮我解决这个问题,我很感激? 非常感谢!

【问题讨论】:

    标签: c++ opengl rotation quaternions


    【解决方案1】:

    我在这里看到两个问题。

    首先,如果您希望向量 v1 旋转并在向量 v2 的相同位置完成,它们必须具有相同的长度。

    在您的情况下,_to 的长度不同于 _from。我建议您将它们标准化:

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

    其次,正如您所提示的,通过四元数的旋转是由这个运算符完成的:

    v1 = quat * Pin * inverse(quat);
    

    问题是 Pin 也必须是四元数,而不是向量(您已将 _from 定义为 vec3)。请注意,在您的原始运算符中,它可以重写为:

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

    内部括号产生乘以inverse(_rot)的vec3。

    所以,要解决这个问题,这意味着您的运算符必须是这样的(四元数乘法):

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

    现在,您只需要将这个四元数再次转换为 vec3:

    _to2 = axis(result);
    

    【讨论】:

      【解决方案2】:

      我相信,您不能将 vec3 乘以 quat,如下所示:

      vec3 _to1 = _rot * _from;
      

      您必须通过在第四位添加1_fromvec3 转换为vec4,即

      vec4 _from2 = vec4(_from, 1);
      

      另外,将_rotquat 转换为4x4 矩阵,例如_rot2。您参考的教程提到可以使用:

      mat4 RotationMatrix = quaternion::toMat4(quaternion);
      

      那么你应该能够将_from2 乘以_rot2 得到_to 向量。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-11
        • 1970-01-01
        • 1970-01-01
        • 2013-03-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多