透视矩阵-位置[3][3]怎么可能为0?

问题描述 投票:0回答:0

我正在开发一个玩具游戏引擎,并注意到在我使用的数学库中创建透视相机的代码看起来像这样(来自 https://ogldev.org/www/tutorial12/tutorial12.html ):

void Pipeline::InitPerspectiveProj(Matrix4f& m) const>
{
    const float ar = m_persProj.Width / m_persProj.Height;
    const float zNear = m_persProj.zNear;
    const float zFar = m_persProj.zFar;
    const float zRange = zNear - zFar;
    const float tanHalfFOV = tanf(ToRadian(m_persProj.FOV / 2.0));

    m.m[0][0] = 1.0f / (tanHalfFOV * ar);
    m.m[0][1] = 0.0f;
    m.m[0][2] = 0.0f;
    m.m[0][3] = 0.0f;

    m.m[1][0] = 0.0f;
    m.m[1][1] = 1.0f / tanHalfFOV;
    m.m[1][2] = 0.0f;
    m.m[1][3] = 0.0f;

    m.m[2][0] = 0.0f;
    m.m[2][1] = 0.0f;
    m.m[2][2] = (-zNear - zFar) / zRange;
    m.m[2][3] = 2.0f * zFar * zNear / zRange;

    m.m[3][0] = 0.0f;
    m.m[3][1] = 0.0f;
    m.m[3][2] = 1.0f;
    m.m[3][3] = 0.0f;
}

另一个例子https://github.com/dimforge/nalgebra/blob/1bc919e0dbf2f7e83fab8aed37c1a06fe1b4fc93/nalgebra-glm/src/ext/matrix_clip_space.rs#L656

我的问题特别是关于这个

m.m[3][3] = 0.0f;

矩阵右下角的元素怎么可能是

0
? 这会将所有轴上的每个顶点统一缩小 0。有效地将所有模型缩小到空间中的一个点。自己尝试一下https://harry7557558.github.io/tools/matrixv.html

我错过了什么? 我正在我的引擎中执行以下操作以使其工作(并且它确实有效)

    let mut perspective = glm::perspective(fov, ratio, near, far);
    perspective[(3,3)] = 1.0; // set this back to 1.0
    batch.render(&screen, &perspective);

但我确定这并不意味着要以这种方式使用。

math matrix 3d matrix-multiplication perspectivecamera
© www.soinside.com 2019 - 2024. All rights reserved.