2015-06-20 164 views
0

我松散地遵循非常方便的教程在opengl-tutorial.org。我已经能够创建一个网格,为它绘制一个精灵,并且旋转和缩放这个网格非常好。OpenGL - 翻译延伸和扭曲精灵

但是,我在尝试翻译网格时遇到了一些问题。 (图片下方)

这里有精灵的更新功能:

Transform* transform = static_cast<Transform*>(owner->GetComponent(CID_TRANSFORM)); 

    glUseProgram(shaderID_); 

    glm::mat4 projection = glm::perspective(45.0f , 4.0f/3.0f, 0.1f, 100.0f); 

    glm::mat4 view = glm::lookAt(
     glm::vec3(3, 3, 3), 
     glm::vec3(0, 0, 0), 
     glm::vec3(0, 1, 0) 
     ); 

    glm::mat4 model = transform->GetModelMatrix(); 

    glm::mat4 mvp = projection * view * model; 

    GLuint matrixID = glGetUniformLocation(shaderID_, "MVP"); 

    glUniformMatrix4fv(matrixID, 1, GL_FALSE, &mvp[0][0]); 

    glActiveTexture(GL_TEXTURE0); 
    glBindTexture(GL_TEXTURE_2D, texture_); 
    glUniform1i(samplerID_, 0); 

    glEnableVertexAttribArray(0); 
    glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer_); 
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); 

    glEnableVertexAttribArray(1); 
    glBindBuffer(GL_ARRAY_BUFFER, uvBuffer_); 
    glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, (void*)0); 

    glDrawArrays(GL_TRIANGLES, 0, 3 * 2); 

    glDisableVertexAttribArray(0); 
    glDisableVertexAttribArray(1); 

而这里的getModelMatrix功能:

glm::mat4 Transform::GetModelMatrix() 
{ 
    glm::mat4 trans = glm::mat4(
     1.0f, 0.0f, 0.0f, translation.x, 
     0.0f, 1.0f, 0.0f, translation.y, 
     0.0f, 0.0f, 1.0f, translation.z, 
     0.0f, 0.0f, 0.0f, 1.0f); 

    float xCos = glm::cos(rotation.x); 
    float xSin = glm::sin(rotation.x); 
    float yCos = glm::cos(rotation.y); 
    float ySin = glm::sin(rotation.y); 
    float zCos = glm::cos(rotation.z); 
    float zSin = glm::sin(rotation.z); 

    glm::mat4 xRotation = glm::mat4(
     1.0f, 0.0f, 0.0f, 0.0f, 
     0.0f, xCos, -xSin, 0.0f, 
     0.0f, xSin, xCos, 0.0f, 
     0.0f, 0.0f, 0.0f, 1.0f); 

    glm::mat4 yRotation = glm::mat4(
     yCos, 0.0f, ySin, 0.0f, 
     0.0f, 1.0f, 0.0f, 0.0f, 
     -ySin, 0.0f, yCos, 0.0f, 
     0.0f, 0.0f, 0.0f, 1.0f); 

    glm::mat4 zRotation = glm::mat4(
     zCos, -zSin, 0.0f, 0.0f, 
     zSin, zCos, 0.0f, 0.0f, 
     0.0f, 0.0f, 1.0f, 0.0f, 
     0.0f, 0.0f, 0.0f, 1.0f); 

    glm::mat4 rot = xRotation * yRotation * zRotation; 

    glm::mat4 sca = glm::mat4(
     scale.x, 0.0f, 0.0f, 0.0f, 
     0.0f, scale.y, 0.0f, 0.0f, 
     0.0f, 0.0f, scale.z, 0.0f, 
     0.0f, 0.0f, 0.0f, 1.0f); 

    return trans * rot * sca; 
} 

这里是在3 3从看原点(,精灵, 3)。 first image

这里是从(3,3,3)查看转换为(1,0,0)的精灵。 second image

+0

图片不看扭曲对我来说,只是正常的透视投影,只是具有很大的发生角度。矩形的一部分似乎被近场的截锥体夹住。 –

+0

@sevatitov:相机在两张图片之间没有移动,唯一的区别是网格沿着x轴移动了1个单位。在我看来,这会让精灵处于相同的方向,只是向右移动。 – craymen

+0

我认为GLM和OpenGL一样,使用列主矩阵。您将按行主要顺序指定翻译矩阵的元素。 –

回答

2

匹配OpenGL,GLM以列的主要顺序存储矩阵。构造函数也期望元素以相同的顺序指定。

然而,您的翻译矩阵以行优先顺序指定:

glm::mat4 trans = glm::mat4(
    1.0f, 0.0f, 0.0f, translation.x, 
    0.0f, 1.0f, 0.0f, translation.y, 
    0.0f, 0.0f, 1.0f, translation.z, 
    0.0f, 0.0f, 0.0f, 1.0f); 

要指定正确的列大订单的矩阵,这需要有:

glm::mat4 trans = glm::mat4(
    1.0f, 0.0f, 0.0f, 0.0f, 
    0.0f, 1.0f, 0.0f, 0.0f, 
    0.0f, 0.0f, 1.0f, 0.0f, 
    translation.x, translation.y, translation.z, 1.0f); 
+0

第一段的错字:) – Grimmy

+0

@Grimmy确实!谢谢,现在修复。 –

+0

其实,“列专业”和“行专业”在这里混在一起。在“列主要”表示法中,翻译元素位于第四个_column_上,并且在“行主要”表示法中,这些元素位于第四个_row_上。 –