opengl如何让纵横尺度相同

         在使用opengl写的程序会产生一个问题,那就是图像的纵横比例不一致,会使图形产生扭曲,特别是在改变窗口大小时。这有几种处理办法,我了解下来比较常见的办法是使用glOrtho函数。
         (1)关于glOrtho函数的用法:
void glOrtho(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top, GLdouble near,GLdouble far)

这个函数的作用就是取出适当的景物,简单的讲就是确定一个长方体,体内的表现出来,体外的裁减掉,长体的z轴方向的一个侧面对应于视口(视口可以不是窗口,比如客户区的一半),在视口改变时:

glViewport (00, (GLsizei) w, (GLsizei) h);

我们跟着改变相应的取景,以适应这个改变:

捕捉Size消息时

           RECT rt;
            GetClientRect(hWnd, 
&rt);
            

            
float w,h;            
            w
=fabs(rt.right-rt.left);
            h
=fabs(rt.bottom-rt.top) ;

            glViewport (
00, (GLsizei) w, (GLsizei) h);

            glMatrixMode (GL_PROJECTION);
            glLoadIdentity ();
            
if (w <= h) 
                glOrtho (
-2.52.5-2.5*(GLfloat)h/(GLfloat)w, 
                       
2.5*(GLfloat)h/(GLfloat)w, -10.010.0);
            
else 
               glOrtho (
-2.5*(GLfloat)w/(GLfloat)h, 
                       
2.5*(GLfloat)w/(GLfloat)h, -2.52.5-10.010.0);
            glMatrixMode (GL_MODELVIEW);
            glLoadIdentity ();
在计算纵向大小时,把纵横比例考虑进来(-2.5*(GLfloat)h/(GLfloat)w)就可以了。
这里的if语句并不重要,只是起着放大缩小按宽还是按高。
(2)还有一种办法就是用glScalef函数,在改变视口时,纵横方向作适当的缩放:
               glViewport (0, 0, (GLsizei) w, (GLsizei) h);            
               glLoadIdentity ();            
            
if (w <= h) 
                glScalef (
0.50.5*(GLfloat)w/(GLfloat)h, 1.0);
            
else 
               glScalef (
0.5*(GLfloat)h/(GLfloat)w, 0.51.0);

这里的两种办法得到的效果都能保证纵横尺度一致,但效果并不一样;在视口(glViewport)确定下来后glOrtho是通过改变取景,即取相应比例的景物来保证适应相应的视口;而glScalef是在不改变取景的前提下,单纯缩放坐标的轴的比例来实现,这样的结果是景物有可能超出视口。
posted @ 2007-06-10 11:57 eyye的眼睛 阅读(310) 评论(2)  编辑 收藏 网摘

  回复  引用    
#1楼 2007-07-22 08:00 | 风 [未注册用户]
谢谢!
十分感谢!
能加我QQ吗?
共同学习;
注明:opengl.
  回复  引用  查看    
#2楼 [楼主]2007-07-22 23:14 | eyye的眼睛      
不好意思,我没有QQ

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-06-16 15:39 编辑过
Google站内搜索

China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!
开发者征途系统新作:《设计模式——基于C#的工程化实现及扩展》



相关文章:

相关链接: