2

简单的问题:惯用手会改变正交视图的近距和远距值吗?例如:左手向下看 z 是正值(越远),右手向下看 z 是负值。

这是否意味着左手近/远应该是-1,1,右手近/远应该是1,-1?还是总是-1,1?

4

1 回答 1

4

如果您使用例如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_viewof-near映射到-1和 a z_viewof-far映射到+1

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

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

ProjectionRH = Ortho * Scal(1, 1,  1)
ProjectionLH = Ortho * Scal(1, 1, -1)
于 2013-02-12T17:18:14.363 回答