基于Vega的DI-Guy运用研究
来源:第三维度
作者:喻静怡 崔兴好 刘怡昕 郭凯
摘要
本文从军事训练的角度,对单兵作战虚拟现实训练系统、DI-Guy人体仿真软件和视景仿真软件Vega。进行了介绍,总结了Vega条件下应用DI-Guy的三种方法,阐述了修改DI-Guy模型的方法.实际应用结果表明,虚拟人动作比较灵活、自然,大大增强了人机的交互性,基本可以满足单兵作战虚拟现实公}}练需要。本文也讨论了具体运用中的若干技术问题及建模技巧。
1.引言
长期 以 来 .军事训练受场地和器材的限制,很难对训练效果做出及时、准确的评价,大多依赖复杂的实弹射击和演习作为军事训练考核的重要手段。其组织训练难度大,成本高且安全性差。为满足部队日常训练的要求,迫切需要研制不受客观环境限制的“虚拟现实训练系统”,而单兵作战训练是一个重要内容。其中虚拟人的表现是体现虚拟现实形象、逼真及互动等独特魅力的关键技术之一。
在军 事 训 练系统中,构建实体的一项重要内容就是对作为计算机生成兵力(一种自治实体)的虚拟人的建模及行为控制。依据现有条件,主要对Vega和DI-Guy软件生成的虚拟人运用进行了研究。
2.研发环境介绍
2.1 DI-Guy
DI- Guy是 波士顿动力公司(BostonD ynamicsInc., BDI)的虚拟人物模型软件。DI为Dismounted Infantry的缩写,意为下车(不是在装甲车等内的)步兵。人物模型可在三维虚拟世界里实时、平滑运动,通过API调用能实现对外来消息的响应。它有真实的士兵训练特征,包括多种制服、武器和多种附属装备。可定义的动作包括站、跪、甸甸前进、走、跳、潜行和使用武器等。DI-Guy将简化开发者在虚拟场景中放置虚拟人的工作量,避免了关节控制、动作合成、几何层次管理、纹理贴图创建和动画等烦琐的基本工作。
2.2 Vega
Vega是 美 国Multigen-Paradigm公司生产的用于虚拟现实、实时视景仿真、声音仿真以及其他可视化领域的应用软件。它为开发复杂的虚拟现实程序提供了便捷手段。
2.3 Lynx
Lynx是 用 来设定和预览Vega应用程序的图形用户界面,可以简化用户对Vega的操作。
2.4 Creator
Creator 是一个专用于实时仿真的三维建模工具。使用其创建的基于多边形的几何模型可大大降低实时应用程序对编程的要求。Creator不仅有用于建造模型、地形和场景的用户界面,还有符合OpenFIight (At)文件格式标准的层次数据库视图。 应用范围极其广泛,几乎包括了涉及虚拟现实技术建模的各个方面。
3.使用DI-Guy现有模型
在Vega中 使用DI-Guy的前提当然是要安装了DI-Guy模块,按要求应该在安装Vega之前先安装BDI公司的DI-Guy产品。在Vega中使用DI-Guy模型有使用导航器和API直接调用两种方法。
3.1 使用导航器
Vega产 品为BDID I-Guy模块专门提供了配置DI-Guy的图形界面与API,所以相应地有两种实现途径。
3.1.1 使用Lynx配置
使用 导 航 器免去了用户直接调用API的麻烦,大多时候可简便而有效地使用DI-Guy模块。但仅使用切nx配置只能指定LOS碰撞检测,若要籍位于地面尚需编程控制(见3.1.2程序中的height函数)。使用切nx进行配置的一般过程为;
(1) 在 V egaD I-Guy面板生成一个DI-Guy,设名为Soldierle
(2) 建 立 一个新的path,假设名字为pathl, 文件名为Lpth,建立一个新的Navigator,假设名字为Navl,文件名l.nav,关联pathle
(3) 打 开 pathto ol,选中Nav1, 类型选择BDICharacter,然后选择DI-Guy的人物,并添加装备。
(4 )在 视 图区用鼠标点击创建控制点,生成一条路径,同时选择路径转弯半径,在DI-Guy人物穿越路径时,会保持一定的转弯半径。若半径为0.0,人物沿点点之间的笔直路段行走,在走向下一点时会陡然转向;若指定非零值,人物以曲半径为设定值的弧形经过控制点。
(5 )选 择 人物动作。人物动作根据平均速度分为两类:时间动作和运动动作。若速度)0.1 MIS,为运动动作,否则为时间动作。运动动作可以把人员由一个路径控制点推进至下一个控制点。在控制点处,执行一系列的时间动作,如瞄准等。时间动作执行完毕,则启动控制点的运动动作,如走、跑和甸旬等,直至下一控制点。
(6) 存 储 path和navigators,退出pathto ol
(7 )在 I sector面板中生成一个新的Isector,类型为LOS,目标为地形,IsectorCl ass为Terrain.
(8) 在 V egaD I-Guy面板关联LOS类型Isector和Navle
(9) 用 S cene面板的VegaD I-Guy'sin sc enc。选项板把Soldierl加人到场景中。DI-Guy的人物必须添加至场景:才能在Vega应用程序中显示。确保 观 察 者位置适当,预览程序就可以在场景中看到所添加的人物了。
3.1.2 调用Vega API配里
这种 方 法 与使用Lynx配置步骤相当,只是需要调用一些Vega APP。一般在使用配置不能满足要求的情况下才使用此方法,其典型步骤如下例所示。
#include "vg.h"
#include "vgdiguy.h"
#include "female_pedestrian.h"
#include "isect.h"//自己定义
vglsector *isector z=NULL;
float height(diguyCharacterHandle handle,
flo at x ,f loa ty ,fl oat o ld- z)
{
ret unr c ompute_z(isector_z,x,y);
}
int main(int argc, char* argv[])
{
float result;
vgPosition*pos=vgNewPosQ;
argc= 2;
argv[1 ]=" C:\\Program Files\\Paradigm\\Vega\\Sample\\Vega\\Adfl\town.adf';
vglnit sys ();
vglnit DIG uyQ;
vgDefmeSys(argv[I]);
vgconftgsys();
float x_points[]=[0.0,10.0,20.0,25.0,20.0,10.0,0.0,-5.01;
float y_points[]=[0.0;5 .0,0.0,10.0,20.0,25.0,20.0,10.01;
vgDIGuy*character=vgNewDIGuyp;
vgName( character,"femalep");
vgProp(c haracter,VGDIGU'Y_CHARACTER_TYPE,DIGUY_FEMAI.E_PEDESTRIAN);
vgDIGuy Action(character,FEMALEP EDESTRIAN_TROLL);
vgMakeD IGuy(character);
isector_z =make_z_isector(vgGetScene(0),VGIS_TERRALL,-1000,1000,0.0);
vglsector *isector_los=make_los_isector(vgGetScene(0),VGIS_TERRALL, 100,100,100.0);
vgDIGuy lsect(character,isector_los);
dig uy_ se t_altitudeesfu nction(vgGetDIGuyCharacterHandle(character),height);
vgP at h*p ath;
vgDIGuy Navigator*diguy_nav;
path= vgN ewPath("femalep.pth",NULL);
diguy_nav=vgNewDIGuyNavigator("femalep.nav",path);
vgDIGuy NavigatorDIGuy(diguy_nav,character);
vgProp(c haracter,VGDIGUYP ATH_TURN_RADIUS,0.5);
vgMakeDIGuyNavigator(diguy_nav);
for ( int i=0;i<6;i ++)
vgD IG uy Ne xtP at hP oint(c haracter,x points[il, y-points[i]);
if( ( int) vgGetProp(c haracter,V GDIGUY_FOLLOWING_PATH)!=VG_TRUE)
vgNotify (VG_APP,VG_WARN," ERROR: character given invalid path");
vgAddSc eneDIGuy(vgGetScene(0),character);
while (1)
{
vgSyncFrame();
vgFrame();
vgGetPos(cheracter,pos);
compute_los(isector_los,pos,&result);
/*此处更改人物的动作*/
}
return 1;
3.2 直接调用BDIAPI
此方法可不必设置路径与导航器,从而避免了路径工具的DI-Guy插件的不稳定的麻烦,也可不使用VegaA PI而直接调用BDIA PI,但需使用大量的BDI函数,刚接触时需要花一定的时间来了解BDI API的使用。在需要用户直接操纵人物或者人物动作不可预先确定时侧月。使用的一般过程如下所示。
#include "vg.h"
#include "isect.h"
#include "vgdiguy.h"
#include "soldier.h"
#include <vgperf.h>
#include <diguy-pf.h>
vg1sector*isector_z=NULL;
diguyCharacterHandles oldierm ale,female;
float orientation=-90.0f;
diguyCharacterHandle create_diguy_character(char* char_str,char* eq[], float x,floaty ,float z ,float orientation, float scale, char*action_str)
{
diguyCharacterType char_type;
diguyCharacterHandle handle;
diguyAciton aciton;
charestype=diguy_query_character_type_by_na
me(char_str);
diguy_load_character(char_type);
action = diguy_query_acitontokenb y_name(char_type, action_str);
handle= diguy_cerate(chart ype,eq,x ,y,z,orientation,scale,action);
return handle;
}
int main(int argc, char"' argv[])
{
float orienattion=-90.0f;
argc=2;
argv[1]= "C:\\Program Files\\Paradigm\\Vega\\Sample\\Vega\1AdA\town.adf';
vgInitSYS();
vgDefineSys(argv[l]) ;
vgConfigSys();
diguy_ initiailze_pf(NULL);
staitc char*female_eq[]= ("maritna",N ULL);
satitc char*male_eq[]=("fat_male_swtr",NULL);
soldier= cerate_diguy_character("soldier2",NULL,.-4 .0f,3 2.0f,O .0f, 90.0f-orienattion,1 ,"walk");
female= created iguycharacter("female_pedestrian", female_eq,-3.0f, 31.0f, O.0f, orientation, 1,"strol");
male = cerate_diguy_chamcter("male_pedestrian", male_eq,-2.0f, 30.0f, 0.0f, 90.0f+orientation,1, " powerwalk");
vgScene *scene_vg=vgGetScene(0);
pfScene *scene_pf=vgGetScenePfScene(scene_vg);
diguyset=graphics_attach_ptr(DIGUY_ALL_CHARACTERS_HANDLE,(void*)scene_pf);
while(1)
{
vgSyncFrame();
vgFrame();
floatdt=(float) vgGetDeltaFrameTime();
orientation=orientation+ 10.0f*dt;
if(orientation> 180 .0f)
orientation=orientation-360.0f,
if (soldier != DIGUY_BAD_CHARACTER_HANDLE)
diguy_set_orientation(soldier, 90.0f-orientation);
if(female != DIGUY_BAD_CHARACTEdig uy se t_ ori en tati on (fe ma le ,o rientation);
if(male != DIGUY _BAD_HARACTERHANDLE)
diguyset_ oirentation (male,orientation+ 90.0f);
diguyupdate (DIGUY_ALL-CHARACTERS-HANDLE, dt);
}
return 1;
}
在一 般 使 用中,应尽量使用VegaAPI,可以省时省力,只在非BDI API不能达到目的时再调用BDI API。
4.创建并运用新人物模型
在使用DI-Guy时,我们都会选择与自己想达到的人物外观最接近的模型,但是这些人物很可能会不满足我们的需要,这时就要求我们对BDI所提供的模型进行适当的修改,从而满足自己的需要。
在安装目录\bdi\geometry下,我们将会看到3种类型的文件,它们分别是:OpenFlight格式的flt文件.WaveFront格式的obi文件和DirectX格式的X文件。我们可以利用相应的建模软件对模型进行修改。
4.1 修改人物时的原则
扩展 名 为 flt的模型文件是OpenF7ight格式。可以看出对应于同一个模型有5种版本,分别对应于此模型的7种层次细节,最低的3个层次细节使用同一个文件。这使得我们在使用中可以很方便地运用。但是,对模型的修改是要遵循一定的原则的,我总结有以下几点注意事项:
(1 )要 保 持模型中各个关节的名字不变。这些关节都分别与fit文件中的object,ob j文件中的group和x文件中的frame和mesh相对应。DI-Guy靠此名字来找正确的几何体。
(2) 要 保 持各个部分的长度不变,也就是说,要保持各个关节之间的距离恒定。如果缩短了距离,那么将会在两个邻近的部分之间产生空隙;反之,则会产生一部分的重叠。
(3 )不 要 改变胳膊、腿、肌肉等人体组织的周长,即不要单独改变粗细,否则会产生交叉重叠。
在这 样 的 条件下,可以任意更改人物的外观,也可以完全改变人物的面部特征、表情、性别、发型、发色和头发的纹理等;同样也可以给人物增加饰品,如勋章、珠宝、肩章和腰带等。只要有充分的想象力和创造力.就可以达到所要的效果。通常 情 况 下,我们可以仅向人物模型中添加形体集〔装备)或者是在人物模型库中添加一个新的人物模型。其方法分别如下所述。
4.2 为已有人物模型添加新的形体集
可以 为 人 物模型添加一些相应的形体集(也可称为装备)。
这时 我 们 可以在安装目录“bdi\config\diguy”下的actor_<actor_name> shapesets.cfg文件(actor_name指的是人物的名字)中找到想要修改的模型并将其打开,将下列一段文字加人到文档中:
shape_set< new_shapeset_name>
actor=<actor_name>
is_base_shape=1
filename = <LOD1_file>
filename = <LOD2_file>
filename = <LOD3_file>
filename = <LOD4_file>
filename = <LOD5_file>
filename = <LOD6_file>
filename = <LOD7_file>
include common/shapes_and,jointsh uman.cfg
同时 , 将 自己所做的不同LOD模型文件以相应的文件名保存到“安装目.t\bdi\geometry”下文件格式对应的文件夹中。这样, 当下一次启动character-0ui_gt.ex。时,它便会自动搜索相对应的形体集模型,Shapeset栏将显示所添加的形体集
4.3 在人物列表中添加新的人物模型
可 以创 建 一个新的模型,并将其加人到BDI的配置文件中,这个模型就像BDI本身所提供的模型一样以同样的方式运行,并且可以为人物模型添加一些相应的形体集。
通常 情 况 下,BD提供的人物已经可以基本满足我们的要求,但有时我们可能会要求添加一些新的人物模型。这时就要用到这一项。同样的,我们可以遵循以下几步。
(1) 在\bdi\config\diguy中找到与自己最终效果最相似的模型文件actor_<actor-name>_shapesets.cfg,假如为char_soldier_gk.c龟。将其打开并另存为自己想要的文件名:char_newname_gk.c龟;在文件中修改char_soldier_gk_arcsxfg文件的名称为char_newname_gk_arcs.cfg;修改character-definition后的soldier_gk为newname_gk,
(2) 打 开 char_soldier_gk_arcs.cfg,以新的文件名charn ewname_gk_arcs.cfg另存。
(3) 打 开d iguyc haracters.cfg,在文本文档的最后添加以下文字include optional diguy/char_newname_gk.cfg,
这样 , 当 再次启动BD时,就可以在Characters这一栏中看到自己所添加的人物了。
通过 这 样 的修改,我们就可以在BDI原有的基础之上更加熟练地应用已有技术和模型,为我们的工作带来很大的便利。但必须切记,人物的修改是以一定的原则为前提条件的。不可以任意修改。
5.结论
使 用本 文 所述的方法可迅速、有效地掌握DI-Guy在Vega下的运用,而且经试验表明:人物形象、动作比较丰富、自然,程序运行稳定,对于在单兵作战虚拟现实训练系统中,应用此虚拟人产品的方案是可行的。利用DI-Gay人物模型的开放式特性可以快速生成所需的人物模型,可大大提高程序的通用性与虚拟现实训练系统的渲染感。但是DI-Guy软件并没有提供直接操作人物活动关节的API,用户若要虚拟人表现此软件所提供动作之外的动作,还是要做关节控制和动作合成等烦琐的基本工作的。
参考文献
[1] DI-GuyU serM anual[M],V ersion4 ,20 00
[2] VegaO pitonsG uide[M],Ve rsion3 .7,M arch2 001
[3] VegaP rogrammer'sH elp[M],Ve rsion3 .7,M arch2 001
作者简介
喻静怡。女,1982年生,硕士生,主要研究方向为计算机仿真.
崔兴好,男,1976年生,硕士,主要研究方向为虚拟作战训练。Tel: 13357805326 E-mail:cxh.vb@163.com
刘怡昕,男,1941年生,本科,主要研究方向为虚拟作战训练。
郭凯,女博士生,主要研究方向为计算机应用。