• OpenGL入门程序五:三维绘制


    1、现实世界观察一个物体的时候,可能涉及到的三维变化:

      1>视图变化------从不同的角度观察。

      2>模型变化------移动、旋转物体,计算机中当然还可以对物体进行缩放。

      3>投影变换------如果要画出观察的物体,是否需要近大远小的变化。

      4>剪裁------只希望看到物体的一部分,而不是全部。

      5>视口变换------画出整个物体,但是只占据纸张的某一部分而不是全部。

    2、OpenGl的变化(移动、旋转、缩放等)都是通过矩阵乘法实现的,均可在当前矩阵的基础上乘以一个新的矩阵得以实现。

    3、模型变化和视图变化的流程:

      1>设置当前操作的矩阵为“模型视图矩阵”。

      2>把当前矩阵设置为单位矩阵。

      3>相关变化。

    4、投影变化的流程:

      1>设置当前操作的矩阵为“投影矩阵”

      2>把当前矩阵设置为单位矩阵。

      3>相关投影。

    5、OpenGL把三维坐标中的物体绘制到二维屏幕,绘制的顺序是按照代码的顺序来进行的。因此后绘制的物体会遮住先绘制的物体,即使后绘制的物体在先绘制的物体的“后面”也是如此。使用深度测试可以解决这一问题。

    static int day = 200; // day的变化:从0到359
    void Test3DChange(void)
    {
        //启动深度测试 ,启动深度检测后,无法看到绘制的内容,暂时不知为啥? 
        //glEnable(GL_DEPTH_TEST);
    
        //清除颜色 与 深度缓冲
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    
        //操作投影矩阵
        glMatrixMode(GL_PROJECTION);
    
        //把当前矩阵设为单位矩阵
        glLoadIdentity();
    
        //将当前的可是空间设置为透视空间
        //各个参数的含义,暂且不做理解,待以后深入学习后再理解
        //角度,视景体的宽高比,沿z轴方向的两裁面之间的距离的近处,沿z轴方向的两裁面之间的距离的远处
        gluPerspective(75, 1, 1, 400000000);
    
        //在进行变换前,先设置当前操作的矩阵为“模型视图矩阵”
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        gluLookAt(0, -200000000, 200000000, 0, 0, 0, 0, 0, 1);
    
        // 绘制红色的“太阳”
        glColor3f(1.0f, 0.0f, 0.0f);
        glutSolidSphere(69600000, 20, 20);
        // 绘制蓝色的“地球”
        glColor3f(0.0f, 0.0f, 1.0f);
        glRotatef(day / 360.0*360.0, 0.0f, 0.0f, -1.0f);
        glTranslatef(150000000, 0.0f, 0.0f);
        glutSolidSphere(15945000, 20, 20);
        // 绘制黄色的“月亮”
        glColor3f(1.0f, 1.0f, 0.0f);
        glRotatef(day / 30.0*360.0 - day / 360.0*360.0, 0.0f, 0.0f, -1.0f);
        glTranslatef(38000000, 0.0f, 0.0f);
        glutSolidSphere(4345000, 20, 20);
    
        //表示让前面的OpenGL命令立即执行(而不是让它们在缓冲区等待),
        glFlush();
    }
    View Code

  • 相关阅读:
    LeetCode OJ-- 二战 Palindrome Number
    Cracking-- 17.13 将二叉树转换成双向链表
    Cracking-- 4.7 在一颗二叉树中找两个节点的第一个共同祖先
    priority_queue 示例
    heap c++ 操作 大顶堆、小顶堆
    【转】当你在浏览器地址栏输入一个URL后回车,将会发生的事情?
    Cracking-- 1.1 判断字符串中是否有重复字符
    如何取得SharePoint Timer Job的历史成功数和失败数,并按照日期计算排列
    SharePoint document 右键菜单和【...】菜单不一致的解决办法
    SharePoint Search 分词(WordBreaker)
  • 原文地址:https://www.cnblogs.com/luguoshuai/p/9011825.html
Copyright © 2020-2023  润新知