我已经明白了截锥体是一个剪切立方体,相机可以看到它.我只是不明白定义它所需的论据.从这里开始,您可能会指定某种空间的某些部分.但是,例如,顶部和底部是什么?比率和比率代表什么?这是我正在谈论的一个示例函数:
Matrix.frustumM(matrixHandle, 0, ratio, -ratio, -1, 1, 3, 7);
Run Code Online (Sandbox Code Playgroud)
Luk*_*vat 16
好的,让我们从最后两个参数开始.它们指定近剪裁平面和远剪裁平面.它们实际上指定了它们与相机的距离.
远平面并不真正影响变换,但如果物体距离摄像机的距离大于指定的远平面,则不会看到它.话虽如此,您应该将其设置为合理的值,因为它会影响深度值的计算方式.
深度通常以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个值,图像将显示为拉伸.
| 归档时间: |
|
| 查看次数: |
6783 次 |
| 最近记录: |