基于C shape 的opengl编程.doc_第1页
基于C shape 的opengl编程.doc_第2页
基于C shape 的opengl编程.doc_第3页
基于C shape 的opengl编程.doc_第4页
基于C shape 的opengl编程.doc_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于C shape的Tao. OpenGl模型框架(段琪辉整理)由前面所提的C#和opengl的概述。我们可以知道把C # OpenGL 结合起来开发3D 应用程序和软件, 将显著提高开发效率。在C、C + + 、Fo rt ran、J ava 等环境中实现OpenGL 的技术已经非常成熟, 但是目前并没有在C# 中开发OpenGL 的标准和规范的方法, 而且, 在. N ET f ram ewo rk 中也没有提供OpenGLA P I 的接口。因此, 目前在C# 中实现OpenGL 的发展比较落后。而且在C#中开发OpenGl,微软提供较少的标准支持,主要是因为对于和他们竞争的东西比如CORBA(COM的竞争对手)和OpenGL(DirectX的竞争对手)的消息隐蔽。不过在C中实现Opengl也并非没有可能,有很多很好的第3方库可以使用,这里给大家列举几个。然后跟大家一起分享一个基于C#中的Tao.OpenGl模型框架。(1)CsGl(2)CSopenGl(3)C# wrapper forOpenGL(4) C# OpenGL Framework for.NET2.0 下面我们介绍opengl技术在C#中的实现以及TaoFramework(Tao是由美国华盛顿大学分布虐对象计算组织开发的开放源码的CORBA(通用对象请求代理体系结构)产品,它实现了CORBA2.6规范中的说明)提出的许多基于NET和Mono的库而创建的基于C#的OpenGl模型框架。opengl技术在C#中的实现步骤前期准备工作: 在C# 中, 程序间的依赖项通过符号而不是文本来控制, 因而不使用头文件, 而且opengl32.dll 及opengl32. lib 等文件也不能像在C+ + 中那样进行部署和引用, 所以, 无法直接使OpenGL 所提供的图形库。以下介绍2 个新的OpenGL 动态链接库文件: csgl. dll 和csgl.nat ive. dll, 在C# 中通过调用这2 个文件, 就可以实现OpenGL 所提供的强大的图形功能。这2 个文件大家可以网页上获取。因为csgl. dll 中定义了4 个名称空间, 为CsGL ,CsGL. OpenGL , CsGL. Po in ters, CsGL. U t il, 其中, CsGL. OpenGL 定义的4 个类OpenGL、GL、GLU、GLU T 中封装了几乎所有的OpenGL 函数、用户库函数、辅助库函数和实用库函数及常量; 类OpenGLCon t ro l 中定义了OpenGL 场景绘制函数, 如场景的初始化、场景的绘制函数等; 类OpenGLCon tex t 中定义了OpenGL 环境控制命令, 如像素格式、调色板的创建等命令。CsGL.U t il 定义了键盘、鼠标事件及异常处理等。关于每个名称空间中具体函数的定义, 可在V isual Stu2dio. NET 中使用对象浏览器查阅这个动态链接库。值得注意的是文件csgl. nat ive. dll 在设计时用不到, 但是在运行时是必需的。 另外,为了能够使用这2 个文件, 先将这2 个文件拷贝到系统文件夹% system roo t% system 32 中,然后在项目的属性页对话框中将“引用路径”设置为系统文件夹% system roo t% system 32, 这样C# 就可以找到运行调试应用程序所需要的库文件。创建OpenGl建模环境1 添加对OpenGL 的引用在V S. N ET 2003 中生成C# 应用程序的过程很简单。在IDE 环境中选择创建C# 项目的W indow s 应用程序, 输入项目的名称及项目保存的位置, 单击确定, 几秒钟后项目创建完成。此时项目创建向导为我们准备好了一个名称空间、一个窗体类(Fo rm 1) 以及应用程序的主入口函数M ain。至此, 只是创建了应用程序的框架, 要使用OpenGL , 必须添加对OpenGL 的引用, 在C# 中是通过u sing 关键字实现的, 在程序开始部分加入下列语句:u sing CsGL. OpenGL;这样就可以使用OpenGL 命令实现OpenGL 的绘图功能。2 创建OpenGL 设备环境 要使用OpenGL 进行绘制, 必须首先建立用于绘制的设备环境, 即绘制表面。为此, 先建立一个视(V iew ) 类用于创建绘制表面。在所创建的名称空间中添加一个视类, 设其类名为OpenGLV iew , 然后创建这个类的一个实例, 设其名称为Simp leV iew。现在要将这个实例停靠到窗体上, 才能使绘制的OpenGL 场景可视化。将Simp leV iew 停靠到窗体上的方法是:this.SimpleView.Dock = System.Windows.Forms.DockStyle.Fill;th is.SimpleView.Location = new System.Drawing. Point (0, 0) ; 为了能在OpenGL 绘制面上进行绘制, 必须先对其进行初始化, 在C+ + 中是通过描述、选择与设置绘图表面的像素格式来规定绘图表面的一些属性的。C# 中, 在csgl.dll 的支持下, 一般不需要专门为OpenGL 绘制环境设置像素格式。3 建立OpenGL 绘制环境上面已经建立了用于OpenGL 绘制的设备环境。由于OpenGL直接使用绘制环境而不是设备环境, 因而, 还必须建立一个绘制环境, 否则OpenGL 命令不能被执行。在CsGL.openGL.OpenGLCon trol 类中定义了创建绘制环境的函数, 一般无需重写这个函数就能够完成OpenGL绘制环境的创建任务, 而仅需要考虑如何初始化绘制环境。由于OpenGLControl 类派生自System.W indow s.Forms. Control 类, 因而它继承了Contro l 类的基本属性和功能, 比如控件的边界(其位置和大小),处理用户通过键盘和指针设备所进行的输入等。同时, 类OpenGLControl中还定义了设备初始化函数In itGLContext、场景绘制函数glDraw,双缓存交换函数SwapBuffers以及窗口大小改变时的重绘函数OnSizeChanged等。这样, 可以通过声明一个派生自OpenGLControl的类来建立OpenGL 绘制环境。具体声明方法如下:pub lic class OpenGLView: CsGL.Ope2nGL. OpenGLControlOpenGLView 类的构造函数public OpenGLView ():base()添加类的构造代码添加类的实现代码OpenGL 绘制环境创建完成后, 就可以在这个环境中进行建模了。基于Tao.framework的opengl模型框架1.Tao. OpenGl所用到的动态链接库在C#中,程序间的依赖项通过符号而不是文本来控制,因而不使用头文件, 在C #中我们使用Tao FrameWork 中OpenGl的动态链接库,包括Tao. OpenGl. dll、Tao. OpenGlEx2tensionLoader. dll、Tao. OpenGl. Glu. dll (OpenGl实用库) 、Tao.FreeGlut. dll (OpenGl应用工具包) 、Tao.Platform. Windows.dll。Tao FrameWork可以从网上获得。2.添加对OpenGl的引用下面我们通过在C#中使用Tao. OpenGl创建一个颜色渐变的三棱柱来介绍如何使用Tao. OpenGl建模。在Tao. Platform. Wind2wos. dll中定义了类GlControl, 在其中定义了几乎所有的OpenGl场景绘制函数,如场景的初始化、场景的绘制函数等。在Tao. OpenGl. dll中的类ContextGl定义了OpenGl的环境控制命令,如象素格式、调色板的创建命令。首先,通过MicroSoftVisual C#2005建立一个Windows应用程序项目。要使用OpenGl,必须添加对OpenGl的引用。为此,在C #的解决方案资源管理器中添加Tao. OpenGl. dll(OpenGl基本库) , Tao.Platform.Windows. dll (使用Windows窗体的类库) 两个动态链接库引用,如果要使用到OpenGl的实用库及应用工具包还必须引用Tao. OpenGl. Glu. dll、Tao.FreeGlut. dllOpenGl这两个动态链接库。3. 创建OpenGl设备环境在Tao FrameWork 中, 类Tao. Platform. Windows. Sim2p leOpenGlControl类定义了建立用于OpenGl绘制的设备环境各种函数。为此, 先在Form1. cs中为类From1 添加Sim2p leOpenGlControl类型字段GlControl 。然后在窗体的初始化函数中对Glontrol进行初始化。主要的初始化有:this. GlControl. Dock = System. Windows. Forms. Dock2Style. Fill; / /设置将这个实例靠到窗体上this. GlControl. Location = new System. Drawing. Point ( 0,0) ;this. GlControl. AutoSwapBuffers = true; / /设置自动交换缓冲区this. GlControl. ColorBits = ( ( byte) (32) ) ; / /设置颜色为32位真彩色this. GlControl. AccumBits = ( ( byte) (0) ) ; / /设置累计缓冲区深度.可以在此添加其它的建模过程中需要的GlControl设置。4.OpenGl绘制环境的创建及初始化由于OpenGl使用的是绘制环境,所以,还必须建立一个绘制环境。在Tao. OpenGl中建立绘制环境非常简单。调用GlControl. InitializeContexts ( )就可以创建一个OpenGl绘制环境。在OpenGl的绘制环境的初始化过程中,我们要完成的操作主要有:如设置各种缓存(颜色、深度等) ,设置阴影模式、光照、纹理等。示例初始化如下:GlControl. glShadeModel ( Gl. GL _ SMOOTH) ; / /设置阴影模式为光滑GlControl. glClearColor ( 0. 0f, 0. 0f, 0. 0f, 0. gf) ; / /设置背景色为黑色GlControl. glClearDep th (1. 0f) ; / /Dep th Buffer SetupGlControl. glDep thFunc (Gl. GL_DEPTH_TEST) ;/ /在此可以添加其他需要的初始化设置(如设置纹理等) 。另外必须注意的是,当窗体大小更改时要对form的On2Resize ( )函数进行重载,实现窗口变化时绘制环境的变化。下面给出示例代码:p rotected override void OnResize (EventArgs e) base. OnResize ( e) ; / /调用OpenGl类的Resize函数Size s = Size; / /窗体的大小Gl. glViewport (0, 0, s. Width, s. Height) ; / /视口设置Gl. glMatrixMode ( Gl. GLPROJECTION) ; / /以投影变换模式设置取景区Gl. glLoad Identity ( ) ; Glu. glu2Perspective (45. 0f, ( double) s. Width / ( double) s. Height, 0. 1f,100. 0f) ; Gl. glMatrixMode ( Gl. GLMODELV IEW ) ; / /恢复到模型视图变换模式Gl. glLoad Identity( ) ;在OpenGl中有投影变换模式及模型视图模式两种变换矩阵模式,投影变换是将建立的3D场景投影到2D的屏幕的映射,而模型视图变换用于创建中问题的变换。在程序中必须先设置为投影模式更改窗口设置然后再切换的模型视图变换。程序中函数glMatrixMode ( )是设置变换矩阵模式。需要注意的一点:因为在OpenGl中所有的视图变换都是在前一个变换矩阵的基础上进行的变换,所以在两种变换模式间切换后都要调用glLoad Identity ( )函数将变换矩阵设置为单位矩阵。OpenGL绘制环境创建完成后,就可以在这个绘制环境中建模了。5.建模过程public void DrawGL ( ) Gl.glClear ( Gl.GL_COLOR_BUFFER _BIT|Gl.GL _DEPTH_BUFFER_BIT) ;Gl.glLoad Identity( ) ;Gl.glTranslatef (0, 0,-6) ;Gl.glBegin (Gl.GL_TRIANGLES) ;Gl. glEnd ( ) ; 6.模型的显示建立好Ope

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论