我理解zNear,zFar标记场景的剪裁边界。但OpenTK restricts值大于零。这是否意味着我的所有物体都应该在正Z轴上绘制,以便它不会被剪裁?
答案 0 :(得分:1)
不,这只是在查看翻译后的渲染剪辑。因此,如果您使用{0,0,-100}
上的相机渲染基于例如{0,0,-110}
的对象,则在剪切平面内仍会呈现对象,但-110+zFar
和-110-zNear
之后的内容将会更远。被修剪。这是一个非常简单的解释,但实际上它是如何工作的。
答案 1 :(得分:1)
不要混淆坐标可以表示或翻译的不同空格。标记为答案的检查过于简单化,以至于在许多情况下它甚至可能都不是正确答案。
zNear和zFar距离相机#34;或世界单位中的视角,但不是世界坐标。因此,他们必须是正数。它们在负眼或相机空间中也是种。只有当摄像机与指向-z空间的z轴对齐时,才会将检查标记为正确答案,或者说明您正在剪切的内容。
它们确实有助于定义最近和最远的剪裁边界,但它们不标记场景的剪切边界。同样,这取决于您相机的位置。你定义了一个场景"。
经常说OpenGL没有摄像头。但我宁愿不这样想。有一个视图,因此有一个相机。使用lookAt
功能,您可以将视图/摄像机放置在场景中的任何位置,并将其指向您想要的任何方向。对我来说,场景是您正在渲染的所有对象,而不仅仅是这些对象的当前视图。考虑到你的zNear和zFar根本不限制你的场景,它们只会限制你的相机的观看深度。它更像是从你眼中伸出的卷尺。当你对事物的看法发生变化时,它的向量会发生变化。
例如,想象一下沿x和z轴的行和列中的块网格的场景,但是都是0的y。如果您的相机与z轴对齐,则zNear和zFar与世界z轴相关。您可能会看到一排排的相机远离相机。但是,如果相机在+100
的y处漂浮在所有物体上方并指向下方,则会将其视为一个网格。在这种情况下,zNear和zFar与场景中的z轴无关。它们只与相机在相机空间中的物体上的相机剪辑有关。