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函数来控制,下面是一个简单的开门程序,大家可以举一反三,实现开/关门:
 1 #include
#include 
2 #include
#include 
3 static void opentheDoor(void);
static void opentheDoor(void);
4
5 main( int argc, char *argv[] )
main( int argc, char *argv[] )
6 {
{
7
8 vgWindow* win;
vgWindow* win;
9 if ( argc != 2 )
if ( argc != 2 ) 
10 {
{
11 printf( "Usage: %s ", argv[0] );
    printf( "Usage: %s ", argv[0] );
12 exit( -1 );
    exit( -1 );
13 }
    } 
14 
     
15 vgInitSys( );
    vgInitSys( );
16 
     
17 vgDefineSys( argv[1] );
    vgDefineSys( argv[1] );
18
19 vgConfigSys( );
vgConfigSys( );
20
21 win = vgGetWin(0);
win = vgGetWin(0);
22 while ( 1 )
while ( 1 )
23 {
{
24 vgSyncFrame();
  vgSyncFrame();
25 vgFrame();
  vgFrame();
26 
    
27 switch ( vgGetWinKey(win) )
  switch ( vgGetWinKey(win) )
28 {
  {
29 //按下空格键开门
  //按下空格键开门
30 case ' ':
  case ' ':
31 opentheDoor();
     opentheDoor();
32 break;
     break;
33 default:
  default:
34 break;
   break;
35 }
  }
36 }
}
37 }
}
38 void opentheDoor()
void opentheDoor()
39 {
{
40 vgObject* obj;
  vgObject* obj;
41 vgPart* door;
  vgPart* door;
42 vgPosition* pos;
  vgPosition* pos;
43 int i;
  int i;
44 float x, y, z, h, p, r;
  float x, y, z, h, p, r;
45 obj = vgGetObj(0);
  obj = vgGetObj(0);
46 door = vgFindPart(obj, "door", NULL); //获取DOF
  door = vgFindPart(obj, "door", NULL); //获取DOF
47 pos = vgNewPos();
  pos = vgNewPos();
48 vgGetPos(door, pos);
  vgGetPos(door, pos);
49 vgGetPosVec(pos, &x, &y, &z, &h, &p, &r);
  vgGetPosVec(pos, &x, &y, &z, &h, &p, &r);
50
51 for (i=0; i<120; i++)
        for (i=0; i<120; i++)
52 {
  {
53 h+=1;
   h+=1;
54 vgPosVec(pos, x, y, z, h, p, r);
   vgPosVec(pos, x, y, z, h, p, r);
55 vgPos(door, pos);
   vgPos(door, pos);
56 vgSyncFrame();
   vgSyncFrame();
57 vgFrame();
   vgFrame();
58 }
  }
59 vgDelete(pos);
  vgDelete(pos);
60
61 }
}
 
 #include
#include 2
 #include
#include 3
 static void opentheDoor(void);
static void opentheDoor(void);4

5
 main( int argc, char *argv[] )
main( int argc, char *argv[] )6
 {
{7

8
 vgWindow* win;
vgWindow* win;9
 if ( argc != 2 )
if ( argc != 2 ) 10
 {
{11
 printf( "Usage: %s ", argv[0] );
    printf( "Usage: %s ", argv[0] );12
 exit( -1 );
    exit( -1 );13
 }
    } 14
 
     15
 vgInitSys( );
    vgInitSys( );16
 
     17
 vgDefineSys( argv[1] );
    vgDefineSys( argv[1] );18

19
 vgConfigSys( );
vgConfigSys( );20

21
 win = vgGetWin(0);
win = vgGetWin(0);22
 while ( 1 )
while ( 1 )23
 {
{24
 vgSyncFrame();
  vgSyncFrame();25
 vgFrame();
  vgFrame();26
 
    27
 switch ( vgGetWinKey(win) )
  switch ( vgGetWinKey(win) )28
 {
  {29
 //按下空格键开门
  //按下空格键开门30
 case ' ':
  case ' ':31
 opentheDoor();
     opentheDoor();32
 break;
     break;33
 default:
  default:34
 break;
   break;35
 }
  }36
 }
}37
 }
}38
 void opentheDoor()
void opentheDoor()39
 {
{40
 vgObject* obj;
  vgObject* obj;41
 vgPart* door;
  vgPart* door;42
 vgPosition* pos;
  vgPosition* pos;43
 int i;
  int i;44
 float x, y, z, h, p, r;
  float x, y, z, h, p, r;45
 obj = vgGetObj(0);
  obj = vgGetObj(0);46
 door = vgFindPart(obj, "door", NULL); //获取DOF
  door = vgFindPart(obj, "door", NULL); //获取DOF47
 pos = vgNewPos();
  pos = vgNewPos();48
 vgGetPos(door, pos);
  vgGetPos(door, pos);49
 vgGetPosVec(pos, &x, &y, &z, &h, &p, &r);
  vgGetPosVec(pos, &x, &y, &z, &h, &p, &r);50

51
 for (i=0; i<120; i++)
        for (i=0; i<120; i++)52
 {
  {53
 h+=1;
   h+=1;54
 vgPosVec(pos, x, y, z, h, p, r);
   vgPosVec(pos, x, y, z, h, p, r);55
 vgPos(door, pos);
   vgPos(door, pos);56
 vgSyncFrame();
   vgSyncFrame();57
 vgFrame();
   vgFrame();58
 }
  }59
 vgDelete(pos);
  vgDelete(pos);60

61
 }
} 
                    
                


 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号