OpenGL正交视图近/远值

时间:2013-02-12 16:04:16

标签: opengl graphics orthogonal

简单的问题:对于正交视图,手性是否会改变近和远的值?例如:左手俯视z为正(向远处),向右俯视z为负值。

这是否意味着左手近/远应为-1,1而右手近/远应为1,-1?还是只是-1,1?

1 个答案:

答案 0 :(得分:3)

如果您使用例如创建投影矩阵glOrtho(),您提供更近和更深的剪裁平面的值。如果您查看实际矩阵,您将看到投影后得到的z坐标是

z_proj = (-2 * z_view - far - near) / (far - near)

如果far > near,则此值会随着z_view的减少而增加。这意味着具有较小z_view的对象比具有较大z_view的对象更远。这等于右手坐标系,相机前面的物体具有负z值。

如果far < near,则此值会随着z_view的增加而增加。这意味着具有较大z_view的对象比具有较小z_view的对象更远。这等于左手坐标系,相机前面的物体具有正z值。

您可能还会注意到z_view -near地图-1z_view -far地图+1

实际(绝对)值取决于您的场景。通常,您不希望在相机后面显示任何内容。因此,您可以将near设置为0(或到场景中第一个对象的距离)。您应该将far至少设置为最远像素到相机的距离。如果要使用左手坐标系,请反转这些值。例如。左手的[0,2]为左手的[0,-2]。

如果您不想总是考虑这个问题,可以将投影矩阵的手性部分提取到单独的比例矩阵中:

ProjectionRH = Ortho * Scal(1, 1,  1)
ProjectionLH = Ortho * Scal(1, 1, -1)