织梦CMS - 轻松建站从此开始!

罗索

3D编程基础知识(OpenGL)

jackyhwei 发布于 2011-07-28 17:43 点击:次 
科学计算可视化、计算机动画、虚拟现实是计算机图形学领域内三大活跃的发展方向,它们的技术核心都是三维真实感图形。而OpenGL就是这三维真实感图形的构造之一。
TAG:

一、前言
科学计算可视化、计算机动画、虚拟现实是计算机图形学领域内三大活跃的发展方向,它们的技术核心都是三维真实感图形。而OpenGL就是这三维真实感图形的构造之一。
 
二、概述
    1、Direct3D & OpenGL
        Direct3D是Microsoft的DirectX其中的一个COM组件,目前最新版本是Direct9.0c;OpenGL最初由SGI 开发,目前由OpenGL体系结构审核委员会(ARB)所维护。OpenGL ARB是个行业协会,负责OpenGL以及相关技术的发展和演变。OpenGL ARB由下面这些计算机图形行业的领先企业所组成:3Dlabs、Apple、ATI、Dell、IBM、Intel、NVIDIA、SGI和Sun Microsystems。最新的规范是2.0。有两套实现,一套是SGI的OpenGL实现,一套是Microsoft的OpenGL实现。目前Microsoft的OpenGL只支持1.1规范。 
        Direct3D: 1、适合做游戏开发。DirectX是非常成熟的游戏开发的组件,辅助的功能库、数学库都很强大和成熟,如D3DX.lib中包含的大量辅助函数,而OpenGL没有这些相关的东西,它只专注于3d的渲染,辅助的东西不得不由第三方提供,或者自己开发...而且DirectX更新比较快。2、Direct3D是面向对象的COM实现。OpenGL只是一套面向结构的图形API。3、OpenGL不支持一些低端显卡。 
        OpenGL:1、跨平台性。可应用在Windows、OS/2、Unix、Max等系统上。2、在光源和纹理的处理上性能比较优秀。
 
    2、OpenGL的发展
        OpenGL(Open Graphics Library),开放图形程序接口。
        1、1992年7月,SGI公司发布OpenGL1.0。
        2、1995年,SGI发布OpenGL1.1 。
        3、2001年8月,ARB发布OpenGL1.3规范。
        4、2003年7月,ARB公布OpenGL1.5规范。
        5、2004年8月,ARB发布OpenGL2.0规范。
 
    3、OpenGL的工作结构      
Application
OpenGL Command

OpenGL DLL

Server DLL

Win32 DDI

Video Driver

     OpenGL DLL:opengl32.dll,glu.dll
     Server DLL:Winsrv.dll
    Win32 DDI:Win32设备驱动接口
 
三、OpenGL基本功能
    (1) 建模功能(点、线、复杂曲线、曲面)
    (2) 变换功能(模型变换:平移、旋转、缩放等;投影变换:透视投影、正射投影)
    (3) 颜色模式(RGBA颜色模式、索引颜色模式)
    (4) 光照材质(光照模型:辐射光、环境光、漫反射光、镜面光。材质:光的反射率)
    (5) 图像处理(图象显示、增加)
    (6) 纹理映射(包含颜色、alpha值、亮度等数据的矩形数据)
    (7) 动画制作(双缓存动画:后台缓存计算场景、生成动画,前台缓存显示后台缓存已画好的画面)
    (8) 交互技术(选择、拾取、反馈三种机制)
 
四、OpenGL的组成
    1、(1)OpenGL核心函数(115个函数,函数名前缀为gl)   opengl32.dll
     (2)OpenGL实用库函数(43个函数,函数名前缀为 glu)   glu.dll
     (3)OpenGL辅助库函数(31个函数,函数名前缀为 aux) glaux.dll
     (4)Windows专用函数
     (5)Win32 API函数
     (6)OpenGL状态变量  
     2、学习界面库:Glut32.dll
 
五、OpenGL变换
1、三维图形的输出过程
计算机屏幕上只能表现二维图象,在三维图形到二维平面之间,需要什么样的变换,才能真实反映 
世界。我们用照相机来模拟这一个过程。首先,在相机的前面是真实的三维世界,而在相机的取景器上出现的是二维平面。
投影变换---使用变焦镜头,可以在不改变相机与被摄物体之间的空间距离的情况下,改变被摄物体在取景器中投影的大小。
模型变换---改变被摄物体在取景器中的位置。
视点变换---人通过改变相机的方向和位置,可以改变出现在取景器中的景物;改变相机与被摄物体之间的空间距离,使被摄物体在取景器中的大小变化。
视口变换---冲洗相片底片时,还可以调整成像的位置,仅仅使照片中的影像的一部分显现出来。
 
    2、坐标系和坐标变换
    三维世界使用世界坐标系,屏幕使用屏幕坐标系。
几何变换矩阵
投影变换矩阵
视图处理矩阵
视口处理矩阵

    3、投影变换
       (1)   平行投影
        Void glOrtho(Left, Right, Bottom, Top, Near, Far);
 
       (2)   透视投影
        Void glFrustum(Left, Right, Bottom, Top, Near, Far); 
   
    4、模型变换
       (1)平移

        //将原点向Z负方向移动4.5,所有的Z坐标被加了4.5 
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        glTranslatef(0.0f,0.0f, -4.5f);
            //  绘制图形;
        glFinish(); 
 
       (2)旋转
        glRotatef(60.0f,0.0f, 1.0f,0.0f);
 
       (3)缩放
        glScalef(1.5f,1.0f,1.0f)
 
    5、视口变换
        glViewPoint(x, y, width, height)
 
六、绘制图形
    1、绘制
        (1)、画点
         glBegin( GL_POINTS);
         glVertex2f( 0.0f, 0.0f);
         glEnd();
         glFinish();
 
        (2)、画线
            glBegin( GL_LINES);
            glVertex2f( 0.5f, 0.0f);
            glVertex2f( -0.5f, 0.0f);
            glEnd();
            glFinish();
 
    2、消隐:清除一个物体被其他物体挡住的部分的操作称做消隐。
    3、显示列表
  显示列表由一组预先定义并储存起来可以在以后执行的OpenGL函数组成。
        3.1   为什么要有显示列表
    提高应用程序的运行性能。
        3.2  如何使用显示列表
     glNewList(1, GL_COMPILE)
         glBegin();
      …
     glEnd();
     glEndList();
      …
     glCallList(1);
 
七、真实感世界生成
    1、光源材质
    光从物体表面反射形成反射光;光穿透物体,形成透射光;光被物体吸收,转换称为物体的内能。OPENGL的光照模型分为4个独立组成部分:辐射光、环境光、漫反射光、镜面反射光。材质是物体对光的反射率。
 
    示例代码:
        GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0};
        GLfloat light_postion[] = {1.0, 1.0, 1.0, 1.0};
        glMaterialfv( GL_FRONT, GL_SPECULAR, mat_specular);
        glLightfv( GL_LIGHT0, GL_POSITION, light_postion);
        glEnable(GL_LIGHT0);
 
   
    2、纹理映射
    纹理是包含颜色、alpha值、亮度等数据的矩形数据。将纹理数据贴在多边形上,多边型在变换时,仍保证纹理的图案与多边形保持一致性。例如:采用透视投影观察墙面的时候,远端的砖会变小,而近处的砖会变大。
    glTextImage2D(GL_TEXTURE_2D, level, components, width, height, border, format, type, pixels);
 
......
 
十、OpenGL动画
    应用程序绘制动画时,可以先将图象绘制到后台缓冲区中,绘制结束后可以通过交换缓冲区,将后台缓冲区已经绘制好的图象直接送到前台缓冲区中,由系统显示功能完成屏幕的显示,此时应用程序已经开始在后台缓冲区中绘制下一幅图象了。
    auxSwapBuffers();
(still05017)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201107/14765.html]
本文出处:blog.csdn.net/still05017 作者:still05017
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容