通过函数gluUnProject()得到三个坐标点P1,P2,P3确定裁剪平面的问题,如果你是要基于物体坐标系(世界坐标)做裁剪,那么请不用看后文了;
如果你是在视觉坐标系下做裁剪那么请看后文,因为这三个点很有可能是在已经发生视图变换之后的坐标系下获取的反投影坐标,就要把这些坐标值转换成在模型视图变换后和投影变换之前的坐标值,也就是该坐标必须再经过与模型视图矩阵相乘变换才能用来作为裁剪面的三个点。然后根据这新的三点P1’,P2’,P3’确定一个平面方程,得到相应系数A,B,C和D。分三点说明:
1.使用glGetDoublev(GL_MODELVIEW_MATRIX,modelViewMatrix)获取模型视图矩阵要注意在此函数前面应用已经使用的模型视图变换,保持坐标系对应吻合,从而得到正确的模型视图矩阵modelViewMatrix。modelViewMatrix是一个16个double元素的一维数组。对应到二维数组M就是modelViewMatrix [4j+i]对应于M[i][j]元素中,其中i,j=0=0,1,2,3。
2.再通过根据1所得的modelViewMatrix [4j+i]把P1,P2,P3变换到相应的坐标空间,也就是
P1’=P1 *M’,//注意是M的转置M'
P2’=P2* M’,
P3’=P3* M’
注意相乘的规则是坐标点乘以矩阵的转置,如下所示(hx,hy,hz表示原坐标P值,new_x,new_y,new_z表示新坐标)
new_x=modelViewMatrix[0]*hx+modelViewMatrix[4]*hy+modelViewMatrix[8]*hz+modelViewMatrix[12];
new_y=modelViewMatrix[1]*hx+modelViewMatrix[5]*hy+modelViewMatrix[9]*hz+modelViewMatrix[13];
new_z=modelViewMatrix[2]*hx+modelViewMatrix[6]*hy+modelViewMatrix[10]*hz+modelViewMatrix[14];
3,利用新的三点确定裁剪面的方程