XSI群组动画解析及实例应用.docx

上传人:b****4 文档编号:3443202 上传时间:2022-11-23 格式:DOCX 页数:14 大小:281.72KB
下载 相关 举报
XSI群组动画解析及实例应用.docx_第1页
第1页 / 共14页
XSI群组动画解析及实例应用.docx_第2页
第2页 / 共14页
XSI群组动画解析及实例应用.docx_第3页
第3页 / 共14页
XSI群组动画解析及实例应用.docx_第4页
第4页 / 共14页
XSI群组动画解析及实例应用.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

XSI群组动画解析及实例应用.docx

《XSI群组动画解析及实例应用.docx》由会员分享,可在线阅读,更多相关《XSI群组动画解析及实例应用.docx(14页珍藏版)》请在冰豆网上搜索。

XSI群组动画解析及实例应用.docx

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)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1