Creator中DOF节点的应用
类型:整理 | 来自:86CG | 时间:2007-11-29 |
点击:
DOF节点在Creator中可以方便的被创建,也可以使用Local-DOF菜单下的DOF Viewer命令进行交互式的查看,关于如何创建DOF并设置相应的约束条件就不详细讲了,可以参考相应的帮助文档,或者Creator的中文书,如果有的话。
考虑在虚拟场景中有个可以被打开和关闭的门,要在Vega中实现交互控制该门的闭合,怎么办?对了,很简单,DOF!
在Creator中创建一个名为“door”的DOF节点,将门部分的模型,通常是个体节点放置到该节点下,用Set Local命令将DOF原点放置到门轴上,设置其绕门轴的旋转约束,比如绕Z轴,从0到120度。
注意,虽然可以在Creator中使用DOF Viewer查看其运动状态,但是在Vega中它是不会自动开关的,必须通过相应的API函数来控制,下面是一个简单的开门程序,大家可以举一反三,实现开/关门:
考虑在虚拟场景中有个可以被打开和关闭的门,要在Vega中实现交互控制该门的闭合,怎么办?对了,很简单,DOF!
在Creator中创建一个名为“door”的DOF节点,将门部分的模型,通常是个体节点放置到该节点下,用Set Local命令将DOF原点放置到门轴上,设置其绕门轴的旋转约束,比如绕Z轴,从0到120度。
注意,虽然可以在Creator中使用DOF Viewer查看其运动状态,但是在Vega中它是不会自动开关的,必须通过相应的API函数来控制,下面是一个简单的开门程序,大家可以举一反三,实现开/关门:
#include
#include
static void opentheDoor(void);
main( int argc, char *argv[] )
{
vgWindow* win;
if ( argc != 2 )
{
printf( "Usage: %s ", argv[0] );
exit( -1 );
}
vgInitSys( );
vgDefineSys( argv[1] );
vgConfigSys( );
win = vgGetWin(0);
while ( 1 )
{
vgSyncFrame();
vgFrame();
switch ( vgGetWinKey(win) )
{
//按下空格键开门
case ' ':
opentheDoor();
break;
default:
break;
}
}
}
void opentheDoor()
{
vgObject* obj;
vgPart* door;
vgPosition* pos;
int i;
float x, y, z, h, p, r;
obj = vgGetObj(0);
door = vgFindPart(obj, "door", NULL); //获取DOF
pos = vgNewPos();
vgGetPos(door, pos);
vgGetPosVec(pos, &x, &y, &z, &h, &p, &r);
for (i=0; i<120; i++)
{
h+=1;
vgPosVec(pos, x, y, z, h, p, r);
vgPos(door, pos);
vgSyncFrame();
vgFrame();
}
vgDelete(pos);
}
#include
static void opentheDoor(void);
main( int argc, char *argv[] )
{
vgWindow* win;
if ( argc != 2 )
{
printf( "Usage: %s ", argv[0] );
exit( -1 );
}
vgInitSys( );
vgDefineSys( argv[1] );
vgConfigSys( );
win = vgGetWin(0);
while ( 1 )
{
vgSyncFrame();
vgFrame();
switch ( vgGetWinKey(win) )
{
//按下空格键开门
case ' ':
opentheDoor();
break;
default:
break;
}
}
}
void opentheDoor()
{
vgObject* obj;
vgPart* door;
vgPosition* pos;
int i;
float x, y, z, h, p, r;
obj = vgGetObj(0);
door = vgFindPart(obj, "door", NULL); //获取DOF
pos = vgNewPos();
vgGetPos(door, pos);
vgGetPosVec(pos, &x, &y, &z, &h, &p, &r);
for (i=0; i<120; i++)
{
h+=1;
vgPosVec(pos, x, y, z, h, p, r);
vgPos(door, pos);
vgSyncFrame();
vgFrame();
}
vgDelete(pos);
}
(完)
- 上篇文章: Vega Vs OpenGL
- 返回:Multigen
- 下篇文章:三维视景开发框架结构
CG橙子精彩导航: 










