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