简单的问题:对于正交视图,手性是否会改变近和远的值?例如:左手俯视z为正(向远处),向右俯视z为负值。
这是否意味着左手近/远应为-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
地图-1
和z_view
-far
地图+1
。
实际(绝对)值取决于您的场景。通常,您不希望在相机后面显示任何内容。因此,您可以将near
设置为0(或到场景中第一个对象的距离)。您应该将far
至少设置为最远像素到相机的距离。如果要使用左手坐标系,请反转这些值。例如。左手的[0,2]为左手的[0,-2]。
如果您不想总是考虑这个问题,可以将投影矩阵的手性部分提取到单独的比例矩阵中:
ProjectionRH = Ortho * Scal(1, 1, 1)
ProjectionLH = Ortho * Scal(1, 1, -1)