opengl用glm单独旋转一个对象

时间:2014-08-14 23:39:58

标签: c++ opengl 3d rotation glm-math

我有一个需要旋转的物体。由于某些原因,只有计算机知道我的整个场景都被旋转,即所有对象都作为一组旋转。请注意,所有对象都来自同一个类。我想在同一时间单独旋转这些对象。我无法发布所有代码,但这里是相关部分。如果被要求,我会添加更多代码。 这是我定期更新旋转角度的地方:

void Model::Update( float dt ) {    
    mRotationAngleInDegrees += dt;
}

这是我计算变换矩阵的地方:

mat4 Model::GetWorldMatrix() const {
    mat4 worldMatrix( 1.0f );
    worldMatrix = glm::translate( worldMatrix, position );
    worldMatrix = glm::rotate( worldMatrix, mRotationAngleInDegrees, vec3( 0, 0, 1 ) );
    return worldMatrix;
}

这是我画模型的地方:

void Model::Draw() {

    GLuint WorldMatrixLocation = glGetUniformLocation(Renderer::getShaderID(), "WorldTransform"); 
    glUniformMatrix4fv(WorldMatrixLocation, 1, GL_FALSE, &GetWorldMatrix()[0][0]);

    //vertex buffer code here

    glDrawArrays(GL_TRIANGLE_STRIP, 0, 9);

    //some more cleanup code here
}

以下是main中的相关代码:

for( vector<Model>::iterator it = grass.begin(); it != grass.end(); ++it ) {
    it->Update(dt);
    it->Draw();
}

有人能看出问题是什么吗?

1 个答案:

答案 0 :(得分:1)

问题在于旋转后的函数GetWorldMatrix()我应该将模型矩阵转换回原始位置。这是必要的,因为本地轮换必须遵循这些步骤(按照严格的顺序):

  1. 从原始点转换为旋转锚
  2. 旋转
  3. 转回原点
  4. 所以我添加了这一行:

    worldMatrix = glm::translate( worldMatrix, -position );
    

    该功能现在如下所示:

    mat4 Model::GetWorldMatrix() const {
        mat4 worldMatrix( 1.0f );
        worldMatrix = glm::translate( worldMatrix, position );
        worldMatrix = glm::rotate( worldMatrix, mRotationAngleInDegrees, vec3( 0, 0, 1 ) );
        worldMatrix = glm::translate( worldMatrix, -position );
        return worldMatrix;
    }
    

    谢谢你,40岁,这是一个很好的提示。