C#中使用tao.opengl绘制三维模型
一、tao.Opengl技術(shù)簡(jiǎn)介
Opengl是一種C風(fēng)格的圖形庫(kù),即opengl中沒有類和對(duì)象,只有大量的函數(shù)。Opengl在內(nèi)部就是一個(gè)狀態(tài)機(jī),利用不同的函數(shù)來修改opengl狀態(tài)機(jī)的狀態(tài),以達(dá)到需要的效果。
Tao框架是C#使用Opengl的一種圖形庫(kù),其他可供C#使用的圖形庫(kù)有諸如Sharpgl等。Tao框架包含了許多C庫(kù),如表1。Tao庫(kù)結(jié)合了C#語(yǔ)言的特點(diǎn),使得在使用Tao庫(kù)時(shí)更加方便。
| ? | 庫(kù) | 用途 |
| 1?????? ? | Tao.OpenAl | 豐富的音頻庫(kù) |
| 2?????? ? | Tao.OpenGl | 即可使用的圖形庫(kù) |
| 3?????? ? | Tao.Sdl | Simple DirectMedia Layer,2D庫(kù) |
| 4?????? ? | Tao.Platform.Windows | 支持通過Windows.Forms使用OpenGl |
| 5?????? ? | Tao.PhysFs | 一個(gè)I/o包裝器,支持游戲資源存檔等 |
| 6?????? ? | Tao.FreeGlut | Opengl實(shí)用程序工具包是一組包裝器,用于設(shè)置Opengl程序和一些繪圖例程 |
| 7?????? ? | Tao.Ode | 全稱是Open Dynamics Engine是在游戲中使用的一個(gè)實(shí)時(shí)物理引擎 |
| 8?????? ? | Tao.Glfw | OpenGl Framework可在不同平臺(tái)使用的輕量級(jí)包裝類 |
| 9?????? ? | Tao.DevIL | 將各種不同格式的圖片(bmp、tif等)加載到Opengl |
| 10??? ? | Tao.Cg | 高級(jí)著色語(yǔ)言工具 |
| 11??? ? | Tao.Lua | Lua是游戲界最常用的腳本語(yǔ)言 |
| 12??? ? | Tao.FreeType | 字體包 |
| 13??? ? | Tao.FFmpeg | 主要用于播放視頻 |
?表1 Tao庫(kù)
二、C# Form類
窗體是程序與用戶交互的可視界面,窗體也是一個(gè)對(duì)象,窗體類定義了生成窗體的模版,實(shí)例化一個(gè)窗體類就產(chǎn)生了一個(gè)窗體。.NET框架類庫(kù)的System.Windows.Forms命名空間中定義的Form類是所有窗體類的基類。
2.1 其主要屬性包括窗前名稱、圖標(biāo)、其實(shí)位置、背景。
1. Name:用來獲取或設(shè)置窗體的名稱,在應(yīng)用程序中可通過Name屬性來引用窗體。
2. StartPosition:用來獲取或設(shè)置運(yùn)行時(shí)窗體的起始位置。
3. AutoScroll:用來獲取或設(shè)置是否實(shí)現(xiàn)自動(dòng)滾動(dòng)。
4. Visible:用于獲取或設(shè)置一個(gè)值,該值指示是否顯示該窗體或控件。值為true時(shí)顯示窗體或控件,為false時(shí)不顯示。
2.2 窗體常用的方法包括:
1. Show(),該方法的作用是讓窗體顯示出來。
2. Refresh(),該方法的作用是刷新并重畫窗體。
3. Close(),該方法的作用是關(guān)閉窗體。
2.3 窗體的主要事件包括:
1. Load事件:該事件在窗體加載到內(nèi)存時(shí)發(fā)生,即在第一次顯示窗體前發(fā)生。
2. Activated事件:該事件在窗體激活時(shí)發(fā)生。
3. Deactivate事件:該事件在窗體失去焦點(diǎn)成為不活動(dòng)窗體時(shí)發(fā)生。
4. Resize事件:該事件在改變窗體大小時(shí)發(fā)生。
5. Paint事件:該事件在重繪窗體時(shí)發(fā)生。
6. Click事件:該事件在用戶單擊窗體時(shí)發(fā)生。
7. Closed事件:該事件在窗體關(guān)閉時(shí)發(fā)生。
三、SimpleOpenglControl應(yīng)用
在動(dòng)態(tài)鏈接庫(kù)Tao.Platform.Windows中定義的SimpleOpenglControl類,其定義了幾乎所有的Opengl主要繪圖函數(shù),包括場(chǎng)景初始化函數(shù)、場(chǎng)景繪制渲染函數(shù)、雙緩存交換函數(shù)、重繪函數(shù)、窗口大小改變等等。在Form的派生類中添加一個(gè)內(nèi)部的simpleOpenglControl類,就能使用它的所有屬性和方法。
?????? 從關(guān)系圖中可以看出模型類可以分為兩部分,模型繪制和模型展示。模型繪制需要調(diào)用Tao.Opengl庫(kù)的函數(shù),并且渲染模型;模型展示則需要利用Form類和simpleOpenglControl類來實(shí)現(xiàn)。具體過程如下:
1)首先simpleOpenglControl類對(duì)象加載Load事件和SizeChanged事件;
2)然后在初始化函數(shù)中加載FormLoad事件;
3)最后simpleOpenglControl類對(duì)象加載Paint事件,實(shí)現(xiàn)重繪;
4)利用設(shè)置的timer事件來實(shí)現(xiàn)定期更新重繪模型。
?四、Opengl繪制函數(shù)
Opengl實(shí)際上是一個(gè)C庫(kù)函數(shù),即沒有類或?qū)ο?#xff0c;Tao庫(kù)實(shí)際上是將所有函數(shù)封裝在了不同的類中,如OpenGl類,SimpleOpenglControl類等等。在建模過程中使用的主要的函數(shù)如表2所示。
| 函數(shù)名稱 | 主要用途 |
| glPushMatrix() | 將當(dāng)前矩陣保存如棧頂,保證在其中運(yùn)行的縮放、平移等變換不影響其他矩陣 |
| glPopMatrix() | 與glPushMatrix相對(duì)應(yīng),將當(dāng)前矩陣彈出棧頂,兩者需一起出現(xiàn) |
| glRotated() | 將相乘旋轉(zhuǎn)矩陣的當(dāng)前的矩陣,參數(shù)包括旋轉(zhuǎn)角度和旋轉(zhuǎn)中心 |
| glScaled() | 縮放函數(shù),參數(shù)是xyz方向上的縮放比 |
| glTranslated() | 平移函數(shù),參數(shù)為xyz方向上的平移大小 |
| glEnable() | 啟用相關(guān)功能函數(shù),功能由參數(shù)決定,如畫虛線等 |
| glDisable() | 關(guān)閉相關(guān)功能函數(shù),一般與glEnable一起出現(xiàn) |
| glLineWidth() | 用于指定繪制線段的像素寬度,參數(shù)為像素大小 |
| glColor3d() | 用于指定RGB顏色,參數(shù)為RGB值 |
| glVertex3d() | 用于指定三維頂點(diǎn),參數(shù)為三維頂點(diǎn)值 |
| glBegin() | 繪圖初始化函數(shù),參數(shù)一般包括繪制頂點(diǎn)模式、線段模式等 |
| glEnd() | 與glBegin一起使用,在兩者之間繪制圖形 |
| glViewPort() | 用于確定打開窗口的坐標(biāo)范圍 |
| glClearColor() | 清除窗口顏色 |
| glLoadIndentity() | 重置當(dāng)前指定的矩陣為單位矩陣 |
| glMatrixMode() | 指定哪一個(gè)矩陣是當(dāng)前矩陣 |
| glOrtho() | glOrtho函數(shù)是將當(dāng)前的可視空間設(shè)置為正投影空間 |
| gluLookat() | 視點(diǎn)轉(zhuǎn)換函數(shù),參數(shù)包括視點(diǎn)位置,視點(diǎn)對(duì)準(zhǔn)的物體在世界坐標(biāo)的位置和視點(diǎn)向上的方向在世界坐標(biāo)中的方向 |
表2 主要建模函數(shù)
實(shí)例
OpenGL作為一種圖形學(xué)編程接口已經(jīng)非常流行, 雖然在大型游戲方面DirectX有一定的市場(chǎng)占有率, 但由于OpenGL的開放性,可移植性等優(yōu)點(diǎn),OpenGL已經(jīng)成了一種圖形學(xué)方面的標(biāo)準(zhǔn)。
(1)Python的 pyOpenGL;
(2)C#的OpenTK(包括OpenAL, OpenGL, OpenCL); tao C#綁定;
(3)JavaScript:WebGL
等等。 這樣我們就可以利用自己熟悉的語(yǔ)言來編寫OpenGL的圖形程序了。
(值得注意的是:每個(gè)不同的綁定基本都包括了 gl 庫(kù)[OpenGL的核心函數(shù)庫(kù)], glu庫(kù)[實(shí)用函數(shù)庫(kù)], glut庫(kù)[實(shí)用工具箱] 等等)
OpenGL support libraries
- GLU?– Some additional functions for OpenGL programs.
- GLUT?– The OpenGL utility toolkit. Defunct.
- freeglut?–?Open source?alternative to GLUT
- GLUI?– a?GUI?toolkit made with GLUT
- GLFW - A modern alternative to GLUT and FreeGLUT.
- GLee?– The OpenGL Easy Extension library.
- GLEW?– The OpenGL Extension Wrangler Library.
- GLM?– C++ mathematics toolkit for OpenGL based on the GLSL specification.
- JOGL?– Java bindings for OpenGL API.
本人常用的語(yǔ)言是C#和Python, 最后選了C#的tao作為編程環(huán)境。
1. 如何配置綁定:
首先下載tao庫(kù):?http://www.taoframework.com
然后安裝到自己熟悉的目錄。
2. 如何導(dǎo)入所需的庫(kù):
新建C#控制臺(tái)項(xiàng)目,導(dǎo)入剛才安裝的程序目錄 bin下的: Tao.OpenGL.dll, Tao.FreeGlut.dll, Tao.Platform.Windows.dll.
然后在 .cs 文件開頭加入:
using Tao.OpenGl;
using Tao.FreeGlut;
using Tao.Platform.Windows;
3. 編程示例:
寫一個(gè)簡(jiǎn)單的程序:
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 Program 10 { 11 static string title = "用 glRecti() 畫矩形"; 12 static void myInit( ) 13 { 14 // 設(shè)置屬性 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 }運(yùn)行后發(fā)現(xiàn)有問題, 缺少 FreeGlut.dll , 怎么回事?不是已經(jīng)把庫(kù)導(dǎo)入了嗎? Goolge一下, 還需要FreeGlut.dll 文件。
FreeGlut.dll 下載地址:http://www.transmissionzero.co.uk/software/freeglut-devel/
下載:freeglut 2.8.0 MSVC Package, 可能要比這個(gè)新。
然后將壓縮包中 bin 下的 freeglut.dll 復(fù)制到 windows目錄下。
總結(jié)
以上是生活随笔為你收集整理的C#中使用tao.opengl绘制三维模型的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 强制更新 maven 缓存
- 下一篇: c# char unsigned_dll