【发布时间】:2015-02-04 07:10:33
【问题描述】:
我了解 zNear、zFar 标记了场景的剪裁边界。但是OpenTK restricts 的值要大于零。这是否意味着我所有的对象都应该在 Z 轴正方向上绘制,这样它就不会被剪裁?
【问题讨论】:
我了解 zNear、zFar 标记了场景的剪裁边界。但是OpenTK restricts 的值要大于零。这是否意味着我所有的对象都应该在 Z 轴正方向上绘制,这样它就不会被剪裁?
【问题讨论】:
不要混淆坐标可以在其中表示或转换为的不同空间。带有复选标记的答案过于简单化,以至于在许多情况下它甚至可能不是正确答案。
zNear 和 zFar 以世界单位表示距“相机”或视线的距离,但不是以世界坐标表示。因此它们必须是正数。它们也是某种在负眼睛或相机空间。仅当相机与指向 -z 空间的 z 轴对齐时,复选标记的答案才是正确的,或者您对剪辑内容的陈述是正确的。
它们确实有助于定义最近和最远的剪辑边界,但它们不会标记场景的剪辑边界。同样,这将取决于您的相机的位置。还有你对“场景”的定义。
人们常说 OpenGL 没有摄像头。但我不想那样想。有一个视图,因此有一个相机。使用lookAt 函数,您可以将视图/相机放置在场景中的任何位置,并将其指向您想要的任何方向。对我来说,您的 场景 是您正在渲染的所有对象,而不仅仅是这些对象的当前视图。这样想你的 zNear 和 zFar 根本不会限制你的场景,它们只会限制你相机的观察深度。它更像是从你的眼睛伸出的卷尺。它的矢量会随着你对事物的看法发生变化而变化。
例如,想象一个场景中的块网格沿 x 和 z 轴呈行和列排列,但所有的 y 都为 0。如果您的相机与 z 轴对齐,则 zNear 和 zFar 与世界 z 轴相关.您可能会看到成排的方块远离相机。但是,如果相机在+100 的 y 处漂浮在所有物体上方并指向下方,您会看到它更像是一个网格。在这种情况下,zNear 和 zFar 与场景中的 z 轴无关。它们只与相机在相机 z 轴(相机空间)中对象的剪裁有关。
【讨论】:
不,这只是在查看翻译后的渲染剪辑。因此,如果您使用 {0,0,-110} 的相机渲染一个基于例如 {0,0,-100} 的对象,它仍然会在剪切平面内渲染,但更远的东西会被剪切 -110+zFar 和 -110-zNear。这是一个非常简单的解释,但实际上它是如何工作的。
【讨论】:
-110+zNear?