Maya教程-群组动画实现思路探讨
作者:网友整理Autodesk mayav1.4 88.36M / 简体中文
点击下载玛雅maya最新网站地址1.1.71.5.7 38.95M / 简体中文
点击下载Maya影视安卓版(影音资源播放平台) v1.4 手机版 26.48M / 简体中文
点击下载伴随着影视制作软硬件技术的不断发展,群组动画作为一个新兴的技术领域,这种技术可以模拟众多角色的运动,在降低拍摄成本的同时,真实的再现了壮观的场面。群组动画从技术的角度分为后期合成的群组动画和全三维角色的群组动画,早在70年代,好莱坞的导演们就开始试图表现这些大场面,那时的技术还不是很完善,对于群组动画主要使用的是抠像,合成,拷贝的方法,对于镜头和导演意图的表现都有很大的局限性。如《宾虚》等影片。在1992年,《蝙蝠侠回归》首先使用了三维的群组动画,影片《阿甘正传》中的反越战大规模示威也是如此。而如今,当我们看到《指环王》、《星战》、《I robot》、《亚历山大》、《最后的武士》等影片时,我们发现群组动画已经成为大场面表现的标志之一,而且使用也越来越灵活,越来越复杂,场面也越来越壮观,对于剧情的推动起到了更好的作用。如图1-1所示
后期群组动画和三维群组动画有着不同的表现效果,后期合成群组动画主要使用在中景,全景,由于其中的演员都是由真人扮演, 场面的真实性很高,特别是有时拍摄小全景时,还能清晰的看见演员的表演,场面真实感人.三维群组动画主要使用在表现千军万马奔腾厮杀的大全景和航拍镜头中,场面宏伟震撼,激动人心,在带给观众激烈的视觉感观刺激时将影片推向高潮,并给观众留下深刻难忘的印象。
由于群组的素材主要来自现场实拍,对前期拍摄的要求就比较高,,摄像机必须架设在三角架上,将摄像机锁死,固定机位,同机位多次拍摄素材,后期制作时将演员抠出来,最终合成。我们以前多部影视剧中都有应用。如图1-2所示。
三维角色的群组动画相对于后期群组动画有更大的***度和发挥空间,然而实现就要相对复杂的多,纵观三维群组动画的发展,主要可以分为两大类:
1、 智能类(基于节点控制,可选择行为的)或说是AI类
这一类的制作是基于节点控制、选择的,也就是说在某种情况下,选择某种行为。这种方式类似于人的基本活动,所以也就被现在很多的影片采用。它可以实现角色在复杂地面的行走,而不会产生滑步,而且可以使角色具备动力学的特性,可以开发战斗,寻找,混合等多种复杂行为。由于这种制作方式是通过节点激活行为的方式来实现的,也就为事件制作的深度和广度提供了可能。现在国际使用的这类商业制作软件主要有以下几种:Massive、Behavior和Aitool,但是这类制作有一定的难度,不但要有一定的编程技巧,还要能很好的规划角色的行为流程。如图1-3所示。
2、 非智能类(基于图像或动作序列的)
非智能类的群组动画,制作难度相对较低,如果体现千军万马的效果,每个角色在画面中所占的相对像素就会小很多,利用流行的三维软件的粒子系统,配合表达式的控制一样能够实现从简单到复杂的群组动画,其主要是以粒子序列的形势表现,主要有SpriteParticle(序列粒子),InstanceParticle(实物粒子)两大类。这类群组制作的优点就是难度较低,对于单体细节要求不高、行为可以很好的完成,如简单飞鸟,人物行走等。虽然其行为的是基于序列的,默认情况下决定了行为的单一性。但是我们可以通过简单的表达式来控制,使其富有变化,甚至按照我们的意愿行动。
下面我们就SpriteParticle(序列粒子),InstanceParticle(实物粒子)两种粒子类型为例,分析他们的优缺点和复杂动作的实现。
1) SpriteParticle(序列粒子)的利用硬件渲染,渲染速度非常快,只是前期的贴图序列的制作比较繁琐。如果是定机位或垂直于人物运动的方向推进,在场景中还要有近中远角度的变化。在对单体取景的角度就要根据近远的层次,分别去不同的角度序列。如图1-4所示
2)我们这里做个小的测试利用摄像机与地面和每个角色粒子的夹角的变化,自动调用相应角度的序列。应用于定机位和垂直于人物运动的方向的推拉镜头。
(1)首先创建一个NURBS平面,用比刷稍微刷一下,利用平面发射例子;并将粒子goal在表面上。如图1-5所示。
(2)选择粒子,把粒子类型转为sprite,并执行Particles>Sprite Wizard,为sprite粒子再入序列桢贴图。如图1-6所示
[page]
(2)把我们利用五个摄像机渲染的走步动作序列串成一个序列,这里走步是25桢一个循环,按照一定的顺序,这里我们是按照角度由大到小的顺序,即第一段循环0-24,第二段,25-49,第三段50-74….以此类推,五个摄像机总的序列是0—124。如图1-7所示
(3)然后就对粒子的运动和序列桢调用情况进行控制。这里我们主要测试序列桢的分别调用,运动没做过多的控制,只是让他们随机的左右移动。自定义一批控制属性,把sprite的一些需要的隐藏属性调出来。如图1-8所示
4)我们计算的原理是这样的,创建两个Locator,分别点约束与目标摄像机的摄像机位置和目标位置。利用两个Locator的连线计算摄像机与水平方向的夹角,然后再计算摄像机与每个粒子的连线与水平方向的夹角。两个夹角的差值就是每个粒子于画面中心的夹角,把这个夹角的范围分为五份分别调入五个不同角度序列。如图1-9
(5) 表达式如下:
Create expression(创建表达式)
//赋予离子生命值
particleShape1.lifespanPP=20;
//粒子生成后在nurbs表面随机分布
particleShape1.goalV=particleShape1.parentV;
particleShape1.goalU=particleShape1.parentU;
//赋予粒子大小随机值
particleShape1.spriteScaleYPP=rand(3.1,3.5);
//将粒子随即分为两部分,一部分向左走,一部分向右走
particleShape1.Rand=rand(-1,1);
//一部分向右走,横向缩放值等与纵向缩放值
if(particleShape1.Rand<0)
particleShape1.spriteScaleXPP=particleShape1.spriteScaleYPP;
//一部分向左走,当然走的姿势相应要镜像过来。
else
particleShape1.spriteScaleXPP=particleShape1.spriteScaleYPP*-1;
//面片整体偏移到地面之上,偏移量就是Y轴放缩的1/2。
particleShape1.goalOffset=<<0,particleShape1.spriteScaleYPP/2,0>>;
//随即载入步伐循环的任意一个姿势
particleShape1.orig=rand(24);
//获取摄像机那边的Locator的世界坐标值
Runtime expression:(运行表达式)
//粒子如果移动到nurbs平面的边缘,就消失掉。
if(particleShape1.goalU>0.98||particleShape1.goalU<0.02||particleShape1.goalV>0.98||particleShape1.goalV<0.02)
particleShape1.lifespanPP=0;
//粒子在表面的移动速度,可以修改0.002这个数值来调整移动的快慢
particleShape1.goalU+=0.002*particleShape1.Rand;
//贴图序列向前走
particleShape1.orig+=1;
//每到25的倍数桢就循环到0桢
particleShape1.orig%=25;
//以下部分为创建表达式与运行表达式都有的部分
vector $CL=<<CL.translateX,CL.translateY,CL.translateZ>>;
//获取摄像机目标点的Locator的世界坐标值
vector $AL=<<AL.translateX,AL.translateY,AL.translateZ>>;
//获取每个粒子的世界坐标值
vector $Pw=particleShape1.worldPosition;
//算出摄像机与目标点连线与Z轴的夹角
float $anglec=angle(<<0,0,1>>,($CL-$AL));
//算出摄像机与每个粒子连线与Z轴的夹角
float $anglep=angle(<<0,0,1>>,($CL-$Pw));
//获得这个夹角的差值,并将这个范围在-15—15度(测试得到)之间分为五份(0-4)
particleShape1.cyclenum=4*linstep(-15,15,rad_to_deg($anglec-$anglep));
//获得这个范围Id的整数部分。
int $num=trunc(particleShape1.cyclenum);
//根据这五部分的0-4,分别载入整个序列分为的五部分
switch($num)
{case 0:
//载入序列的第一部分
particleShape1.spriteNumPP=particleShape1.orig;
break;
case 1:
//载入序列的第二部分,与当前第一部分序列向后偏移25桢
particleShape1.spriteNumPP=particleShape1.orig+25;
break;
case 2:
//载入序列的第二部分,与当前第一部分序列向后偏移50桢
particleShape1.spriteNumPP=particleShape1.orig+50;
break;
case 3:
//载入序列的第二部分,与当前第一部分序列向后偏移75桢
particleShape1.spriteNumPP=particleShape1.orig+75;
break;
case 4:
//载入序列的第二部分,与当前第一部分序列向后偏移100桢
particleShape1.spriteNumPP=particleShape1.orig+100;
break;}
(6) 最终我们要实现的效果如图1-11所示,粒子所带数字为每套序列的ID号,即cyclenum得值。
(8)这是对此方法的初次尝试,有什么不足的地方,或者更加完善的思路与方法,还望各位多多指教。下一部分我们再来测试一下InstanceParticle(实物粒子)的动作控制,Instance肯定不会有什么角度透视的问题,控制***度会更大,我们将测试几个不同动作之间的切换,以及配合当前动作,如何影响粒子在表面的移动速度。
加载全部内容