我要发帖 回复

新手上路

1

主题

18

积分

0

专家分

:

私信
发表时间 : 2009-4-20 21:02:22 | 浏览 : 2150    评论 : 16
vega编程里需要用OpenGL画线,不是很清楚怎么调用。直接把OpenGL的语句写在程序里检测没有错误,不过看不到效果,而且有的机子上还会出现不可运行的效果。是不是要调用一下?具体要怎么调用呢。。。。

最近VR访客

zlily 评论于2009-4-20 21:12:38
关注中 我也证gl vega 期待。。。
zhuinbuaa0420 评论于2009-4-20 21:48:16
我知道的是用回调函数,这个在例子里面有一个利用OpenGL在vega里面写字的,可是画线的时候好像就不太对,应该是缺少了一些语句。希望看到一个例子,只要简单画一条线就可以。具体的其他我可以单独学习OpenGL
mqiezi 评论于2009-4-21 14:37:22
从底层实现来看,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();


在vega程序中加入opengl物体:

node = (pfNode*)vgGetObjPfNode( Obj ); // 是动态新建的object实例
    pfNodeTravMask( node, PFTRAV_DRAW, 0xFFFFFFFF, PFTRAV_SELF, PF_SET);
    pfNodeTravMask( node, PFTRAV_CULL, 0x00000000, PFTRAV_SELF, PF_SET);
    pfNodeTravFuncs( node, PFTRAV_DRAW, Draw_Cb, NULL);
    pfNodeTravData ( node, PFTRAV_DRAW, NULL );


// Callback Functions

int Draw_Cb(pfTraverser *trav, void *data )
{
Push pfstate     
Push pfmatrix     
modelview matrix

Load Identy matrix
draw your stuff   
pop pfmatrix         
pop pfstate         
}
淡泊以明志 宁静而致远
zhuinbuaa0420 评论于2009-4-21 21:51:39

回复 4楼 的帖子

谢谢你啊,这个类似的我看到过,不过没有理解这个意思啊。。。今天试了一下用了回调函数,可是不知道通道的回调是怎么触发的哪。。。最后还是没有现象。。。
zhangdianrui 评论于2009-4-22 01:20:27

请教一下

大哥您好。我想请教一个问题。
就是我下载的vega prime软件只有197m。 书上说有一个叫opengl performer的开发包,这个软件里会包括那个开发包吗?或者需要另外下载之类的?
而且我想知道这两个软件是怎么合用的?
谢谢
mqiezi 评论于2009-4-22 10:36:51
原帖由 zhangdianrui 于 2009-4-22 01:20 AM 发表
大哥您好。我想请教一个问题。
就是我下载的vega prime软件只有197m。 书上说有一个叫opengl performer的开发包,这个软件里会包括那个开发包吗?或者需要另外下载之类的?
而且我想知道这两个软件是怎么合用的?
...


好像没有jlut
淡泊以明志 宁静而致远
mqiezi 评论于2009-4-22 12:31:04
vega 没有 要自己装  vega是基于opengl performer 显示的 在windows下好像叫jult
淡泊以明志 宁静而致远
zhuinbuaa0420 评论于2009-4-28 19:44:29

回复 4楼 的帖子

没错,就是这个帖子里的程序,把自己的player放进去就可以了。之前是弄错了才没调出来。通道触发是按帧进行的么,反正我加了个if的条件,就可以达到我的目的了。到一个时间或者到某个位置然后触发。谢谢啦
zhuinbuaa0420 评论于2009-4-28 19:45:40

回复 4楼 的帖子

没错,就是这个帖子里的程序,把自己的player放进去就可以了。之前是弄错了才没调出来。通道触发是按帧进行的么,反正我加了个if的条件,就可以达到我的目的了。到一个时间或者到某个位置然后触发。谢谢啦
mqiezi 评论于2009-4-29 08:39:18
淡泊以明志 宁静而致远
woshipeijinhua 评论于2009-4-30 08:01:31
学习  关注中···
chaolunwu 评论于2009-10-22 21:30:56
4# mqiezi


你的表达风格和写明朝那些事的人十分的相近啊
tails136 评论于2009-10-24 11:35:37
添加回调 给channel 的VGVHAN_PREDRAW还是VGVHAN_POSTDRAW事件添加回调函数来着 忘了
好像事第一个
ggw0122 评论于2011-4-7 22:36:20
学习了,谢谢
begin 评论于2011-10-13 10:29:49
谢谢,回去好好看看
liuludjmm 评论于2011-12-4 14:52:27
zhuinbuaa0420 发表于 2009-4-28 07:44 PM
没错,就是这个帖子里的程序,把自己的player放进去就可以了。之前是弄错了才没调出来。通道触发是按帧进行 ...

如果我就是在显示画面画线,没有可绑定的player,怎么办?

手机版|VR开发网 ( 津ICP备18009691号 ) 统计 网安备12019202000257

GMT+8, 2020-10-25 01:46 PM

返回顶部