游戏开发论坛

 找回密码
 立即注册
搜索
查看: 7265|回复: 6

湖涂了,请高手解释一下我用的gluLookAt()与glOrtho()为什么

[复制链接]

5

主题

9

帖子

9

积分

新手上路

Rank: 1

积分
9
发表于 2005-11-15 12:27:00 | 显示全部楼层 |阅读模式
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};//观察点位置,以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]);
注释掉就可以看到图形,这倒底是怎么回事啊?
如果把gluLookAt()注释掉后,我上面定义的 glOrtho(-nRange,nRange,-nRange*cy/cx,nRange*cy/cx,-nRange,nRange);视点是在原点还是在z=400(nRange)处啊?因为我没有改变坐标系啊,书上说没有变换就在原点。

6

主题

37

帖子

37

积分

注册会员

Rank: 2

积分
37
发表于 2005-11-22 11:33:00 | 显示全部楼层

Re:湖涂了,请高手解释一下我用的gluLookAt()与glOrtho()为什

你说得很对啊!好像看不出什么破绽!但是我觉得:
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);
}
其中最后两项是表示你的视景体在Z方向上离眼睛的距离,一个是-400,一个是400 ,意思就是说你的视景体现在大概是(-400,400,<-400,>400,1600,800)这样你的物体是绘制在Z方向上<800的地方,所以可能看不到

6

主题

37

帖子

37

积分

注册会员

Rank: 2

积分
37
发表于 2005-11-22 11:42:00 | 显示全部楼层

Re:湖涂了,请高手解释一下我用的gluLookAt()与glOrtho()为什

再补充一句:书上说glOrtho(left,right,bottom,top,zNear,zFar)

其中最后两个即zNear,zFar要求为正数

5

主题

9

帖子

9

积分

新手上路

Rank: 1

积分
9
 楼主| 发表于 2005-11-24 09:28:00 | 显示全部楼层

Re: 湖涂了,请高手解释一下我用的gluLookAt()与glOrtho()为什

Figure 3-13 : The Orthographic Viewing Volume



这是我在一本国外教材上看到的原文,没有要求都为正吧,它说的near and  far可以都为正或者都为负,一正一负当然可以啊,
The command glOrtho() creates an orthographic parallel viewing volume. As with glFrustum(), you specify the corners of the near clipping plane and the distance to the far clipping plane. void glOrtho(GLdouble left, GLdouble right, GLdouble bottom,
GLdouble top, GLdouble near, GLdouble far);

Creates a matrix for an orthographic parallel viewing volume and multiplies the current matrix by it. The near clipping plane is a rectangle with the lower left corner at (left, bottom, -near) and the upper right corner at (right, top, -near). The far clipping plane is a rectangle with corners at (left, bottom, -far) and (right, top, -far). Both near and far can be positive or negative.
还有,我定义的视景体,除了受cy/cx或者cx/cy影响外,原型应该是
X(-400,400),Y(-400,400).Z(-400,400),后面怎么会变成<1600,800>了呢?
glOrtho(-nRange,nRange,-nRange*cy/cx,nRange*cy/cx,-nRange,nRange);


sf_2005112492813.gif

6

主题

37

帖子

37

积分

注册会员

Rank: 2

积分
37
发表于 2005-11-24 12:04:00 | 显示全部楼层

Re:湖涂了,请高手解释一下我用的gluLookAt()与glOrtho()为什

呵呵,我不是说了嘛,我觉得啊glOrtho(left,right,bottom,top,zNear,zFar)的最后两项是指和你眼睛的距离,你现在既然眼睛在(0,0,1200)处,zNear = -nRange, zFar = nRange,你的nRange=400,那不是在(1600,800)吗?
要我说呀你还是把zNear,zFar改改试试。 即若你物体的z值在180<Z<370之间的话,那么先改成这样试试行不:
if (cx<=cy)
{
   glOrtho(-nRange,nRange,-nRange*cy/cx,nRange*cy/cx,1,2000);
}
else
{
   glOrtho(-nRange*cx/cy,nRange*cx/cy,-nRange,nRange,1,2000);
}

试试行不?

5

主题

9

帖子

9

积分

新手上路

Rank: 1

积分
9
 楼主| 发表于 2005-11-29 21:08:00 | 显示全部楼层

Re:湖涂了,请高手解释一下我用的gluLookAt()与glOrtho()为什

能看见了,终于搞明白了,谢谢你的耐心指点,我以前把gluLookAt()与glOrthO()分离开来理解,认为它们是各不相关的,认为这样定义的就是视景体,为X(-400,400),Y(-400,400),Z(-400,400),定义gluLookAt()的时候,把眼睛放在(0,0,1200),而这个函数中的near与far一直没有明白怎样与视景体联系起来。
现在最佳的near与far应该为
glOrtho(-nRange*cx/cy,nRange*cx/cy,-nRange,nRange,800,1300);
这样Z的范围就在(1200-1300)=-100<Z<(1200-800)=400。(我还画了三个长为100坐标轴,要多留一点旋转的空间)这样也相对的确定了视景体在Z方向的范围。你看我的理解还有没有不正确的地方?请指点,谢谢

6

主题

37

帖子

37

积分

注册会员

Rank: 2

积分
37
发表于 2005-11-30 15:22:00 | 显示全部楼层

Re:湖涂了,请高手解释一下我用的gluLookAt()与glOrtho()为什

呵呵,这里本来就是大家交流的地方,我也要谢谢你啊!你说得没有错,glOrtho(left,right,bottom,top,zNear,zFar)这里最后两项就是可是是负值,不过,现在我倒是有点小晕!呵呵,先这样理解吧!以后也请多多指教啊!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-7-8 12:05

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表