为什么规范化设备坐标系是左手坐标系?

8

一开始我很好奇为什么NDC范围从-1到1,而不是从0到1。我想也许把原点放在中心有些用处。

但为什么要使用左手坐标系呢?

难道只是为了使离观察者更远的物体Z值更高吗?对我来说这已经足够合理了。


我不明白一个居中的原点怎么就意味着它是“左手”的... - Ed S.
1
为什么右手坐标系会更好? - cmannett85
1
@cbamber85 这样就能与其他所有内容保持一致了。请不管是谁,都给出否定投票的理由... - Steven Lu
就像任何一个三维坐标系一样,它并不是用来迷惑他人的。当然,我只是开个玩笑,但我只是在寻找一个合理的理由来证明为什么左手坐标系对于NDC是合理的。因为如果没有合理的理由,我相信他们肯定会将其设计成和其他一切一样都是右手坐标系的。 - Steven Lu
2
你应该编辑你的问题,包括“其他一切”,我所能想到的唯一一个具有固定右手坐标系的框架/API是Direct3D...否则它们在数学和计算上是等效的。 - cmannett85
显示剩余2条评论
3个回答

15
但为什么默认情况下使用左手坐标系呢?
让我们在问题中加入“默认情况下”。因为只需要更改 glDepthRange(1.0f, 0.0f);,现在就可以变成右手坐标系了。是的,这是合法的GL语法;从来没有限制近z范围小于远z范围。
为什么默认情况下是左手坐标系?也许ARB中有人喜欢这样。也许ARB中有人喜欢增加深度范围而不是减少深度范围,因此需要较低的左下角方向。可能是因为OpenGL的前身IRIX GL就是这样做的,ARB认为没有必要更改它。
这个原因并不重要;手性纯粹是一种符号上的便利。在某些地方,右手坐标系很有道理。在其他地方,左手坐标系很有道理。由于它可以轻松地进行更改,所以只需使用适合您的内容即可。
那么这将与其他所有东西保持一致。
与什么其他所有东西保持一致?所有已被删除的固定功能吗?
视口转换全部由OpenGL在内部完成,没有人可以访问它。您甚至不提供矩阵;您只提供视口和深度范围。因此,对于使用固定功能GL的人来说,一切都是右手坐标系。
唯一涉及手性的时候是直接处理顶点着色器的情况,其中必须知道剪辑空间的手性。在这种情况下,手性的变化是透视投影否定Z的简单函数。或者,如果您喜欢左手坐标系,则透视投影不否定Z。或者再次反转 glDepthRange,现在就变成右手坐标系了。

8

但为什么要使用左手坐标系?

这样,在视角方向中,从投影平面越远的距离映射到深度缓冲区的值就越大。

难道只是因为远离对象的Z值更高吗?那对我来说已经足够了。

是的,这正是其原因。


0
猜测左右手坐标系的变化是由图形卡如何解释z值所决定的。更大的z值意味着更深的深度。投影矩阵可以在不增加额外成本的情况下执行所需的左右手坐标系变换。稍后更改将添加额外的计算步骤。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接