glClipPlane对裁剪frustum还是很管用的,可进一步定义视图体的范围。裁剪平面由方程Ax+By+Cz+D=0确定。所有满足[A B C D]M-1[Xe Ye Ze We]T>0的人眼坐标[Xe Ye Ze We]的点都位于该平面定义的半空间中,而该半空间以外的所有点都被裁剪掉——摘自Redbook。
在我之前写的reflection就可以用此函数裁剪掉穿过floor的物体,那时还不知道如何确定方程的参数,现在有法子了呵呵。声明,网上找的。
void findPlane(GLfloat plane[4], CVector3D& p1, CVector3D& p2, CVector3D& p3)
{
/* Need 2 vectors to find cross product. */
CVector3D vec1, vec2;
vec1.SetValue(p2.dx-p1.dx, p2.dy-p1.dy, p2.dz-p1.dz);
vec2.SetValue(p3.dx-p1.dx, p3.dy-p1.dy, p3.dz-p1.dz);
/* find cross product to get A, B, and C of plane equation */
plane[A] = vec1.dy * vec2.dz - vec1.dz * vec2.dy;
plane[B] = -(vec1.dx * vec2.dz - vec1.dz * vec2.dx);
plane[C] = vec1.dx * vec2.dy - vec1.dy * vec2.dx;
plane[D] = -(plane[0]*p1.dx + plane[1]*p1.dy + plane[2]*p1.dz);