三维模型翻译使对象变形

时间:2016-04-30 11:03:53

标签: c++ opengl matrix 3d

我创建了一个渲染3d立方体的程序,现在我想改变立方体的位置。我现在正在做的矩阵乘法似乎扭曲了立方体而不是改变它的位置。对于0.1-0.4范围内的值,失真很小,并在整个屏幕上填充更大的值。

顶点着色器:

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

1 个答案:

答案 0 :(得分:3)

glm库生成列主要矩阵。您还为glUniformMatrix4fv指定了GL_FALSE,这对于列主矩阵是正确的。但是,在设置位置时,您设置的值不正确。这段代码:

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];
}