zoukankan      html  css  js  c++  java
  • GLUT Tutorials 3: GLUT窗口设置

    博客转自:http://blog.csdn.net/xie_zi/article/details/1911777

    下载下面的VC工程并运行它(glut0.zip)(这个就是上一节的工程)。你将看到两个窗口:一个控制台窗口,一个OpenGL窗口。现在改变窗口大小使高度与宽度不再相等,这时三角形发生变形。这会发生是因为你没有正确设置投影矩阵。默认的是透视投影矩阵且高宽比为1.因此高宽比改变了,投影就会变形。因此只要高宽比改变了,投影就应该重新计算。

    GLUT定义了当窗口大小改变时哪一个函数应该被调用。此外,这个函数还会在窗口初次被创建时调用,保证初始化窗口不是正方形的时候渲染也不会变形出错。

    void glutReshapeFunc(void(*func)(int width,int height));

    参数:

    func: 指负责设置正确投影的函数的名称。

    因此我们必须做的第一件事是回到main()函数。在上一章的代码里加入对glutReshapeFunc()的调用,让我们把负责窗口尺寸的函数叫做changeSize。现在的代码如下。

    int main(int argc, char** argv)
    {
        glutInit(&argc, argv);
        
        glutInitDisplayMode(GLUT_DEPTH | GLUT_SINGLE | GLUT_RGBA);
        glutInitWindowPosition(200, 200);
        glutInitWindowSize(600,600);
        
        glutCreateWindow("GLUT Tutorials");
    
        glutDisplayFunc(renderSence);
        glutReshapeFunc(reShape);
    
    
        glutMainLoop();
    
        return 0;
    }

    下面我们需要做的就是定义函数reShape()。从glutReshapeFunc()函数的声明可以看到,reShape函数有两个形参.这两个参数代表新的窗口高度和宽度。

    void reShape(int width , int height)
    {
        //防止除数即高度为0
        //(你可以设置窗口宽度为0)
        if (height == 0)
            height = 1;
    
        float ratio = 1.0* width / height;
    
        // 单位化投影矩阵。
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
    
        //设置视口大小为增个窗口大小
        glViewport(0, 0, width, height);
    
        // 设置正确的投影矩阵
        gluPerspective(45, ratio, 1, 1000);
    
        //下面是设置模型视图矩阵
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, -1.0, 0.0f, 1.0f, 0.0f);
    }

    我们在上一小段代码里引进了一些函数。下面让我们详细讲解,以免让你感到很迷茫。

    1. 第一步是计算高宽比(wight/height)。注意为了计算正确,我们必须保证高度不为0。
    2. 接着,我们设置当前矩阵为投影矩阵,这个矩阵定义了一个可视空间(viewing volume)
    3. 我们调用一个单位矩阵来初始化投影矩阵。然后我们用函数glViewport把视口设置为整个窗口。你也可以设置不同的值。函数中(0,0)指定了视口的左下角,(w,h)指定了视口矩形的大小。注意这个坐标是和客户区域有关的,而不是屏幕坐标.
    4. gluPerspective函数是其他OpenGL库(GLU库)里的一个函数.(gluPerspective函数的参数,设置请参见其他书籍。我并不想在GLUT讲解里再加入其他一些OpenGL内容的讲解)
    5. 最后就是设置模型观测矩阵。调用GL_MODELVIEW把当前矩阵设为模型观测矩阵。gluLookAt()也是GLU库里的一个函数,其参数详细设置参见其他书籍。

    参考函数解析:glutPerspective 和 gluLookAt

  • 相关阅读:
    中国大学排名爬虫
    基于bs4库的HTML内容查找方法和HTML格式化和编码
    自动化提取51啦数据的信息
    简单目录扫描工具
    一个简单音乐播放器
    【原创】C++中对象的序列化
    [android]android开发中的运行错误之:adb.exe
    [转载]十大编程算法助程序员走上高手之路
    [原创]二叉树相关笔试题代码
    [原创]VS2010中创建动态链接库及其调用
  • 原文地址:https://www.cnblogs.com/flyinggod/p/12913473.html
Copyright © 2011-2022 走看看