OpenGL中截头体的论点是什么意思?

时间:2014-04-26 11:01:31

标签: android opengl-es

我已经明白截头锥是一个剪裁立方体,相机可以看到它。我只是不明白定义它所需的论据。从here开始,您可能会指定某种空间的某些部分。但是,例如,顶部和底部是什么?比率和比率代表什么?这是我正在谈论的一个示例函数:

Matrix.frustumM(matrixHandle, 0, ratio, -ratio, -1, 1, 3, 7);

2 个答案:

答案 0 :(得分:15)

好的,让我们从最后两个参数开始。它们指定近剪裁平面和远剪裁平面。它们实际上指定了它们与相机的距离。

远平面并不会真正影响变换,但如果物体与相机的距离大于指定的远平面,则您无法看到它。话虽如此,您应该将其设置为合理的值,因为它会影响深度值的计算方式。

深度通常以8位存储(不要让我这样做),所以你基本上只有256个可能的深度。这意味着如果你的远剪裁平面非常高,那么两个彼此靠近的对象可能会获得相同的深度值,即使其中一个在另一个之后。这导致了一种叫做z-fighting的东西。那篇http://en.wikipedia.org/wiki/Z-fighting上有一篇wiki文章。

确定。这就是遥远的飞机。现在,左/右,上/下。想象一个具有以下顶点(左,顶),(右,顶),(右,底),(左,底)的矩形。然后取出该矩形,并将其远离相机移动,与近平面参数中指定的一样多。然后从相机通过每个顶点绘制线条。然后你拍摄一个无限平面(与你刚刚移动的矩形平行)并将它放置在远星平面参数指定的远离相机的位置。四条线与无限平面相交的位置是一个新矩形的顶点,它将代表视锥体的背面。

你的视锥体现在由这两个矩形和连接它们的线组成。

这些比率的原因,-ratio参数是因为示例选择1和-1作为顶部和底部值。例如,屏幕的宽高比表示为宽度/高度。这意味着您可以通过将高度与纵横比相乘来获得屏幕的宽度。这是一回事。正确的值应该是比率* top但是因为top是1,所以只剩下比率。

现在这都是非常抽象的东西。很难想象每个参数如何影响实际图像。幸运的是,这个非常好的东西可以让你玩http://relativity.net.au/gaming/java/Frustum.html

尝试将左右两侧更改为-2和2.这会导致图像水平压扁。正如您所看到的,实际的"窗口"有方形的形状,但如果它的宽度是它的两倍,那么图像就会伸展回原来的比例。

如果我们使用这种窗口保留-1,1个值,图像将显示为拉伸。

答案 1 :(得分:2)

frustum 不是一个多维数据集,它只是一个......,好吧,frustum。在计算机图形学中,人们使用pryamid视锥体来表示透视投影。眼点代表金字塔的顶部,并且它具有矩形底座(因为这是由大多数显示设备定义的形状,并且窗口通常也是矩形的)。平截头体本身通过角度定义(或由你如何看待它定义) - 场f视图 - 在垂直和水平维度,限制金字塔的近和远平面,以及水平和垂直转移“离轴投影”(就像投影仪的镜头移位一样)。大多数时候,使用对称平截头体,然而,确实存在那6个自由度。 GL或矩阵库的经典frustum()函数也有6个参数,但截头积分的定义方式略有不同:

参数nearfar分别定义到近anf远裁剪平面的距离(沿观察方向)。作为侧节点:在OpenGL中,通常使用的约定是查看方向是-z,nearfar参数被解释为z=-near和{{1}相反,因为那些应该在相机前面。

其余参数z=-farleftrighttop在近平面上被解释为 - 它们定义了bottom平面上的轴对齐矩形。因此视角的视场是通过这些参数与z=-near值的关系来定义的。对于对称平截头体(这意味着您的相机指向的中心点将出现在视口的中心),您应该设置nearleft=-right的参数。

  

从这里看起来像是指定了某种空间的部分。但对于   例如,顶部和底部的什么?

你应该知道这只是一个转换矩阵。通常,您有某种视图转换,它将顶点坐标转换为眼睛空间,其中摄像机位于定义明确的位置并且定位在明确定义的位置方式,像相机在原点,并在-z方向看。透视投影是通过应用投影矩阵来实现的,就像你从bottom=-top函数得到的那样。因此,解释frustum()函数的参数的空间是眼睛空间,并且相对于您的相机位置和方向被解释。

  

比率和比率代表什么?

嗯,可以说,这只是定义一些对称水平视野的一些值。但是,您应该知道投影矩阵通常会考虑输出窗口的纵横比。如果您的窗口宽度超过它的高度,则您的水平视野将大于垂直视野(否则您将获得一些失真,眼睛空间中的方形对象将不会在窗口空间中显示为正方形)。为了保持apsect比率,参数的比例frustum()应该等于窗口的宽高比((right-left) / (top-bottom)) - 因此示例中的width/height很可能只是宽高比。