【问题标题】:How do you calculate a perspective projection matrix?你如何计算透视投影矩阵?
【发布时间】:2021-04-09 03:51:01
【问题描述】:

现在我可以使用矩阵来缩放、旋转和平移点。

// I use a left to right multiplying style (scale, rotate, then translate)
Matrix model = Matrix::Scale(0.4f) * Matrix::Rotation(45.0f, Vector3(0.0f, 0.0f, 1.0f)) * Matrix::Translation(Vector3(0.0f, 0.5f)).Transposed();
// vertex shader code
#version 460 core

layout (location = 0) in vec3 vertexPosition;

uniform mat4 model;

void main() {
    gl_Position = model * vec4(vertexPosition, 1.0);
}

我遇到的主要问题是创建透视投影矩阵。

static Matrix Projection(float verticalFoV, float aspectRatio, float zNear, float zFar) {
        // is this even correct?
        float yScale = (1.0f / tan(verticalFoV / 2.0f)) * aspectRatio;
        float xScale = yScale / aspectRatio;
        float frustumLength = zFar - zNear;

        return Matrix({
            xScale, 0, 0, 0,
            0, yScale, 0, 0,
            0, 0, -((zFar + zNear) / frustumLength), -((2.0f * zNear * zFar) / frustumLength),
            0, 0, -1.0f, 0
        });
    }

然后会像这样使用。

Matrix projection = Matrix::Projection(70.0f * DegreesToRadians, screenWidth / screenHeight, 0.1f, 100.0f);

我发送矩阵而不转置它们。

glUniformMatrix4fv(glGetUniformLocation(shaderProgram, "model"), 1, false, &model[0][0]);
glUniformMatrix4fv(glGetUniformLocation(shaderProgram, "projection"), 1, false, &projection[0][0]);

我希望能够在顶点着色器中将它们从左到右相乘。

#version 460 core

layout (location = 0) in vec3 vertexPosition;

uniform mat4 model;
uniform mat4 projection;

void main() {
    // I'm eventually gonna add view so it'd look like this
    // gl_Position = model * view * projection * vec4(vertexPosition, 1.0);
    gl_Position = model * projection * vec4(vertexPosition, 1.0);
}

P.S:我想使用左手坐标系。 (右 = +X,上 = +Y,前进 = +Z)

【问题讨论】:

    标签: c++ opengl matrix projection-matrix


    【解决方案1】:

    OpenGL 矩阵按列主要顺序存储。您的矩阵以行主要顺序存储。因此,您必须将矩阵乘以右边的向量:

    gl_Position = model * projection * vec4(vertexPosition, 1.0);

    gl_Position = vec4(vertexPosition, 1.0) * model * projection;
    

    【讨论】:

      猜你喜欢
      • 2011-09-05
      • 2015-08-06
      • 2013-04-17
      • 1970-01-01
      • 2013-08-26
      • 1970-01-01
      • 2011-06-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多