您正在使用的投影矩阵是提供透视的透视矩阵。当您在 3D 中工作时这很好,但是当您想要渲染 2D(例如渲染 GUI)时,您不想添加透视图。
正交矩阵是一个基本上忽略透视的矩阵,所以远处的物体和近处的物体一样大。
如果你画一个盒子(一个顶部缺失的立方体),它们之间的区别可以如下所示:
Perspective vs Orthigonal
O---------O O---------O
|\ /| | |
| o-----o | | |
| | | | | |
| o-----o | | |
|/ \| | |
O---------O O---------O
那么在你的情况下会发生什么?好吧,不在屏幕中心的对象自然会远离屏幕中心附近的对象。正因为如此,他们被拉得更近了。
例子:
A B C Point A (-5, 0, 5)
\ | / Point B ( 0, 0, 5)
\ | / Point C ( 5, 0, 5)
\ | /
\ | /
\ | /
\|/
V
如您所见,A 点和 B 点距离较远。如果我们使用非常基本的透视图(它更复杂,但作为示例就足够了)来计算每个点在屏幕上的位置,那么我们将使用以下公式:
Vector2 Perspective(Vector3 pos)
{
return Vector2(pos.x, pos.y) / pos.length();
}
现在正交矩阵将更符合以下几点:
Vector2 Orthogonal(Vector3 pos)
{
return Vector2(pos.x, pos.y);
}
因此,当您用新的正交矩阵替换旧的透视矩阵时,您应该不再有透视问题。