ImageVerifierCode 换一换
格式:DOCX , 页数:14 ,大小:281.72KB ,
资源ID:3443202      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3443202.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(XSI群组动画解析及实例应用.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

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

1、XSI群组动画解析及实例应用 XSI群组动画伴随着影视制作软硬件技术的不断发展,群组动画作为一个新兴的技术领域,越来越多的被人们所关注,这种技术可以模拟众多角色的运动,大场面的表现越来越真实,而使拍摄成本下降很多。早在70年代,好莱坞的导演们就开始试图表现这些大场面,那时的技术还不是很完善,对于群组动画主要使用的是抠像,合成,拷贝的方法,对于镜头和导演意图的表现都有很大的局限性。如宾虚等影片。在1992年,蝙蝠侠回归首先使用了三维的群组动画,影片阿甘正传中的反越战大规模示威也是如此。而如今,当我们看到指环王、星战、I robot、亚历山大、最后的武士等影片时,我们发现群组动画已经成为大场面表现

2、的标志之一,而且使用也越来越灵活,越来越复杂,场面也越来越壮观,对于剧情的推动起到了更好的作用。(韩国影片太极旗飘扬中群组动画的使用 见图1,图2) 纵观群组动画的发展,主要可以分为两大类1 非智能类(基于图像或动作序列的)非智能类的群组动画,制作难度较低,当以合成为主时,其主要是对单一或多个素材的拷贝来实现的;如果是以三维软件为主时,其主要是以粒子序列的形势表现的,主要有SpriteParticle(序列粒子),InstanceParticle(实物粒子)两大类,这类群组制作的优点就是难度较低,对于不太复杂的场景、行为可以很好的完成,如简单飞鸟,人物行走等。但是由于其行为的是基于序列的,这也

3、就决定了行为的单一性,如果遇到比如说碰撞物体、寻找行为或复杂路径等情况,这种制作方式就会显得力不从心。 (影片最后的武士对战争场面使用了这类的群组制作 见图3)2 智能类(基于节点控制,可选择行为的)或说是AI类这一类的制作是基于节点控制、选择的,也就是说在某种情况下,选择某种行为。这种方式类似于人的基本活动,所以也就被现在很多的影片采用。它可以实现角色在复杂地面的行走,而不会产生滑步,而且可以使角色具备动力学的特性,可以开发战斗,寻找,混合等多种复杂行为。由于这种制作方式是通过节点激活行为的方式来实现的,也就为事件制作的深度和广度提供了可能。但是这类制作有一定的难度,不但要有一定的编程技巧,

4、还要能很好的规划角色的行为流程。现在国际使用的这类商业制作软件主要有以下几种:Massive、Behavior和Aitool,接下来我们以Behavior来做一些实例分析(影片I ROBOT使用Massive制作了复杂的群组动画 见图4) Behavior是AVID公司出品的一个专门用于群组动画制作的软件,我们首先来了解一下这个软件的工作流程 (工作流程图 见图5) 这个软件要与SOFTIMAGE|XSI配合使用,首先在要在XSI中进行模型,动画及准备设定,之后通过DotXSI文件输入到BEHAVIOR中进行群组动画制作,完成后再通过DotXSI倒入XSI或直接使用MentalRay渲染。而在

5、BEHAVIOR内部的制作流程可参考下图 (BEHAVIOR内部工作流程图 见图6)在BEHAVIOR内部包含主代码设计、常数文件设计、节点设计、文件输出几大部分 (BEHAVIOR 界面 见图7) (动作捕捉现场 见图8、见图9)而对于原始的动作数据我们一般会采用MotionCapture的方式,这样可以节省大量的时间和人员我们先来看一下BEHAVIOR的基本例子1打开BEHAVIOR。2按F11或点击XsiViewer3用ImportXsiActor倒入在XSI内设置好的角色4用鼠标右键点击角色,你会看到角色预设置好的动画目录,这时随便点那个动画项目,角色就会运行该项目定义的行为 (见图1

6、0)5接着我们在Piccolo内创建一个简单的行为代码,代码的名字叫Startup.pcuse constants drive_constants; / 调用常数参数function main()/ 主程序 engine.RunScript(rtk, nil); /调用内核脚本 global var world = engine.GetCurrentWorld();/声明全局变量,确定内核脚本影响当前模型场景 var gold = Actor(Gold0);/将模型引入一个变量中,以便进行控制 var sa; /声明sa变量var sa = CreateSkillActivity(gold,

7、talk, 50);/用函数CreateSkillActivity为角色加入动画条目“talk”并使该行为每次开始延时50毫秒 sa.SetFlags(drvSKILLACTIVITY_LOOP); /将该行为循环使用 world.AddActivity(sa);/将该行为加入模型场景,给角色使用 (见图11) 通过上面这个简单的例子,我们可以看出BEHAVIOR内代码的基本组成,下面让我们再看几个简单实例来更好的了解群组动画的分类和制作1简单UnMotion动画。在这类动画中,角色不移动,只有原地行为,适合表现庆典,欢送的人群类的场景。首先,在BEHAVIOR内导入一个设置好的地面和角色,打

8、开XsiViewer,打开Populate表格,设定好参数后用鼠标在地面上绘制角色的Proxy。(见图12)接着用ActorParticles将Proxy转化为角色(见图13) 建立一个startup.pc文件,并输入以下代码: use constants drive_constants; function main() engine.RunScript(rtk, nil); global var world = engine.GetCurrentWorld(); var list = world.GetActorList(Female); var actor; for(actor = lis

9、t.First(); actor != nil; actor = list.Next() actor.AttachHFSM(key);在这段代码中,我们用一个循环语句将每个角色都给与一个HFSM(我们可以理解为行为编辑器),这个叫“key”的HFSM要在StateMachine中创建。接下来在这个HFSM中加入一个行为节点State_1并键入以下的代码:use constants drive_constants; var index = Math.Rand()%3; var sa; if(index = 0) sa = CreateSkillActivity(actor, happyA, 20

10、0); else if(index = 1) sa = CreateSkillActivity(actor, happyB, 200); else if(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)在这段代码中,我们使用条件语句对每

11、个角色的行为进行随机选择,并对错开每个角色动画的起始时间,下面我们就可以编译代码,检查动画了2Motion动画。在这类动画中角色根据以设定路径曲线方向,或目标点移动并避开障碍物。这类动画适合表现城市街景,军队的队伍,难民或繁忙人群的景象首先准备场景,准备完成后再加入一些障碍物,并用FlockGoal设置目标点(准备场景 见图16)在startup.pc内建入以下代码use constants drive_constants;function main() engine.RunScript(rtk, nil); var world = engine.GetCurrentWorld(); var

12、flock = new DrvFlock(0.4); SceneGoalFlock(flock); var list = world.GetActorList(Female); var actor; for(actor = list.First(); actor != nil; actor = list.Next() AddFlockActor(actor, walk, 90, 0); var i; for(i = 0; i flock.GetNumSceneGoals(world); i+) flock.EnableSceneGoals(world, i); 在这里,我们使用了一个FLOCK

13、的类,也就是把多个角色作为一个物体来考虑,并通过FlockGoal设置了行为的目标点,这样角色就会向目标点移动,并避开行进路径上的障碍物(避开障碍物移动 见图17)3Dynamic(动力学)动画。这类动画适合表现战争中的爆炸,灾难类的场面准备场景,然后在startup.pc内键入以下代码function main() engine.RunScript(rtk, nil); global var world = engine.GetCurrentWorld(); var gravity = new DrvVector(0,-98,0); var ERP = 0.2; global var g_d

14、yn = new DrvDynamics(gravity, ERP); var flock = new DrvFlock(0.4); SceneGoalFlock(flock); var g_actor,g_terrain = InitActor(Terrain); global var movable = FALSE; global var bounce = 0.5; global var friction = 0.5; var ma = new DrvDynamicsActivity(g_dyn, g_terrain, movable, bounce, friction); world.A

15、ddActivity(ma); var list = world.GetActorList(Male); for(g_actor = list.First(); g_actor != nil; g_actor = list.Next() g_actor.AttachHFSM(key); function InitActor(name) var actor; var list = world.GetActorList(name); for(actor = list.First(); actor != nil; actor = list.Next() actor.GotoHomeConfig(TR

16、UE); var G = actor.GetRootNode().GetGlobalTransform(); G.Identity(); actor.GetRootNode().SetGlobalTransform(G); return actor; (准备场景 见图18) 在这里我们用了一个嵌套函数InitActor,这个函数的主要作用是初始角色的位置,在这里我们用它初始化地面。我们还调用了一个新的函数类DrvDynamics,这个类负责对整个动力学系统进行设置。在“key”内,我们建立一个行为激发, DM_KEYBOARD_KEYDOWN是转化的激发条件,我们按下键盘任意一键,角色的行为就

17、会转化到下一个节点所定义的行为(见图19)绿色代表初始节点,初始节点的代码如下:use constants drive_constants; AddFlockActor(actor, walk, 90, 0); 一个简单的行走动画在expo节点内加入爆炸的代码:use constants drive_constants; world.DestroyActivities(actor); var G = actor.GetRootNode().GetGlobalTransform(); G.position.y=1; actor.GetRootNode().SetGlobalTransform(G

18、); movable = TRUE; var da = new DrvDynamicsActivity(g_dyn, actor, movable, bounce, friction); world.AddActivity(da); var root = actor.GetNodeByName(Spine); var src = new DrvVector(5,-3,93); var magnitude = 8; var depth = 3; ApplyImpulse(da, root, src, magnitude, depth);在这段代码中,我们定义了爆炸的位置,强度,范围,和角色所被影响的节点。当编译程序,角色移动到爆炸点时,按下键盘任意一键,角色会被炸飞并落到地面与地面发生碰撞,摩擦(见图20)以上这些就是群组动画的一些简单例子,其中一些点还可以有一些更复杂的应用。群组动画只是计算机三维动画的一个分支,还是需要与三维动画的其它部门进行密切的合作,比如模型的导入,导出,渲染时生成mi文件对于贴图、材质的调用,前期运动数据的采集和修改,都是需要考虑的环节。(骇客帝国中的群组动画是很多部门共同合作的结果 见图21)

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

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