漫談Vega 與 OpenGL

從底層實現來看,Vega實際上是基於場景圖(Scene Graph)之上的,而場景圖管理系統本身又建立在OpenGL這樣的標準圖形庫之上。在SGI平臺上,Vega所依附的場景圖管理系統就是Performer,而在Windows平臺上,Vega所依附的是一套被稱爲“Jolt”的場景圖管理系統(Jolt實際上就是PC上的Performer實現)。
   
    用過Performer的朋友會發現Vega跟Performer是非常相似的,不同的是Vega提供了一個圖形界面的應用程序定義文件工具——LynX,有了它,呵呵,大大降低了視景仿真應用的門檻,用戶甚至可以不具備程序員背景就可以嘿嘿。說白了,是Vega幫你編好了一些簡單通用的應用程序,比如著名的bin目錄下的Vega.exe,很多時候,我們在Vega中預覽執行的就是這些應用程序。

    雖然操作簡單,但是要完成比較複雜的功能就必須自己通過API編程實現,更復雜的一點兒的或者特殊的操作就要使用更底層的OpenGL編程了,那麼怎麼在Vega中結合使用OpenGL命令來幫我們達到目的呢?

    CALLBACK回調函數,對,就是它了,而且只能在回調函數中調用,注意,並不是所有的回調函數都可以使用OpenGL命令,準確的說只有在屬於Draw繪製進程空間的回調中才可以調用OpenGL 命令。那麼什麼叫做回調函數屬於Draw進程空間呢?我們知道……(此處省去1000字)

    看一個回調函數屬於那個進程空間,看Vega的ProgrammerHlep.chm的第14章,Callback Functions那個表就一目聊然了,注意最後一欄Process Space,表明Draw的就是了:)
   
    實際上,最常用的就是VGCHAN_PREDRAW和VGCHAN_POSTDRAW弟兄兩個。具體怎麼註冊和使用Callback函數就不細說了,大家看Vege的幫助吧,說的太清楚了。在回調函中調用OpenGL命令,一般遵循如下原則:

Save states       //保存當前繪製狀態
Push pfstate      //使用新的繪製狀態
Push pfmatrix     // 使用新的矩陣狀態
modelview matrix
Load Identy matrix
draw your stuff    //用OpenGL繪製自己的東西
pop pfmatrix         // 恢復原始矩陣狀態
pop pfstate           // 恢復原始繪製狀態
restore other state

    就像下面這段回調程序,其效果是在某目標物體位置畫一個紅色三維十字架:

pfPushState();
pfPushMatrix();
pfBasicState();
vgGetPos(someplyer,pos);
vgGetPosVec(pos, &X, &Y, &Z, &H, &P, &R);
glPushMatrix();
glTranslatef(X, Y, Z);
glColor4f(1.0f,0.0f,0.0f,1.0f);
glBegin(GL_LINES);
glVertex3f(0.5,0.0f,0.0f);
glVertex3f(-0.5,0.0f,0.0f);
glVertex3f(0.0f,0.5,0.0f);
glVertex3f(0.0f,-0.5,0.0f);
glVertex3f(0.0f,0.0f,0.5);
glVertex3f(0.0f,0.0f,-0.5);
glEnd();glPopMatrix();
pfPopMatrix();
pfPopState();

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章