glm 在 Y 轴上旋转四元数使物体变形

Posted

技术标签:

【中文标题】glm 在 Y 轴上旋转四元数使物体变形【英文标题】:glm rotating quaternion in Y axis deforms object 【发布时间】:2017-12-03 22:49:51 【问题描述】:

我正在用 C++ 实现自己的游戏引擎,在这里我需要帮助,

我有一个游戏对象,它的方向属性是一个四元数,我想将它在 Y 轴上旋转 A 度。

所以,我有:

currentAngle += 0.01; // currentAngle is a member variable, so yes i initialized it
quat q(currentAngle, vec3(0, 1, 0));
myGameObject->SetOrientation(q);

GameObject::SetOrientation(quat q)

 myOrientation  = q;

但随着游戏对象的旋转,它也会缩放(变形)。所以我检查了我是如何应用转换矩阵的

myModelMatrix = Math::CreateTransformationMatrix(
    transformation->GetPosition(),
    transformation->GetOrientation(), 
    transformation->GetScale()); 


mat4& Math::CreateTransformationMatrix(vec3&    translation, quat& orientation, vec3& scaleSize)


     mat4 translate = glm::translate(glm::mat4(), translation);
     mat4 rotate = glm::toMat4(orientation);
     mat4 scale = glm::scale(glm::mat4(), scaleSize);

    return  translate * rotate * scale;

但它看起来不错(至少对我而言),我从乘法中删除了比例矩阵,以检查我是否以某种方式对其进行了处理。但是,它没有解决任何问题。

我也试过了:

  quat q(currentAngle, vec3(0, 1, 0));
   quat orientation = myGameObject->GetOrientation();
   orientation  = orientation  *q;
   myGameObject->SetOrientation(orientation);

但它也没有工作。 我还检查了我的着色器中的代码,我很肯定这不是问题。

这就是我将矩阵发送到着色器的方式:

glUseProgram(progarmId);1
    glUniformMatrix4fv(uniforms[name], 1, GL_FALSE, glm::value_ptr(matrix));

我尝试将第三个参数修改为 True 并交换投影视图矩阵乘法的顺序,但它也不起作用:/

所以,伙计们......任何想法我可能做错了什么?我没有想法:/

【问题讨论】:

myOrientation 字段在哪里以及如何使用? @meowgoesthedog 对 myOrientation 的修改器是 myGameObject->GetOrientation() 在对 Math::CreateTransformationMatrix 的调用中使用 【参考方案1】:

所以我想通了。

当我在做的时候:

currentAngle += 0.01; // currentAngle is a member variable, so yes i initialized it
quat q(currentAngle, vec3(0, 1, 0));
myGameObject->SetOrientation(q);

必须首先使用 glm 中的角度到轴方法转换四边形,所以最后:

   currentAngle = 0.01; // currentAngle is a member variable, so yes i initialized it
  //quat q(currentAngle, vec3(0, 1, 0));
    vec3 up(0, 1, 0);
    quat q = glm::angleAxis(currentAngle, up);
    GameObject->Rotate(q);

【讨论】:

【参考方案2】:

我没有使用 GLM 的经验,但我们的代码看起来不错。我认为问题出在您发布的代码之外。

可能是您计算世界 * 视图 * 投影矩阵以传递给着色器的代码。尝试翻转乘法顺序。

可能在您的顶点着色器中。

此外,某些平台/框架要求您在将矩阵传递给 GPU 时对其进行转置。

【讨论】:

以上是关于glm 在 Y 轴上旋转四元数使物体变形的主要内容,如果未能解决你的问题,请参考以下文章

当提供轴和四元数时,我如何获得 GLM 的角度?

在 1 轴上旋转四元数?

如何在不使用 transform.Rotate 的情况下在其本地或世界轴上旋转带有第二个四元数的四元数?

使用 `glm::rotate` 和四元数向上旋转 3D 方向向量

GLM四元数反向偏航

unity3d的四元数 Quaternion