我要发帖 回复

正式会员

3

主题

72

积分

0

专家分

:

私信
发表时间 : 2008-11-7 11:07:59 | 浏览 : 2720    评论 : 17
vega编程中文资料<运动体>
运动体

运动体提供了一种在场景中控制动态实体方位的手段。和运动体有关的Vega类包括实体、运动模式、体和碰撞检测,一个运动体只能关联一个运动模式或者体,但可以同时关联多个实体和碰撞检测。
相关的属性:
VGCOMMON_ENABLED
VGPLYR_TYPE
VGPLYR_CLASSNUM
VGPLYR_TEAM
VGPLYR_CSREF
VGPLYR_MOTION
VGPLYR_SPLINE_NAVIGATOR
相关的函数:
vgPlayer* vgNewPlyr ( void );  
vgPlayer* vgNewPlyrCopy ( const vgPlayer *src );  
vgPlayer* vgFindPlyr ( const char *name );  
vgPlayer* vgGetPlyr ( int _index );  
int  vgGetNumPlyr ( void );  
void  vgPlyrVol ( vgPlayer *plyr, vgVolume *vol );  
vgVolume* vgGetPlyrVol ( vgPlayer *plyr );  
void  vgAddPlyrIsect ( vgPlayer *plyr , vgIsector *isect );  
void  vgRemPlyrIsect ( vgPlayer *plyr , vgIsector *isect );  
int  vgGetPlyrNumIsect ( vgPlayer *plyr );  
vgIsector* vgGetPlyrIsect ( vgPlayer *plyr, int idx );  
void  vgAddPlyrObj ( vgPlayer *plyr , vgObject *obj );  
void  vgRemPlyrObj ( vgPlayer *plyr , vgObject *obj );  
int  vgGetPlyrNumObj ( vgPlayer *plyr );  
vgObject* vgGetPlyrObj ( vgPlayer *plyr, int idx );  
void  vgPlyrMot ( vgPlayer *plyr, vgMotion *motion );  
vgMotion* vgGetPlyrMot ( vgPlayer *plyr );  
void  vgPlyrNav ( vgPlayer *plyr, vgNavigator *nav );  
vgNavigator* vgGetPlyrNav ( vgPlayer *plyr );  
void  vgPlyrObservRef ( vgPlayer *plyr, vgObserver *obs );  
vgObserver* vgGetPlyrObservRef ( vgPlayer *plyr );  
vgPlayer* vgGetPlyrPlyrRef ( vgPlayer *plyr );  
void  vgPlyrPlyrRef ( vgPlayer *plyr, vgPlayer *plyrd );  
void  vgPlyrCSRef ( vgPlayer *plyr, vgPosition *pos );  
void  vgGetPlyrCSRef ( vgPlayer *plyr, vgPosition *pos );  
void  vgPlyrRepresent ( vgPlayer *plyr, unsigned mask );  
unsigned  vgGetPlyrRepresent ( vgPlayer *plyr );  
1、属性设置
    可以用Vega的通用函数vgProp()和vgGetProp()设置或取得运动体的当前属性。下面的代码指定一个运动体的状态:
vgProp( plyr, VGCOMMON_ENABLED, VG_ON );
下面的代码返回运动体的当前状态:
plyr_state = vgGetProp( plyr, VGCOMMON_ENABLED );
运动体支持的属性见下表:
Table 6.1 Vega Player Properties
PropertyDescription
VGCOMMON_ENABLED
[VG_ON]
VG_OFFPlayer state.
VGPLYR_TYPE
[VG_AIR]
VG_GROUNDSpecifies the type of Player.
VGPLYR_CLASSNUM
[0] - 255Player classification.
VGPLYR_TEAM
[0] - 255Player team identifier.
VGPLYR_CSREF
[VGPLYR_ABSOLUTE]
VGPLYR_OBS
VGPLYR_PLYR
VGPLYR_CSREFPOSCoordinate system reference mode.
VGPLYR_MOTION
VG_ON
[VG_OFF]Specifies whether the attached motion model will influence the player regardless of the current motion model state.
VGPLYR_SPLINE_NAVIGATORSpecifies whether the attached spline navigator will influence the player regardless of the current navigator state.


1、关联类实例到运动体实例
    把一个运动模式关联到一个运动体上:
vgPlyrMot( plyr, mot );
查询运动体当前关联的运动模式:
vgMotion *mot;
mot = vgGetPlyrMot( plyr );
    Vega为每个运动体维护着一个管理实体和碰撞检测类的列表,在运行期间,所有关联到运动体上的对象都会按照运动体的方位和各对象相对运动体的偏移进行更新。Vega为每种类列表提供了4个API对列表进行管理。
把一个实体添加到运动体列表中:
vgAddPlyrObj ( plyr , obj );
从运动体列表中删除一个实体:
vgRemPlyrObj ( plyr, obj );
返回与一个运动体关联的实体的个数:
num_obj = vgGetNumPlyrObj( plyr );
通过索引返回运动体列表中的一个实体:
vgObject *obj;
obj = vgGetPlyrObj( 0 ); /* gets the first object in the list */
2、运动体的定位
    运动体的方位可以由vgPos()直接指定,也可以由与运动体相关联的运动模式或者导航器来指定。
/* position the player */
vgPosition *pos;
pos = vgNewPos( );
vgPosVec( pos, 1000.0f, */0f, 100.0f, 90.0f, 0.0f, 0.0f );
vgPos( plyr, pos );

/* attach the motion model to a player */
vgPlyrMot( plyr, mot );
/* now query the player for the current motion model */
mot = vgGetPlyrMot( plyr );

vgNavigator *nav;
/*attach the navigator to a player */
vgPlyrNav( plyr, nav );
/* now query the player for the current navigator attachment:
nav = vgGetPlyrNav( plyr );

3、运动体的参考坐标系
通常情况下,运动体的方位是在绝对坐标系中定义的。有时出于方便的考虑,也可以通过设置运动体的属性来改变其参考坐标系的类型。Vega为运动体相对于其它运动体、观察者和任意指定位置的参考坐标系提供了相应的API:
Observer vgPlyrObservRef() vgGetPlyrObservRef()
Player vgPlyrPlyrRef() vgGetPlyrPlyrRef()
Arbitrary vgPlyrCSRef() vgGetPlyrCSRef()
下面的代码指定空间的一个点(5000.0f, 5000.0f, 1000.0f)作为运动体的参考坐标系的原点。
vgPlayer *plyr;
vgObject *obj;
vgPosition *pos, *cspos;

/* create a new player */
plyr = vgNewPlyr();
vgName( plyr, "plane" );

/* enable the player */
vgProp( plyr, VGCOMMON_ENABLED, VG_ON );

/* set the player type to air */
vgProp( plyr, VGPLYR_TYPE, VG_AIR );
/* find the f16 object and set an object offset value */
obj = vgFindObj( "f16" );

/* attach the object */
vgAddPlyrObj( plyr, obj );

/* set the coordinate system mode */
vgProp( plyr, VGPLYR_CSREF, VGPLYR_CSREFPOS );

/* assign the new coordinate system reference point */
cspos = vgNewPos();
vgPosVec( cspos, 5000.0f, 5000.0f, 1000.0f, 0.0f, 0.0f, 0.0f );
vgPlyrCSRef( plyr, cspos );

/* now query the current cs reference */
vgGetPlyrCSRef( plyr, pos );
4、实体的方位
    当实体关联到一个运动体上士,其方位是由运动体的方位和实体相对于运动体的偏移所共同决定的。注意:当运动体关联到一个运动模式或者导航器上后,其方位由后者决定,此前为运动体指定的方位无效。而当实体被关联到一个运动体上后,此前为其指定的方位将被看作是偏移量。
vgPlayer *plyr;
vgObject *obj;
vgPosition *pos, *offpos;

/* create a new player */
plyr = vgNewPlyr();
vgName( plyr, "plane" );

/* enable the player */
vgProp( plyr, VGCOMMON_ENABLED, VG_ON );

/* set the player type to air */
vgProp( plyr, VGPLYR_TYPE, VG_AIR );

/* attach the object */
vgAddPlyrObj( plyr, obj );

/* position the player */
pos = vgNewPos();
vgPosVec( pos, 1000.0f, 1000.0f, 100.0f, 90.0f, 0.0f, 0.0f );
vgPos( plyr, pos );

5、运动体的体
    每个运动体都可关联到一个与其表现对象的形状和尺寸相似的体上以支持碰撞检测和相关操作。下段代码把一个体关联到一个运动体上。
vgVolume *vol;

/* attach a volume to a player */
vgPlyrVol( plyr, vol );

/* query the player for the current volume */
vol = vgGetPlyrVol( plyr );
6、实体的体
在应用程序中往往希望能够得到周围环境的信息:如碰撞检测或海拔高度等。这可以通过把一个或多个碰撞检测对象添加到运动体上来实现。下段代码表示如何向一个运动体“plane”上添加一个用于从数据库中查询海拔高度HAT的碰撞检测对象。HAT查询的目标是场景“scene”中的地形几何体,在每次帧更新时,HAT对象会自动随着关联运动体的移动而移动并返回新位置上的检测结果。
vgPlayer *plyr;
vgIsector *isector;
vgScene *scene;

/* create a new player */
plyr = vgNewPlyr();
vgName( plyr, "plane" );

/* enable the player */
vgProp( plyr, VGCOMMON_ENABLED, VG_ON );

/* set the player type to air */
vgProp( plyr, VGPLYR_TYPE, VG_AIR );

/* attach the object */
vgAddPlyrObj( plyr, obj );

/* create an isector */
isector = vgNewIsect();
vgIsectTarget( isector, scene );
vgIsectClass( isector, VGIS_TERRALL );
vgProp( isector, VGIS_METHOD, VGIS_HAT );
vgProp( isector, VGIS_MINZ, 10.0f );
vgProp( isector, VGIS_MAXZ, 10000.0f );

/* attach an isector to a player */
vgAddPlyrIsect( plyr, isect );

/* position the player */
pos = vgNewPos();
vgPosVec( pos, 1000.0f, 1000.0f, 100.0f, 0.0f, 0.0f, 0.0f );
vgPos( plyr, pos );
7、与运动体有关的回调函数
l         VGPLYR_ADD_OBJ
把实体添加到运动体后调用,回调函数的格式如下:
void MyFunc( vgCommon *parent, vgCommon *child, void *udata );
l         VGPLYR_REM_OBJ
把实体从运动体中删除后调用,回调函数的格式如下:
void MyFunc( vgCommon *parent, vgCommon *child, void *udata );

最近VR访客

avia_lisa 评论于2008-11-14 11:45:23
此文甚好!
学习了。
wuxzp 评论于2008-11-14 13:32:10
努力学习
treesnow 评论于2008-11-17 11:54:00
很好哈
zhihuab 评论于2008-11-17 15:52:06

回复 1楼 的帖子

很好,就是看不懂
打江山 评论于2008-11-17 20:25:26
很好,学习了
hzcjh 评论于2008-11-30 02:59:16
谢谢
kankan1985 评论于2009-3-31 13:57:49
学习了
ushio 评论于2009-3-31 17:21:29
好东西,收下研究!
谢谢lz
huahuaxia 评论于2009-8-6 11:22:19
好东西收藏啦
新手 评论于2009-8-10 17:30:37
收下啦!谢谢!
xyq9027 评论于2009-8-30 10:15:15
非常好!感谢楼主!!
taleboy 评论于2009-12-11 19:23:59
恩,谢谢楼主分享
feihang 评论于2010-3-10 20:34:13
{:3_76:}
xupengss1978 评论于2010-3-18 23:03:40
不错的帖子,学习学习
bingge_2005 评论于2010-9-10 15:40:49
y有没有完整的例子能不能发一个上来,比如物体按照某一加速度抛物线式飞行,
foxy1979 评论于2010-9-27 13:36:46
感谢之后再学习!
okwudebin 评论于2011-6-30 09:10:00
不错不错。。。

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

GMT+8, 2020-10-20 06:01 AM

返回顶部