®版權聲明:本文為博主原創文章,未經博主允許不得轉載。
一.ODE介紹與平台搭建.
接觸到動力學仿真引擎, 是因為筆者的一款PLC仿真軟件需要3D仿真.我需要達到的效果是,以3D方式構建出工控行業中常見的元件,比如感應器,氣缸,機械手,拉帶.這些元件在場景中通過用戶的組合擺放,設置好相關的屬性後,可以通過我的PLC仿真器程序的輸入輸出與其進行交互,產生機器動作的3D仿真效果.
比如這樣一個場景:
機械手把產品放置在拉帶上,PLC輸出信號讓拉帶正方向轉動,拉帶帶動產品移動,如果產品類型為NG,PLC在指定位置會輸出信號讓氣缸推出,把產品推到NG盒子裡.如果為OK品,產品走到拉帶尾部,自由落體到OK盒子裡.
筆者參考了一些3d仿真軟件,在處理上面場景的時候,是使用的固定算法處理產品和機器機構動作間的交互,也就是說,並非是基於真實物理上的模擬.這樣編程比較容易,缺點是,每一種場景都要編寫固定的交互代碼.如果需要增加新的場景,就必須編寫配套的場景交互代碼,通用性差.
我設想中的效果應該是像組態軟件一樣,每種元件,都可以設置自己的屬性和事件,甚至是腳本代碼.用戶只需要把這些元件組合起來,就能生成自己想要的場景,再用PLC的程序對這個場景加以控制.只是目前見過的組態軟件的元件都是2D的,不是我設想的3D效果.實際上我設想的效果其實是一種3D效果的組態軟件.
如果要讓這些3D元件任意組合後,也可以相互作用,就必須引入動力學仿真引擎.回到上面筆者設想的場景.機器手把產品放置到拉帶上,這是一種關節運動.產品跟隨著拉帶一起走,這個可以通過向產品施加固定的力來實現.產品在拉帶上不會因為引力穿透拉帶往下沉,是因為產品與拉帶都是剛體,它們之間有相互力的作用的原因.產品走到拉帶尾部,應該是以自由落體方式掉下去.當掉到OK產品盒子裡時,因為盒子是個凹體的剛性容器,兩者產生碰撞,產品不會穿透盒子沉下去.
動力學仿真引擎比較有名氣的是ODE(Open Dynamics Engine) ,貌似是款日本人的開源且免費的仿真引擎.聽說有幾款游戲也使用它做物理仿真.
當然這個不是筆者關注它的主要原因.由於筆者使用的開發語言是C#,而其名的C#的 OPENGL框架taoframework裡面是剛好有一個ODE的庫.因此才正中重筆者下懷,決定開始研究ODE,至於其它的動力學引擎,再優秀也不予考慮了.
OpenGL和動力學仿真方面的應用,果真不是C#善長的東西,百度一下這方面的資料,都是C++的天下,基本上沒太多C#相關的代碼供參考,你能做的,就是把C++的東西轉換過來,對於我來說,c++就是惡夢.筆者是從事工業控制行業的軟件工程師,前幾年,手裡有一款激光測厚儀的代碼,因為是前任工程師的產物,我維護了它幾年,毛病不斷.可憐啊,因為它往珠海那家工廠跑了無數次,做夢都詛咒那破代碼,說起來都是淚呀.
對於工控行業來說,對比諸多語言,c#開發效率算是不錯的,能讓你能愉快的玩耍,還有一點很重要,就是它能裝B,因為它是門語法優雅的語言.^_^
筆者計劃把ODE的研究結果,寫成一個系列的教程,心裡面感覺也算是給使用C#做同樣工作的朋友的做了點小小的貢獻吧.
接下來說下平台的搭建:
首先下載最新的ode,地址為 :http://ode.org/download.html
解壓,打開ode根目錄下的build文件夾,裡面有個premake4.exe.
打開命令行,在命令行中打開至build文件夾,輸入:premake4 --help,可以查看premake4的一些可選參數,
此處我只需要帶demo編譯,於是輸入 premake4 --with-demos vs2010
這樣,在build文件夾下面就生成了一個文件夾,vs2005,打開vs2010文件夾,裡面就生成了demo的項目文件和解決方案文件,打開ode.sln編譯就可以了。
生成的demo例程,共有40個,不過都是C++寫的,你得確保你的vs2010安裝有C++哦.
如果不想看c++代碼也沒關系,因為筆者主要的任務就是能讓這些代碼能在C#裡面跑起來.各位C#的同志可以很容易派生繼承.^_^
筆者跑幾個demo,截圖給大家欣賞一下,看到效果確實讓人有那麼一點小激動,讓我想起了3dsmax中的rector(反應堆動力學).
這是剛體碰撞,大大小小的球隨機落下來,因為質量不同,砸下來時,球與球之間的受到的力不同.地板上還有摩擦力,因此球最終會靜止.
三個輪子的小車,輪子還可以轉方向,還可以爬坡.這讓我想起了3dsmax中rector中的toyCar,兩者模擬的都是可以跑動的小車.我記得當時最喜歡做的事,就是讓小車爬坡和撞牆,或者尾巴上拉根線,綁定一個茶壺拖著跑,呵呵.
未完待續.....