本文共 4877 字,大约阅读时间需要 16 分钟。
一、tao.Opengl技术简介
Opengl是一种C风格的图形库,即opengl中没有类和对象,只有大量的函数。Opengl在内部就是一个状态机,利用不同的函数来修改opengl状态机的状态,以达到需要的效果。
Tao框架是C#使用Opengl的一种图形库,其他可供C#使用的图形库有诸如Sharpgl等。Tao框架包含了许多C库,如表1。Tao库结合了C#语言的特点,使得在使用Tao库时更加方便。
| 库 | 用途 |
1 | Tao.OpenAl | 丰富的音频库 |
2 | Tao.OpenGl | 即可使用的图形库 |
3 | Tao.Sdl | Simple DirectMedia Layer,2D库 |
4 | Tao.Platform.Windows | 支持通过Windows.Forms使用OpenGl |
5 | Tao.PhysFs | 一个I/o包装器,支持游戏资源存档等 |
6 | Tao.FreeGlut | Opengl实用程序工具包是一组包装器,用于设置Opengl程序和一些绘图例程 |
7 | Tao.Ode | 全称是Open Dynamics Engine是在游戏中使用的一个实时物理引擎 |
8 | Tao.Glfw | OpenGl Framework可在不同平台使用的轻量级包装类 |
9 | Tao.DevIL | 将各种不同格式的图片(bmp、tif等)加载到Opengl |
10 | Tao.Cg | 高级着色语言工具 |
11 | Tao.Lua | Lua是游戏界最常用的脚本语言 |
12 | Tao.FreeType | 字体包 |
13 | Tao.FFmpeg | 主要用于播放视频 |
表1 Tao库
二、C# Form类
窗体是程序与用户交互的可视界面,窗体也是一个对象,窗体类定义了生成窗体的模版,实例化一个窗体类就产生了一个窗体。.NET框架类库的System.Windows.Forms命名空间中定义的Form类是所有窗体类的基类。
2.1 其主要属性包括窗前名称、图标、其实位置、背景。
1. Name:用来获取或设置窗体的名称,在应用程序中可通过Name属性来引用窗体。 2. StartPosition:用来获取或设置运行时窗体的起始位置。 3. AutoScroll:用来获取或设置是否实现自动滚动。 4. Visible:用于获取或设置一个值,该值指示是否显示该窗体或控件。值为true时显示窗体或控件,为false时不显示。 2.2 窗体常用的方法包括: 1. Show(),该方法的作用是让窗体显示出来。 2. Refresh(),该方法的作用是刷新并重画窗体。 3. Close(),该方法的作用是关闭窗体。 2.3 窗体的主要事件包括: 1. Load事件:该事件在窗体加载到内存时发生,即在第一次显示窗体前发生。 2. Activated事件:该事件在窗体激活时发生。 3. Deactivate事件:该事件在窗体失去焦点成为不活动窗体时发生。 4. Resize事件:该事件在改变窗体大小时发生。 5. Paint事件:该事件在重绘窗体时发生。 6. Click事件:该事件在用户单击窗体时发生。 7. Closed事件:该事件在窗体关闭时发生。三、SimpleOpenglControl应用
在动态链接库Tao.Platform.Windows中定义的SimpleOpenglControl类,其定义了几乎所有的Opengl主要绘图函数,包括场景初始化函数、场景绘制渲染函数、双缓存交换函数、重绘函数、窗口大小改变等等。在Form的派生类中添加一个内部的simpleOpenglControl类,就能使用它的所有属性和方法。
从关系图中可以看出模型类可以分为两部分,模型绘制和模型展示。模型绘制需要调用Tao.Opengl库的函数,并且渲染模型;模型展示则需要利用Form类和simpleOpenglControl类来实现。具体过程如下:
1)首先simpleOpenglControl类对象加载Load事件和SizeChanged事件;
2)然后在初始化函数中加载FormLoad事件;
3)最后simpleOpenglControl类对象加载Paint事件,实现重绘;
4)利用设置的timer事件来实现定期更新重绘模型。
四、Opengl绘制函数
Opengl实际上是一个C库函数,即没有类或对象,Tao库实际上是将所有函数封装在了不同的类中,如OpenGl类,SimpleOpenglControl类等等。在建模过程中使用的主要的函数如表2所示。
函数名称 | 主要用途 |
glPushMatrix() | 将当前矩阵保存如栈顶,保证在其中运行的缩放、平移等变换不影响其他矩阵 |
glPopMatrix() | 与glPushMatrix相对应,将当前矩阵弹出栈顶,两者需一起出现 |
glRotated() | 将相乘旋转矩阵的当前的矩阵,参数包括旋转角度和旋转中心 |
glScaled() | 缩放函数,参数是xyz方向上的缩放比 |
glTranslated() | 平移函数,参数为xyz方向上的平移大小 |
glEnable() | 启用相关功能函数,功能由参数决定,如画虚线等 |
glDisable() | 关闭相关功能函数,一般与glEnable一起出现 |
glLineWidth() | 用于指定绘制线段的像素宽度,参数为像素大小 |
glColor3d() | 用于指定RGB颜色,参数为RGB值 |
glVertex3d() | 用于指定三维顶点,参数为三维顶点值 |
glBegin() | 绘图初始化函数,参数一般包括绘制顶点模式、线段模式等 |
glEnd() | 与glBegin一起使用,在两者之间绘制图形 |
glViewPort() | 用于确定打开窗口的坐标范围 |
glClearColor() | 清除窗口颜色 |
glLoadIndentity() | 重置当前指定的矩阵为单位矩阵 |
glMatrixMode() | 指定哪一个矩阵是当前矩阵 |
glOrtho() | glOrtho函数是将当前的可视空间设置为正投影空间 |
gluLookat() | 视点转换函数,参数包括视点位置,视点对准的物体在世界坐标的位置和视点向上的方向在世界坐标中的方向 |
表2 主要建模函数
实例
OpenGL作为一种图形学编程接口已经非常流行, 虽然在大型游戏方面DirectX有一定的市场占有率, 但由于OpenGL的开放性,可移植性等优点,OpenGL已经成了一种图形学方面的标准。
(1)Python的 pyOpenGL;
(2)C#的OpenTK(包括OpenAL, OpenGL, OpenCL); tao C#绑定;
(3)JavaScript:WebGL
等等。 这样我们就可以利用自己熟悉的语言来编写OpenGL的图形程序了。(值得注意的是:每个不同的绑定基本都包括了 gl 库[OpenGL的核心函数库], glu库[实用函数库], glut库[实用工具箱] 等等)
本人常用的语言是C#和Python, 最后选了C#的tao作为编程环境。
1. 如何配置绑定:
首先下载tao库:
然后安装到自己熟悉的目录。
2. 如何导入所需的库:
新建C#控制台项目,导入刚才安装的程序目录 bin下的: Tao.OpenGL.dll, Tao.FreeGlut.dll, Tao.Platform.Windows.dll.
然后在 .cs 文件开头加入:
using Tao.OpenGl;
using Tao.FreeGlut; using Tao.Platform.Windows;3. 编程示例:
写一个简单的程序:
1 using System.Collections.Generic; 2 using System.Linq; 3 using System.Text; 4 5 using Tao.OpenGl; 6 using Tao.FreeGlut; 7 using Tao.Platform.Windows; 8 9 class Program10 {11 static string title = "用 glRecti() 画矩形";12 static void myInit( )13 {14 // 设置属性15 Gl.glClearColor(1.0f, 1.0f, 1.0f, 1.0f); // 白色背景16 Gl.glColor3f(1.0f, 0.0f, 0.0f); // 用红色绘制图形17 18 // 建立视图19 Gl.glMatrixMode(Gl.GL_PROJECTION);20 Gl.glLoadIdentity();21 Glu.gluOrtho2D(0.0, 600.0, 0.0, 600.0);22 }23 static void display()24 {25 Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);26 Gl.glRecti(0, 0, 100, 120);27 Gl.glFlush();28 }29 static void Main(string[] args)30 {31 Glut.glutInit();32 Glut.glutInitDisplayMode(Glut.GLUT_RGBA | Glut.GLUT_SINGLE);33 Glut.glutInitWindowPosition(400, 100);34 Glut.glutInitWindowSize(600, 600);35 Glut.glutCreateWindow(title);36 37 myInit();38 Glut.glutDisplayFunc(display);39 Glut.glutMainLoop();40 41 Console.ReadKey();42 }43 }
运行后发现有问题, 缺少 FreeGlut.dll , 怎么回事?不是已经把库导入了吗? Goolge一下, 还需要FreeGlut.dll 文件。
FreeGlut.dll 下载地址:
下载:freeglut 2.8.0 MSVC Package, 可能要比这个新。
然后将压缩包中 bin 下的 freeglut.dll 复制到 windows目录下。
转载地址:http://fjlws.baihongyu.com/