前面提出的方法是基于由六个平面限制的视景体。在这些方法中就是使用扩展的平面方程来设置参数,其中的测试都是跟平面做测试。在这一节中将提出不一样的方法,这个方法是基于名字来源于Game Programming Gems 5 的技术。
假设相机是基于三个单元向量组成:在下图中显示的X,Y和Z。注意下面参考的不是一个右手坐标系(在OpenGL中),因为在本课程中使用这样的Z方向看起来更直观。
给一个要在视景体中要测试的点p,我们的目标是找到它引用的坐标和然后使用这些信息判断点是在视景体之内还是之外。
首先先测试z坐标,如果z坐标没有位于近平面距离和远平面距离之间那么就可以确定点是在视景体之外。否则坐标x,y必须被测试。
在上图中,p是要测试的点。假设pc是点在相机坐标的参考点,为了找到pc的z坐标,首先必须找到从点cc(相机中心)到p的坐标pc.z,然后计算出在向量z上(投影就是蓝色的点)的投影长度。就像在数学库中讲解的lines章节,这可以用点积来计算(这个是有效的,因为我们假设z坐标是单位向量),因此:
v = p - cc
pc.z = v . Z
如果pc.z不在nearDist和farDist之间那么就在视景体之外:
if (pc.z > farDist || pc.z < nearDist)
return (OUTSIDE);
既然pc.z我们都可以知道,其中pc是点p在相机坐标的坐标。为了找到pc.x和pc.y我们可以使用相似的方法:找到在X和Y坐标轴上的投影长度。
v = p - cc
pc.z = v . Z
pc.y = v . Y
pc.x = v . X