gluPerspective使用右手坐标系,跟opengl一样.(x/y/z分别是右/上/屏幕往外);glFrustum使用eye coordinate system(相机坐标系,或者眼睛坐标系),x/y与gluPerspective相同,但是z轴反向,是顺着视线方向的(x/y/z分别是右/上屏幕往里),所以转换时需要注意zFar的值(zFar是最后2个参数中比较大的那个.如果原来zFar是负值,则需要反向).
下图2个坐标系分别是gluPerspective使用的坐标系和glFrustum使用的坐标系.
这2个函数的参数转换原理如下图:
下面是个转换函数:(仅限于显示区域对称的情况)
测试用参数: fovy = 45.0, zNear = 50.0, zFar = -1000.0;
void Perspective2Frustum(double fovy, double fAspect, double zNear, double zFar)
{
const double DEG2RAD = 3.1415926/180;
double ymin, ymax, xmin, xmax, tangent;
tangent = tan(fovy/2 * DEG2RAD);
ymax = zNear * tangent;
xmax = ymax * fAspect;
ymin = -ymax;
xmin = -xmax;
glFrustum(xmin,xmax,ymin,ymax,zNear,-zFar);
}
对于显示区域不对称的情况,gluPerspective就无能为力了,必须分别指定glFrustum的各个参数来实现透视投影变换.还有一种情况是使用多个显示器来显示时,对于每个显示区域可以分别指定glFrustum的参数来拼接场景.
参考资料:http://www.songho.ca/opengl/gl_transform.html
No comments :
Post a Comment