在这个章节中我们将在OpenGL应用程序中引进视景体的形状。它是使用函数gluPerspective来定义透视投影,然后使用gluLookAt函数来定义相机的位置。
首先,让我们回味一下这些函数的参数(都是float类型):
1. gluPerspective(fovy, ratio, nearDist, farDist)
2. gluLookAt(px, py, pz, lx, ly, lz, ux, uy, uz);
金字塔的顶点就是相机的位置(px, py, pz)。一个视线射线方式可以由下面计算 d = l - p,其中l = (lx, ly, lz),和原点p = (px, py, pz)。近平面和远平面都垂直于这条视线,并且相交于距离为nearDist和farDist的位置,近平面和远平面,就是函数中的距离,和fov(视线的垂直角度),和ratio(垂直和水平的比例)。
近平面的包围矩形的高度和宽度定义如下:
Hnear = 2 * tan (fov / 2) * nearDist;
Wnear = Hnear * ratio
同样的结论适用于远平面:
Hfar = 2 * tan (fov / 2) * farDist;
Wfar = Hfar * ratio.
为了定义视景体裁剪,我们需要两个步骤:
1. 算出视景体的信息-这个是在每一次视景体发生改变时做的,比如说,当相机移动或者透视改变时。
2. 测试物体跟视景体的相交结果来决定是否裁剪-这个是在每一帧中每个物体都需要计算的。如果每个裁剪状态在帧之间保持不变那么测试仅在相机移动时发生,比如说,视景体更新或者透视改变。
这个例子打开三个窗口:使用者相机窗口,一个由使用者相机和视景体可以在顶端可以看到的窗口,最后一个是从右边看的视景体。在视景体里面的球用绿色来表示,如果相交用黄色绘制,如果在外面用红色绘制。
英文地址