考虑在虚拟场景中有个可以被打开和关闭的门,要在Vega中实现交互控制该门的闭合,怎么办?对了,很简单,DOF!
在Creator中创建一个名为“door”的DOF节点,将门部分的模型,通常是个体节点放置到该节点下,用Set Local命令将DOF原点放置到门轴上,设置其绕门轴的旋转约束,比如绕Z轴,从0到120度。
注意,虽然可以在Creator中使用DOF Viewer查看其运动状态,但是在Vega中它是不会自动开关的,必须通过相应的API函数来控制,下面是一个简单的开门程序,大家可以举一反三,实现开/关门:
1
#include
2
#include
3
static void opentheDoor(void);
4![](/Images/OutliningIndicators/None.gif)
5
main( int argc, char *argv[] )
6
{
7![](/Images/OutliningIndicators/InBlock.gif)
8
vgWindow* win;
9
if ( argc != 2 )
10
{
11
printf( "Usage: %s ", argv[0] );
12
exit( -1 );
13
}
14
15
vgInitSys( );
16
17
vgDefineSys( argv[1] );
18![](/Images/OutliningIndicators/InBlock.gif)
19
vgConfigSys( );
20![](/Images/OutliningIndicators/InBlock.gif)
21
win = vgGetWin(0);
22
while ( 1 )
23
{
24
vgSyncFrame();
25
vgFrame();
26
27
switch ( vgGetWinKey(win) )
28
{
29
//按下空格键开门
30
case ' ':
31
opentheDoor();
32
break;
33
default:
34
break;
35
}
36
}
37
}
38
void opentheDoor()
39
{
40
vgObject* obj;
41
vgPart* door;
42
vgPosition* pos;
43
int i;
44
float x, y, z, h, p, r;
45
obj = vgGetObj(0);
46
door = vgFindPart(obj, "door", NULL); //获取DOF
47
pos = vgNewPos();
48
vgGetPos(door, pos);
49
vgGetPosVec(pos, &x, &y, &z, &h, &p, &r);
50![](/Images/OutliningIndicators/InBlock.gif)
51
for (i=0; i<120; i++)
52
{
53
h+=1;
54
vgPosVec(pos, x, y, z, h, p, r);
55
vgPos(door, pos);
56
vgSyncFrame();
57
vgFrame();
58
}
59
vgDelete(pos);
60![](/Images/OutliningIndicators/InBlock.gif)
61
}
![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/None.gif)
3
![](/Images/OutliningIndicators/None.gif)
4
![](/Images/OutliningIndicators/None.gif)
5
![](/Images/OutliningIndicators/None.gif)
6
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
7
![](/Images/OutliningIndicators/InBlock.gif)
8
![](/Images/OutliningIndicators/InBlock.gif)
9
![](/Images/OutliningIndicators/InBlock.gif)
10
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
11
![](/Images/OutliningIndicators/InBlock.gif)
12
![](/Images/OutliningIndicators/InBlock.gif)
13
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
14
![](/Images/OutliningIndicators/InBlock.gif)
15
![](/Images/OutliningIndicators/InBlock.gif)
16
![](/Images/OutliningIndicators/InBlock.gif)
17
![](/Images/OutliningIndicators/InBlock.gif)
18
![](/Images/OutliningIndicators/InBlock.gif)
19
![](/Images/OutliningIndicators/InBlock.gif)
20
![](/Images/OutliningIndicators/InBlock.gif)
21
![](/Images/OutliningIndicators/InBlock.gif)
22
![](/Images/OutliningIndicators/InBlock.gif)
23
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
24
![](/Images/OutliningIndicators/InBlock.gif)
25
![](/Images/OutliningIndicators/InBlock.gif)
26
![](/Images/OutliningIndicators/InBlock.gif)
27
![](/Images/OutliningIndicators/InBlock.gif)
28
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
29
![](/Images/OutliningIndicators/InBlock.gif)
30
![](/Images/OutliningIndicators/InBlock.gif)
31
![](/Images/OutliningIndicators/InBlock.gif)
32
![](/Images/OutliningIndicators/InBlock.gif)
33
![](/Images/OutliningIndicators/InBlock.gif)
34
![](/Images/OutliningIndicators/InBlock.gif)
35
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
36
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
37
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
38
![](/Images/OutliningIndicators/None.gif)
39
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
40
![](/Images/OutliningIndicators/InBlock.gif)
41
![](/Images/OutliningIndicators/InBlock.gif)
42
![](/Images/OutliningIndicators/InBlock.gif)
43
![](/Images/OutliningIndicators/InBlock.gif)
44
![](/Images/OutliningIndicators/InBlock.gif)
45
![](/Images/OutliningIndicators/InBlock.gif)
46
![](/Images/OutliningIndicators/InBlock.gif)
47
![](/Images/OutliningIndicators/InBlock.gif)
48
![](/Images/OutliningIndicators/InBlock.gif)
49
![](/Images/OutliningIndicators/InBlock.gif)
50
![](/Images/OutliningIndicators/InBlock.gif)
51
![](/Images/OutliningIndicators/InBlock.gif)
52
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
53
![](/Images/OutliningIndicators/InBlock.gif)
54
![](/Images/OutliningIndicators/InBlock.gif)
55
![](/Images/OutliningIndicators/InBlock.gif)
56
![](/Images/OutliningIndicators/InBlock.gif)
57
![](/Images/OutliningIndicators/InBlock.gif)
58
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
59
![](/Images/OutliningIndicators/InBlock.gif)
60
![](/Images/OutliningIndicators/InBlock.gif)
61
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)