XSI群组动画解析及实例应用Word文档下载推荐.docx
《XSI群组动画解析及实例应用Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《XSI群组动画解析及实例应用Word文档下载推荐.docx(14页珍藏版)》请在冰豆网上搜索。
智能类(基于节点控制,可选择行为的)或说是AI类
这一类的制作是基于节点控制、选择的,也就是说在某种情况下,选择某种行为。
这种方式类似于人的基本活动,所以也就被现在很多的影片采用。
它可以实现角色在复杂地面的行走,而不会产生滑步,而且可以使角色具备动力学的特性,可以开发战斗,寻找,混合等多种复杂行为。
由于这种制作方式是通过节点激活行为的方式来实现的,也就为事件制作的深度和广度提供了可能。
但是这类制作有一定的难度,不但要有一定的编程技巧,还要能很好的规划角色的行为流程。
现在国际使用的这类商业制作软件主要有以下几种:
Massive、Behavior和Aitool,接下来我们以Behavior来做一些实例分析
(影片《IROBOT》使用Massive制作了复杂的群组动画
见图4)
Behavior是AVID公司出品的一个专门用于群组动画制作的软件,我们首先来了解一下这个软件的工作流程
(工作流程图
见图5)
这个软件要与SOFTIMAGE|XSI配合使用,首先在要在XSI中进行模型,动画及准备设定,之后通过DotXSI文件输入到BEHAVIOR中进行群组动画制作,完成后再通过DotXSI倒入XSI或直接使用MentalRay渲染。
而在BEHAVIOR内部的制作流程可参考下图
(BEHAVIOR内部工作流程图
见图6)
在BEHAVIOR内部包含主代码设计、常数文件设计、节点设计、文件输出几大部分
(BEHAVIOR界面
见图7)
(动作捕捉现场
见图8、见图9)
而对于原始的动作数据我们一般会采用MotionCapture的方式,这样可以节省大量的时间和人员
我们先来看一下BEHAVIOR的基本例子
1.打开BEHAVIOR。
2.按F11或点击XsiViewer
3.用ImportXsiActor倒入在XSI内设置好的角色
4.用鼠标右键点击角色,你会看到角色预设置好的动画目录,这时随便点那个动画项目,角色就会运行该项目定义的行为
(见图10)
5.接着我们在Piccolo内创建一个简单的行为代码,代码的名字叫Startup.pc
useconstants"
drive_constants"
;
//调用常数参数
functionmain()//主程序
{
engine.RunScript("
rtk"
nil);
//调用内核脚本
globalvarworld=engine.GetCurrentWorld();
//声明全局变量,确定内核脚本影响当前模型场景
vargold=Actor("
Gold0"
);
//将模型引入一个变量中,以便进行控制
varsa;
//声明sa变量
varsa=CreateSkillActivity(gold,"
talk"
50);
//用函数CreateSkillActivity为角色加入动画条目“talk”并使该行为每次开始延时50毫秒
sa.SetFlags(drvSKILLACTIVITY_LOOP);
//将该行为循环使用
world.AddActivity(sa);
//将该行为加入模型场景,给角色使用
}
(见图11)
通过上面这个简单的例子,我们可以看出BEHAVIOR内代码的基本组成,下面让我们再看几个简单实例来更好的了解群组动画的分类和制作
1.简单UnMotion动画。
在这类动画中,角色不移动,只有原地行为,适合表现庆典,欢送的人群类的场景。
首先,在BEHAVIOR内导入一个设置好的地面和角色,打开XsiViewer,打开Populate表格,设定好参数后用鼠标在地面上绘制角色的Proxy。
(见图12)
接着用ActorParticles将Proxy转化为角色
(见图13)
建立一个startup.pc文件,并输入以下代码:
useconstants"
functionmain()
{
globalvar
world=engine.GetCurrentWorld();
varlist=world.GetActorList("
Female"
varactor;
for(actor=list.First();
actor!
=nil;
actor=list.Next())
{actor.AttachHFSM("
key"
}
在这段代码中,我们用一个循环语句将每个角色都给与一个HFSM(我们可以理解为行为编辑器),这个叫“key”的HFSM要在StateMachine中创建。
接下来在这个HFSM中加入一个行为节点State_1并键入以下的代码:
{
varindex=Math.Rand()%3;
if(index==0)
sa=CreateSkillActivity(actor,"
happyA"
200);
elseif(index==1)
happyB"
elseif(index==2)
happyC"
sa.activity.SetStartTime(world.now+Math.Rand()%2000);
}
(HFSM内的State_1
见图14)
(最终动画效果
见图15)
在这段代码中,我们使用条件语句对每个角色的行为进行随机选择,并对错开每个角色动画的起始时间,下面我们就可以编译代码,检查动画了
2.Motion动画。
在这类动画中角色根据以设定路径曲线方向,或目标点移动并避开障碍物。
这类动画适合表现城市街景,军队的队伍,难民或繁忙人群的景象
首先准备场景,准备完成后再加入一些障碍物,并用FlockGoal设置目标点
(准备场景
见图16)
在startup.pc内建入以下代码
functionmain()
varworld=engine.GetCurrentWorld();
varflock=newDrvFlock(0.4);
SceneGoalFlock(flock);
actor=list.Next())
{
AddFlockActor(actor,"
walk"
90,0);
vari;
for(i=0;
i<
flock.GetNumSceneGoals(world);
i++)
flock.EnableSceneGoals(world,i);
在这里,我们使用了一个FLOCK的类,也就是把多个角色作为一个物体来考虑,并通过FlockGoal设置了行为的目标点,这样角色就会向目标点移动,并避开行进路径上的障碍物
(避开障碍物移动
见图17)
3.Dynamic(动力学)动画。
这类动画适合表现战争中的爆炸,灾难类的场面
准备场景,然后在startup.pc内键入以下代码
vargravity=newDrvVector(0,-98,0);
varERP=0.2;
globalvarg_dyn=newDrvDynamics(gravity,ERP);
varg_actor,g_terrain=InitActor("
Terrain"
globalvarmovable=FALSE;
globalvarbounce=0.5;
globalvarfriction=0.5;
varma=newDrvDynamicsActivity(g_dyn,g_terrain,movable,bounce,friction);
world.AddActivity(ma);
Male"
for(g_actor=list.First();
g_actor!
g_actor=list.Next())
g_actor.AttachHFSM("
}
functionInitActor(name)
varlist=world.GetActorList(name);
{
actor.GotoHomeConfig(TRUE);
varG=actor.GetRootNode().GetGlobalTransform();
G.Identity();
actor.GetRootNode().SetGlobalTransform(G);
returnactor;
见图18)
在这里我们用了一个嵌套函数InitActor,这个函数的主要作用是初始角色的位置,在这里我们用它初始化地面。
我们还调用了一个新的函数类DrvDynamics,这个类负责对整个动力学系统进行设置。
在“key”内,我们建立一个行为激发,DM_KEYBOARD_KEYDOWN是转化的激发条件,我们按下键盘任意一键,角色的行为就会转化到下一个节点所定义的行为
(见图19)
绿色代表初始节点,初始节点的代码如下:
一个简单的行走动画
在expo节点内加入爆炸的代码:
{
world.DestroyActivities(actor);
G.position.y=1;
movable=TRUE;
varda=newDrvDynamicsActivity(g_dyn,actor,movable,bounce,friction);
world.AddActivity(da);
varroot=actor.GetNodeByName("
Spine"
varsrc=newDrvVector(5,-3,93);
varmagnitude=8;
vardepth=3;
ApplyImpulse(da,root,src,magnitude,depth);
在这段代码中,我们定义了爆炸的位置,强度,范围,和角色所被影响的节点。
当编译程序,角色移动到爆炸点时,按下键盘任意一键,角色会被炸飞并落到地面与地面发生碰撞,摩擦(见图20)
以上这些就是群组动画的一些简单例子,其中一些点还可以有一些更复杂的应用。
群组动画只是计算机三维动画的一个分支,还是需要与三维动画的其它部门进行密切的合作,比如模型的导入,导出,渲染时生成mi文件对于贴图、材质的调用,前期运动数据的采集和修改,都是需要考虑的环节。
(《骇客帝国》中的群组动画是很多部门共同合作的结果
见图21)