C#中使用tao.opengl绘制三维模型
一、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庫[實用工具箱] 等等)
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.
本人常用的語言是C#和Python, 最后選了C#的tao作為編程環境。
1. 如何配置綁定:
首先下載tao庫:?http://www.taoframework.com
然后安裝到自己熟悉的目錄。
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 Program 10 { 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 下載地址:http://www.transmissionzero.co.uk/software/freeglut-devel/
下載:freeglut 2.8.0 MSVC Package, 可能要比這個新。
然后將壓縮包中 bin 下的 freeglut.dll 復制到 windows目錄下。
總結
以上是生活随笔為你收集整理的C#中使用tao.opengl绘制三维模型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 强制更新 maven 缓存
- 下一篇: 解决:java.lang.Arithme