我正在开发一个玩具游戏引擎,并注意到在我使用的数学库中创建透视相机的代码看起来像这样(来自 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;
}
我的问题特别是关于这个
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);
但我确定这并不意味着要以这种方式使用。