y轴上的glm旋转四元数使对象变形

时间:2017-12-03 22:49:52

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

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

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

所以,我有:

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));

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

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

2 个答案:

答案 0 :(得分:0)

所以我想通了。

我在做的时候:

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);

答案 1 :(得分:-1)

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

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

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

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