2016-04-30 92 views
0

我創建了一個渲染3D立方體的程序,現在我想更改立方體的位置。我現在正在做的矩陣乘法似乎扭曲了立方體而不是改變它的位置。對於0.1-0.4範圍內的值,失真很小,並填充整個屏幕以獲得較大的值。3D模型翻譯使物體變形

頂點着色器:

#version 330 core 

layout(location = 0) in vec3 vertexPosition_modelspace; 
layout(location = 1) in vec3 vertexColor; 

uniform mat4 projectionMatrix; 
uniform mat4 cameraMatrix; 
uniform mat4 modelMatrix; 

out vec3 fragmentColor; 

void main() 
{ 
    gl_Position = projectionMatrix * cameraMatrix * modelMatrix * vec4(vertexPosition_modelspace,1); 
    fragmentColor = vertexColor; 
} 

Model.cpp(注意modelMatrix被初始化爲單位矩陣,並且我使用GLM)

void Model::SetPos(glm::vec3 coords) 
{ 
    modelMatrix[0][3] = coords[0]; 
    modelMatrix[1][3] = coords[1]; 
    modelMatrix[2][3] = coords[2]; 
} 

void Model::Render() 
{ 
    // Select the right program 
    glUseProgram(program); 

    // Set the model matrix in the shader 
    GLuint MatrixID = glGetUniformLocation(program, "modelMatrix"); 
    glUniformMatrix4fv(MatrixID, 1, GL_FALSE, value_ptr(modelMatrix)); 

    // Setup the shader color attributes 
    glEnableVertexAttribArray(1); 
    glBindBuffer(GL_ARRAY_BUFFER, colorbuffer); 
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, nullptr); 

    // Setup the shader vertex attributes 
    glEnableVertexAttribArray(0); 
    glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer); 
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, nullptr); 

    // Draw the model 
    glDrawArrays(GL_TRIANGLES, 0, triangles); 

    // Now disable the attributes 
    glDisableVertexAttribArray(0); 
    glDisableVertexAttribArray(1); 
} 

的其它基質進行初始化這樣和保持不變:

cameraMatrix = glm::lookAt(pos, target, orient); 
projectionMatrix = glm::perspective(45.0f, 1280.0f/720.0f, 0.1f, 100.0f); 

回答

3

glm庫產生列主矩陣。您還將GL_FALSE指定爲glUniformMatrix4fv,這對於列主矩陣是正確的。但是,當您設置位置時,您正在設置錯誤的值。此代碼:

void Model::SetPos(glm::vec3 coords) 
{ 
    modelMatrix[0][3] = coords[0]; 
    modelMatrix[1][3] = coords[1]; 
    modelMatrix[2][3] = coords[2]; 
} 

導致矩陣在乘法後的w分量中產生非1.0值。這可能會導致一些奇怪的扭曲。您應該將SetPos更改爲:

void Model::SetPos(glm::vec3 coords) 
{ 
    modelMatrix[3][0] = coords[0]; 
    modelMatrix[3][1] = coords[1]; 
    modelMatrix[3][2] = coords[2]; 
}