用過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();