XSI群组动画解析及实例应用.docx
《XSI群组动画解析及实例应用.docx》由会员分享,可在线阅读,更多相关《XSI群组动画解析及实例应用.docx(14页珍藏版)》请在冰豆网上搜索。
![XSI群组动画解析及实例应用.docx](https://file1.bdocx.com/fileroot1/2022-11/23/d59e0abe-47c4-4831-a999-ad35d79dc3e9/d59e0abe-47c4-4831-a999-ad35d79dc3e91.gif)
XSI群组动画解析及实例应用
XSI群组动画
伴随着影视制作软硬件技术的不断发展,群组动画作为一个新兴的技术领域,越来越多的被人们所关注,这种技术可以模拟众多角色的运动,大场面的表现越来越真实,而使拍摄成本下降很多。
早在70年代,好莱坞的导演们就开始试图表现这些大场面,那时的技术还不是很完善,对于群组动画主要使用的是抠像,合成,拷贝的方法,对于镜头和导演意图的表现都有很大的局限性。
如《宾虚》等影片。
在1992年,《蝙蝠侠回归》首先使用了三维的群组动画,影片《阿甘正传》中的反越战大规模示威也是如此。
而如今,当我们看到《指环王》、《星战》、《Irobot》、《亚历山大》、《最后的武士》等影片时,我们发现群组动画已经成为大场面表现的标志之一,而且使用也越来越灵活,越来越复杂,场面也越来越壮观,对于剧情的推动起到了更好的作用。
(韩国影片《太极旗飘扬》中群组动画的使用 见图1,图2)
纵观群组动画的发展,主要可以分为两大类
1. 非智能类(基于图像或动作序列的)
非智能类的群组动画,制作难度较低,当以合成为主时,其主要是对单一或多个素材的拷贝来实现的;如果是以三维软件为主时,其主要是以粒子序列的形势表现的,主要有SpriteParticle(序列粒子),InstanceParticle(实物粒子)两大类,这类群组制作的优点就是难度较低,对于不太复杂的场景、行为可以很好的完成,如简单飞鸟,人物行走等。
但是由于其行为的是基于序列的,这也就决定了行为的单一性,如果遇到比如说碰撞物体、寻找行为或复杂路径等情况,这种制作方式就会显得力不从心。
(影片《最后的武士》对战争场面使用了这类的群组制作 见图3)
2. 智能类(基于节点控制,可选择行为的)或说是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"drive_constants";
functionmain()
{
engine.RunScript("rtk",nil);
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并键入以下的代码:
useconstants"drive_constants";
{
varindex=Math.Rand()%3;
varsa;
if(index==0)
sa=CreateSkillActivity(actor,"happyA",200);
elseif(index==1)
sa=CreateSkillActivity(actor,"happyB",200);
elseif(index==2)
sa=CreateSkillActivity(actor,"happyC",200);
sa.SetFlags(drvSKILLACTIVITY_LOOP);
sa.activity.SetStartTime(world.now+Math.Rand()%2000);
world.AddActivity(sa);
}
(HFSM内的State_1 见图14) (最终动画效果 见图15)
在这段代码中,我们使用条件语句对每个角色的行为进行随机选择,并对错开每个角色动画的起始时间,下面我们就可以编译代码,检查动画了
2.Motion动画。
在这类动画中角色根据以设定路径曲线方向,或目标点移动并避开障碍物。
这类动画适合表现城市街景,军队的队伍,难民或繁忙人群的景象
首先准备场景,准备完成后再加入一些障碍物,并用FlockGoal设置目标点
(准备场景 见图16)
在startup.pc内建入以下代码
useconstants"drive_constants";
functionmain()
{
engine.RunScript("rtk",nil);
varworld=engine.GetCurrentWorld();
varflock=newDrvFlock(0.4);
SceneGoalFlock(flock);
varlist=world.GetActorList("Female");
varactor;
for(actor=list.First();actor!
=nil;actor=list.Next())
{
AddFlockActor(actor,"walk",90,0);
}
vari;
for(i=0;i flock.EnableSceneGoals(world,i);
}
在这里,我们使用了一个FLOCK的类,也就是把多个角色作为一个物体来考虑,并通过FlockGoal设置了行为的目标点,这样角色就会向目标点移动,并避开行进路径上的障碍物
(避开障碍物移动 见图17)
3.Dynamic(动力学)动画。
这类动画适合表现战争中的爆炸,灾难类的场面
准备场景,然后在startup.pc内键入以下代码
functionmain()
{
engine.RunScript("rtk",nil);
globalvarworld=engine.GetCurrentWorld();
vargravity=newDrvVector(0,-98,0);
varERP=0.2;
globalvarg_dyn=newDrvDynamics(gravity,ERP);
varflock=newDrvFlock(0.4);
SceneGoalFlock(flock);
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);
varlist=world.GetActorList("Male");
for(g_actor=list.First();g_actor!
=nil;g_actor=list.Next())
{
g_actor.AttachHFSM("key");
}
}
functionInitActor(name)
{
varactor;
varlist=world.GetActorList(name);
for(actor=list.First();actor!
=nil;actor=list.Next())
{
actor.GotoHomeConfig(TRUE);
varG=actor.GetRootNode().GetGlobalTransform();
G.Identity();
actor.GetRootNode().SetGlobalTransform(G);
returnactor;
}
}
(准备场景 见图18)
在这里我们用了一个嵌套函数InitActor,这个函数的主要作用是初始角色的位置,在这里我们用它初始化地面。
我们还调用了一个新的函数类DrvDynamics,这个类负责对整个动力学系统进行设置。
在“key”内,我们建立一个行为激发,DM_KEYBOARD_KEYDOWN是转化的激发条件,我们按下键盘任意一键,角色的行为就会转化到下一个节点所定义的行为
(见图19)
绿色代表初始节点,初始节点的代码如下:
useconstants"drive_constants";
{
AddFlockActor(actor,"walk",90,0);
}
一个简单的行走动画
在expo节点内加入爆炸的代码:
useconstants"drive_constants";
{
world.DestroyActivities(actor);
varG=actor.GetRootNode().GetGlobalTransform();
G.position.y=1;
actor.GetRootNode().SetGlobalTransform(G);
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)