如何正确计算正交投影矩阵?
How to correctly calculate an orthographic projection matrix?
我遇到过许多不同的公式来构建投影矩阵,它们都给出不同的输出,但我觉得我误解了这个概念。目前我有这个:
//x = 10 | y = 10 | width = 800 | height = 600
float left = x;
float top = y;
float right = x + width;
float bottom = y + height;
final Matrix4f pMatrix = new Matrix4f();
pMatrix.m[0][0] = 2f / (right - left);
pMatrix.m[1][1] = 2f / (top - bottom);
pMatrix.m[2][2] = -2f / (farZ - nearZ);
pMatrix.m[3][0] = -(right + left) / (right - left);
pMatrix.m[3][1] = -(top + bottom) / (top - bottom);
pMatrix.m[3][2] = -(farZ + nearZ) / (farZ - nearZ);
pMatrix.m[3][3] = 1;
使用给定的输出:
0.0025, 0.0, 0.0, -1.025
0.0, -0.0033333334, 0.0, 1.0333333
0.0, 0.0, -0.0068965517, -2.724138
0.0, 0.0, 0.0, 1.0
但是我不确定 right
和 bottom
常量是 x + width & y + height 还是简单的 width & height?在网络上的一些文章中,人们使用不同的公式同时使用两者。
Right和Bottom,在这个计算中,应该是绝对的——也就是right = x + width
。你的计算看起来是正确的。主要提示是像这样的行:
pMatrix.m[0][0] = 2f / (right - left);
x 组件正在按屏幕宽度缩放。现在,根据您当前的设置,right - left
与 (x + width) - x
相同。那肯定会给 width
。相反,如果您使用 right = width
,则计算结果将变为 width - x
,这毫无意义。
我遇到过许多不同的公式来构建投影矩阵,它们都给出不同的输出,但我觉得我误解了这个概念。目前我有这个:
//x = 10 | y = 10 | width = 800 | height = 600
float left = x;
float top = y;
float right = x + width;
float bottom = y + height;
final Matrix4f pMatrix = new Matrix4f();
pMatrix.m[0][0] = 2f / (right - left);
pMatrix.m[1][1] = 2f / (top - bottom);
pMatrix.m[2][2] = -2f / (farZ - nearZ);
pMatrix.m[3][0] = -(right + left) / (right - left);
pMatrix.m[3][1] = -(top + bottom) / (top - bottom);
pMatrix.m[3][2] = -(farZ + nearZ) / (farZ - nearZ);
pMatrix.m[3][3] = 1;
使用给定的输出:
0.0025, 0.0, 0.0, -1.025
0.0, -0.0033333334, 0.0, 1.0333333
0.0, 0.0, -0.0068965517, -2.724138
0.0, 0.0, 0.0, 1.0
但是我不确定 right
和 bottom
常量是 x + width & y + height 还是简单的 width & height?在网络上的一些文章中,人们使用不同的公式同时使用两者。
Right和Bottom,在这个计算中,应该是绝对的——也就是right = x + width
。你的计算看起来是正确的。主要提示是像这样的行:
pMatrix.m[0][0] = 2f / (right - left);
x 组件正在按屏幕宽度缩放。现在,根据您当前的设置,right - left
与 (x + width) - x
相同。那肯定会给 width
。相反,如果您使用 right = width
,则计算结果将变为 width - x
,这毫无意义。