zoukankan      html  css  js  c++  java
  • OpenGLGLUT教程(三) GLUT窗口设置

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


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

     

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

     

    这个函数是glutReshapeFunc()

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

    参数:

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

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

    void main(int argc, char **argv) {

             glutInit(&argc, argv);

             glutInitDisplayMode(GLUT_DEPTH | GLUT_SINGLE | GLUT_RGBA);

             glutInitWindowPosition(100,100);

             glutInitWindowSize(320,320);

             glutCreateWindow("3D Tech- GLUT Tutorial");

             glutDisplayFunc(renderScene);

             

             // Here is our new entry in the main function 

             glutReshapeFunc(changeSize);

             

             glutMainLoop();

    }

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

    void changeSize(int w, int h) {

     

             // 防止除数即高度为0

             // (你可以设置窗口宽度为0).

             if(h == 0)

                     h = 1;

     

             float ratio = 1.0* w / h;

     

             // 单位化投影矩阵。

             glMatrixMode(GL_PROJECTION);

             glLoadIdentity();

             

             // 设置视口大小为增个窗口大小

             glViewport(0, 0, w, h);

     

             // 设置正确的投影矩阵

             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);

    }

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

    第一步是计算高宽比(wight/height)。注意为了计算正确,我们必须保证高度不为0

     

    接着,我们设置当前矩阵为投影矩阵,这个矩阵定义了一个可视空间(viewing volume)。

    我们调用一个单位矩阵来初始化投影矩阵。然后我们用函数glViewport把视口设置为整个窗口。你也可以设置不同的值。函数中(00)指定了视口的左下角,(w,h)指定了视口矩形的大小。注意这个坐标是和客户区域有关的,而不是屏幕坐标。。

     

    gluPerspective函数是其他OpenGL库(GLU库)里的一个函数。(gluPerspective函数的参数,设置请参见其他书籍。我并不想在GLUT讲解里再加入其他一些OpenGL内容的讲解。)

     

    最后就是设置模型观测矩阵。调用GL_MODELVIEW把当前矩阵设为模型观测矩阵。gluLookAt()也是GLU库里的一个函数,其参数详细设置参见其他书籍。

  • 相关阅读:
    MySql 用户 及权限操作
    MAC 重置MySQL root 密码
    在mac系统安装Apache Tomcat的详细步骤[转]
    Maven:mirror和repository 区别
    ES6 入门系列
    转场动画CALayer (Transition)
    OC 异常处理
    Foundation 框架
    Enum枚举
    Invalid App Store Icon. The App Store Icon in the asset catalog in 'xxx.app' can’t be transparent nor contain an alpha channel.
  • 原文地址:https://www.cnblogs.com/yangxi/p/2178479.html
Copyright © 2011-2022 走看看