漫谈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();

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