虽然操作简单,但是要完成比较复杂的功能就必须自己通过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();