2016-03-28 179 views
3

我知道OpenGL中的相机被定义为在负Z方向上看。因此,在一个简单的例子,我想象的要呈现我的顶点,他们必须定义类似以下内容:OpenGL:任何顶点Z坐标都必须为负数吗?

rawverts = { 
    0.0f, 0.0f, -1.0f, 
    0.0f, 0.5f, -1.0f, 
    0.5f, 0.0f, -1.0f, 
}; 

但是,绝对没有导游会告诉我答案。无论我看到什么,“Hello三角形”示例都是在z坐标保持为0的情况下制作的,每当定义更复杂的网格时,甚至不显示坐标。我仍然不知道他们的坐标可能被绘制到屏幕上。举个例子,GLM ::观点:

glm::mat4 projectionMatrix = glm::perspective(
    FoV,   // The horizontal Field of View, in degrees : the amount of "zoom". Think "camera lens". Usually between 90° (extra wide) and 30° (quite zoomed in) 
    4.0f/3.0f, // Aspect Ratio. Depends on the size of your window. Notice that 4/3 == 800/600 == 1280/960, sounds familiar ? 
    0.1f,  // Near clipping plane. Keep as big as possible, or you'll get precision issues. 
    100.0f  // Far clipping plane. Keep as little as possible. 
); 

但是,如何才能裁剪平面与任何积极值定义?相机朝向-Z方向!此外,如果我在-1和-4等创建近/远裁剪平面,现在是否使任何大于-1或小于-4的Z坐标无效?或者,原始的z坐标只能在0和-1之间有效(同样,z坐标绝对不能是正数?)..?

但让我们假设实际发生的事情是,OpenGL(或glm)采用剪切平面值并暗中否定它们。所以,我的-1到-4变成1到4.现在这是否会使任何小于1且超过4的Z坐标无效,因此0.0f, 0.0f, -1.0f将不会被绘制在屏幕上?

在这个阶段,我会把答案视为一本书的指针或一些有关此问题的资料。

+0

近和远总是被定义为距相机的距离,而不是空间中的某些点。否则,在移动相机时剪切平面会遍布整个地方。恰恰相反,相机在默认情况下沿着-z查看。 – weltensturm

回答

3

不,点/顶点可以有一个正的z坐标,但除非相机移回,否则不会看到它们。

This article谈论关于通过的约三分之一。

+0

好吧,让我说我把相机移回1000.0f单位,然后想使用'glm :: perspective()' - 接近和远的飞机如何表现呢? –

+2

@MaxB剪切平面总是相对于相机。移动相机时不需要更改它们。 – HolyBlackCat

0

你的问题是你不理解坐标系和变换。

首先是窗口坐标。它是窗口中的像素网格,非常简单。没有z轴。

接下来是NDC。去谷歌上查询。它是一个从xyz轴-1到1的立方体。如果您加载了模型视图和投影矩阵以及标识,则这是您渲染的空间。通过指定您从NDC转换到窗口坐标的视口。剪切立方体外顶点的像素。

对投影和模型视图矩阵的处理是,您在NDC立方体上创建一个转换,使其覆盖对象。移动相机时,您可以改变转换。变换可以将顶点从任何位置转换到NDC立方体,包括负Z坐标。

这是事情工作的简短版本。长版本太长而无法进入此处。欲了解更多信息,请询问具体问题或更好地阅读有关该主题的文献。