【问题标题】:About glm quaternion rotation关于 glm 四元数旋转
【发布时间】:2017-06-22 16:59:30
【问题描述】:

我想通过四元数进行一些旋转。

glm 库在这方面做得很好。

以下是我的代码:

vec3 v(0.0f, 0.0f, 1.0f);
float deg = 45.0f * 0.5f;
quat q(glm::cos(glm::radians(deg)), 0, glm::sin(glm::radians(deg)), 0);
vec3 newv = q*v;
printf("v %f %f %f \n", newv[0], newv[1], newv[2]);

我的问题是,在许多文章中,四元数的旋转公式是哪一个

rotated_v = q*v*q_conj

这很奇怪。在 glm 中,向量“v”只需乘以四元数“q”即可进行旋转。

这让我很困惑。

【问题讨论】:

    标签: opengl quaternions glm-math


    【解决方案1】:

    经过一番研究。 我在 glm 四元数中找到了操作“*”的定义以及那里发生了什么。

    此实施基于这些网站。

    Quaternion vector rotation optimisation,

    A faster quaternion-vector multiplication,

    这是四元数旋转的两个版本。

    //rotate vector 
    vec3 qrot(vec4 q, vec3 v) 
    { 
        return v + 2.0*cross(q.xyz, cross(q.xyz,v) + q.w*v);
    } 
    

    //rotate vector (alternative) 
    vec3 qrot_2(vec4 q, vec3 v)
    { 
        return v*(q.w*q.w - dot(q.xyz,q.xyz)) + 2.0*q.xyz*dot(q.xyz,v) +    
              2.0*q.w*cross(q.xyz,v);
    } 
    

    如果有人能证明这一点。 我真的很感激。

    【讨论】:

    • 混淆源于四元数和 vec3 之间的 GLM 乘法运算符。它确实 NOT 像人们假设的那样执行四元数乘法 - 它执行如上所述的矢量旋转操作。由于这个原因,rotated_v = q*v*q_conj 会给出不正确的结果。见:link
    【解决方案2】:

    当你的四元数的虚部与你的向量垂直时,它会起作用。

    这是你的情况 vec3(0,sin(angle),0) 与 vec3(0,0,1) 垂直;

    你会发现当它不正确时你需要乘以共轭。

    q 四元数,v 向量。

    当您正常执行 q * v 时,您将获得一个 4D 向量,即另一个四元数。 我们只是不关心第一个分量并假设它是 0,一个纯四元数。当您执行 q * v * q' 时,您一定会获得一个纯四元数,它可以转换为一个好的 3D 向量

    您可以使用非垂直向量/四元数进行测试,您会发现您的旋转不正确

    https://www.3dgep.com/understanding-quaternions/

    【讨论】:

    • 事实上,我曾经尝试做 q * v * q' 来获得旋转向量。但这是不正确的。类似quat q(cos(radians(deg)), 0, sin(radians(deg)), 0); quat q_conj = conjugate(q); vec4 newv= vec4(0, v); newv = q*newv*q_conj; 我得到了 (0.000000, 0.000000, 0.000000,1.000000)
    • 看起来什么都不做。
    • 我的代码运行良好 quat tmp = mix(m_init,m_end,t); vec3 res= tmp * m_initTargetVector * conjugate(tmp)); 你不需要 vec4 "newv"
    • 好吧,如果你看一下 glm::rotate 的定义。你会看到它只是做我做的事。 return q * v; 其中 q 是 quat,v 是 vec3。
    猜你喜欢
    • 2013-03-13
    • 2016-08-11
    • 2020-11-06
    • 2012-08-16
    • 1970-01-01
    • 2020-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多