zoukankan      html  css  js  c++  java
  • 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是在不改变取景的前提下,单纯缩放坐标的轴的比例来实现,这样的结果是景物有可能超出视口。
  • 相关阅读:
    owlCarousel 用法心得1 -20170405
    js数组去重的四种方法
    js获取url参数值
    jq index()
    jQuery(expression,[context])
    音乐播放器的实现+显示当前时间的歌词(只显示当前时间的文本)
    iOS自动布局框架-Masonry详解
    ios -完全实现代码设置 Could not find a storyboard named 'Main' in bundle NSBundle
    Python使用MySQL数据库的
    iOS 阿里百川SDK集成注意点
  • 原文地址:https://www.cnblogs.com/eyye/p/777845.html
Copyright © 2011-2022 走看看