【问题标题】:OpenGL glm rotate model around a point issueOpenGL glm围绕一个点问题旋转模型
【发布时间】:2019-04-06 18:38:54
【问题描述】:

我有一个模型和一些位于其轴上的辅助立方体,每个轴上三个用于转换,我使用它们围绕其局部轴旋转模型。

我想让这些立方体随着它的旋转围绕模型中心旋转,所以我将它们平移到模型中心,在同一轴上将它们旋转相同的角度,然后将它们平移回来。 这是代码:

//Rotation around X axis
GLfloat theta=glm::radians(xoffset);
glm::quat Qx(glm::angleAxis(theta, glm::vec3(1.0f, 0.0f, 0.0f)));
glm::mat4 rotX = glm::mat4_cast(Qx);
pickedObject->Transform(rotX);//Multiply the model matrix by the transformation matrix
glm::vec3 op(pickedObject->getMatrix()[3]);//model position
for(TransformationHelper* h:pickedObject->GetTransformationHelpers()){//the small cubes
     glm::mat4 m,it,t;
     glm::vec3 hp(h->getMatrix()[3]);//the cube position
     t=glm::translate(m,op);//m is a unit matrix
     it=glm::translate(m,-op);
     m=t*rotX*it;
     h->Transform(m);
}

结果出乎意料

更新: 更新翻译矩阵后,我得到了这个结果:

【问题讨论】:

    标签: c++ opengl rotation quaternions glm-math


    【解决方案1】:

    翻译方向错误;正确的偏移量应该是hp-op,即矩阵t应该在旋转后恢复立方体的位置。

     t=glm::translate(glm::mat(1.f),hp-op);
    

    也没有必要使用inverse,因为它成本高(并且在数值上不太稳定):

     it=glm::translate(glm::mat(1.f),op-hp);
    

    (注意:这里translate 是使用显式构造的单位矩阵调用的。有关类似问题,请参阅this post。有关为什么需要这样做,请参阅here。)

    【讨论】:

    • 我更正了平移矩阵,但立方体平移离开了它的位置。我添加了一张图片。
    • @MohamedMoussa 我明白了;您对Transform 的实现与我的预期不同。我会更新的。
    • 我的意思是通过转换 m 后乘 modelMatrix 将在模型的 本地 基础中应用 m,而不是全局。这使得例如全局翻译不方便,因为您需要反转模型矩阵;需要在全局基础上应用偏移量hp - op
    • 偏移量hp - op 需要在全局基础上应用,而Transform 只能(直接)在本地基础上应用转换。您需要 modelMatrix 的倒数来在两种表示之间进行转换,这是昂贵且不准确的。最好实现一个替代方案,而不是预乘。
    • 我在您的回答的帮助下解决了这个问题,我在对象空间而不是世界空间中制作了立方体,因此对象发生的任何变换都将应用于其所有子对象
    猜你喜欢
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 2010-09-22
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-19
    相关资源
    最近更新 更多