tao.opengl+C#绘制三维模型
一、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 主要建模函数
tao.opengl+C#绘制三维模型的更多相关文章
- CSharpGL(6)在OpenGL中绘制UI元素
CSharpGL(6)在OpenGL中绘制UI元素 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码中包含10多个独立的Demo,更适合入 ...
- 【AR实验室】OpenGL ES绘制相机(OpenGL ES 1.0版本)
0x00 - 前言 之前做一些移动端的AR应用以及目前看到的一些AR应用,基本上都是这样一个套路:手机背景显示现实场景,然后在该背景上进行图形学绘制.至于图形学绘制时,相机外参的解算使用的是V-SLA ...
- 使用OpenGL ES绘制3D图形
如果应用定义的顶点不在同一个平面上,并且使用三角形把合适的顶点连接起来,就可以绘制出3D图形了. 使用OpenGL ES绘制3D图形的方法与绘制2D图形的步骤大致相同,只是绘制3D图形需要定义更多的 ...
- 【Qt for Android】OpenGL ES 绘制彩色立方体
Qt 内置对OpenGL ES的支持.选用Qt进行OpenGL ES的开发是很方便的,很多辅助类都已经具备.从Qt 5.0開始添加了一个QWindow类,该类既能够使用OpenGL绘制3D图形,也能够 ...
- OpenGL学习-------绘制简单的几何图形
本次课程所要讲的是绘制简单的几何图形,在实际绘制之前,让我们先熟悉一些概念. 一.点.直线和多边形我们知道数学(具体的说,是几何学)中有点.直线和多边形的概念,但这些概念在计算机中会有所不同.数学上的 ...
- [转]关于OpenGL的绘制上下文
[转]关于OpenGL的绘制上下文 本文转自(http://www.cnblogs.com/Liuwq/p/5444641.html) 什么是绘制上下文(Rendering Context) 初学Op ...
- 关于OpenGL的绘制上下文
什么是绘制上下文(Rendering Context) 初学OpenGL,打开红宝书,会告诉你OpenGL是个状态机,OpenGL采用了客户端-服务器模式,那时觉得好抽象,直到后来了解了绘制上下文才把 ...
- 2.x最终照着教程,成功使用OpenGL ES 绘制纹理贴图,添加了灰度图
在之前成功绘制变色的几何图形之后,今天利用Openg ES的可编程管线绘制出第一张纹理. 学校时候不知道OpenGL的重要性,怕晦涩的语法.没有跟老师学习OpenGL的环境配置,现在仅仅能利用coco ...
- Android OpenGL ES 开发(四): OpenGL ES 绘制形状
在上文中,我们使用OpenGL定义了能够被绘制出来的形状了,现在我们想绘制出来它们.使用OpenGLES 2.0来绘制形状会比你想象的需要更多的代码.因为OpenGL的API提供了大量的对渲染管线的控 ...
随机推荐
- linux下創建啓動圖標
Linux下如何为刚安装好的Eclipse在桌面建一个启动图标?(QtCreator 也可以类似去做). 首先:gedit /usr/share/applications/eclipse.des ...
- linux安全机制学习【转】
转自:http://blog.csdn.net/qq_20307987/article/details/51307820 曾经一度想学来着,今天看到一个链接,讲的很好,算是写一下加深印象吧 1 栈溢出 ...
- 修复无法启动的mariadb
一直在用的数据库,今天无论如何启动不了了,最后在archlinux wiki上查到了解决方法: mysql_install_db --user=mysql --basedir=/usr --datad ...
- HashMap和TreeMap的常用排序方法
一.简单描述 Map是键值对的集合接口,它的实现类主要包括:HashMap,TreeMap,HashTable以及LinkedHashMap等. TreeMap:能够把它保存的记录根据键(key)排序 ...
- 转:C#制作ORM映射学习笔记三 ORM映射实现
现在开始实现ORM的主体模块,首先需要在项目中新建一个类,命名为DbAccess,然后在项目的引用中添加两个dll,分别是MySql.Data.dll和System.Data.SQLite.dll,这 ...
- sublime text3 无法安装插件
下载 Package Control.sublime-package 点击这里下载: 打开sublime3 -> 首选项 -> 浏览插件 (程序自动打开插件目录) 删除 Package C ...
- CCCC L2-003. 月饼[贪心/类似hdu贪心老鼠]
L2-003. 月饼 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不 ...
- HDU 5997 rausen loves cakes(启发式合并 + 树状数组统计答案)
题目链接 rausen loves cakes 题意 给出一个序列和若干次修改和查询.修改为把序列中所有颜色为$x$的修改为$y$, 查询为询问当前$[x, y]$对应的区间中有多少连续颜色段. ...
- Tiny4412 支持 adb reboot-bootloader
硬件版本: Tiny4412ADK + S700 4GB u-boot 版本: u-boot-2010-12 linux版本: Linux-3.0.8 版本一 支持 adb re ...
- 线段树专题—ZOJ1610 Count the Colors
题意:给一个n,代表n次操作,接下来每次操作表示把[l.r]区间的线段涂成k的颜色当中,l,r,k的范围都是0到8000 分析:事实上就是拿线段树维护一段区间的颜色,整体用到的是线段树的区间更新把,可 ...