南氏珍藏 / android / gluLookAt和glOrtho要联系起来看

0 0

   

gluLookAt和glOrtho要联系起来看

2014-08-26  南氏珍藏

本文转自:http://sophiestone.i.sohu.com/blog/view/3915251.htm

用glOrthO()定义一个正交投影变换,gluLookAt()的最后两个参数是指眼睛离视景体的最小最大位置。要使gluLookAt()定义的观察点能够看到图形,就要把它与glOrtho()的near与far联系起来。


void COpenGLDemoView::GLReSize(int cx, int cy)
{
double nRange=400.0;

if(cy==0)
cy=1;
glViewport(0,0,cx,cy);
glMatrixMode(GL_PROJECTION);

glLoadIdentity();

//define 视景体(left,right,top,near,far)
if (cx<=cy)
{
   glOrtho(-nRange,nRange,-nRange*cy/cx,nRange*cy/cx,-nRange,nRange);
}
else
{
   glOrtho(-nRange*cx/cy,nRange*cx/cy,-nRange,nRange,-nRange,nRange);
}
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

//Set the 视点和方向
double eye[]={0,0,3*nRange};//观察点位置,以Z方向代表物体的远近
double ref[]={0,0,0};//指定参考点的位置
double up_dir[]={0,1,0};//代表物体的朝向的一个矢量。OpenGL是通过z方向的值来表明物体的远近的,
//一般来说,物体的朝向就是y方向了。 

gluLookAt(eye[0],eye[1],eye[2],ref[0],ref[1],ref[2],up_dir[0],up_dir[1],up_dir[2]);

 

}
物体大小(-80<X<80,-325<Y<-70,180<Z<370)
物体的中心大概是(0,-200,275)
如果把double ref[]={0,0,0};//指定参考点的位置
改为double ref[]={0,-200,275};还是看不到图形,
我不是用了gluLookAt定义在Z=3X400=1200的地方看一个XYZ坐标范围都在(-400,400)的一个视景体中所有的图形吗,图行又在这个视景体中,怎么看不到呢?这个又是正投影变换,在那里看都不改变物体的大小的啊!


//Set the 视点和方向
double eye[]={0,0,3*nRange};//观察点位置,也就是眼睛的位置
double ref[]={0,0,0};//指定参考点的位置
double up_dir[]={0,1,0};//代表物体的朝向的一个矢量。OpenGL是通过z方向的值来表明物体的远近的,
//一般来说,物体的朝向就是y方向了。 

gluLookAt(eye[0],eye[1],eye[2],ref[0],ref[1],ref[2],up_dir[0],up_dir[1],up_dir[2]);
注释掉就可以看到图形,这倒底是怎么回事啊?

如果把gluLookAt()注释掉后,我上面定义的 glOrtho(-nRange,nRange,-nRange*cy/cx,nRange*cy/cx,-nRange,nRange);视点是在原点还是在z=400(nRange)处啊?因为我没有改变坐标系啊,书上说没有变换就在原点。


glOrtho(left,right,bottom,top,zNear,zFar)的最后两项是指和你眼睛的距离,你现在既然眼睛在(0,0,1200)处,zNear = -nRange, zFar = nRange,nRange=400,意思就是说你的视景体现在大概是(-400,400,-400,400,1600,800)这样你的物体是绘制在Z方向上<800的地方,所以可能看不到

现在最佳的near与far应该为
glOrtho(-nRange*cx/cy,nRange*cx/cy,-nRange,nRange,800,1300);
这样Z的范围就在(1200-1300)=-100<Z<(1200-800)=400。(我还画了三个长为100坐标轴,要多留一点旋转的空间)这样也相对的确定了视景体在Z方向的范围。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。如发现有害或侵权内容,请点击这里 或 拨打24小时举报电话:4000070609 与我们联系。

    猜你喜欢

    0条评论

    发表

    请遵守用户 评论公约

    类似文章
    喜欢该文的人也喜欢 更多