为什么不直接用游戏引擎来文化打造内生引擎动画片动漫

自己写游戏引擎(05)人物动画系统 -
技术文档(Document)
作者:xjyhust& 来自:
自己写游戏引擎(05) ―― 人物动画系统
  我最近在学习人物动画的方面,做个总结,由于刚刚接触这个方面,所以有什么问题请大家指出。
在这篇日志里面,你可以获得这些信息:
1 人物动画的框架
2 骨骼动画及蒙皮技术
3 doom 3和quake 4中模型和动画格式md5及原理
4 可能的扩展
先来看一下人物动画的几种方法:
一、简单关键祯的动画
  像quake3中就是用的这样的方法。这种方法最简单,缺点就是空间上的浪费。由于每个关键祯中都要储存整个网格的几何信息,所以用这种方法生成的动画文件相当的庞大,在游戏进行中也会占用大量的内存。现在的游戏,一般都不用了。
二、简单的骨骼动画及蒙皮技术
  现在的很多游戏,都是用的这种方法,具体的原理后面再解释。这种方法可以节省大量的空间,对于美工来说,工作量也相对较小(可以利用动作捕捉的数据),真实性方面,简单的应用中也表现得比较好。
三、改进的蒙皮方法和基于物理的骨骼动画
  改进的蒙皮方法可以避免简单的蒙皮中产生的“糖纸失真现象”;
  基于物理的骨骼动画,已经有很多的游戏、物理引擎支持这一特性了,但是还有很多的技术问题需要处理。这是次时代游戏引擎必须很好实现技术之一。
基本的蒙皮原理
拿md5格式为例,来简单的解释一下蒙皮的原理。在doom3和quake4中md5mesh文件,用来记录一个人物的静态模型。有这样几个结构:
Joint: 用来记录骨骼的关节的信息;
Weight: 用来记录顶点相对于关节的权值;
Vertex: 顶点信息,和一般的顶点不同,这里的顶点不直接的包含几何坐标信息,而是记录了对应的Weight;
现在就来解释一下这三者之间的关系:
  Joint(关节)是会动的,而皮肤上的顶点是会随着顶点做相应的运动。我们保持皮肤上面的各个顶点和它相对应的关节的“位置关系”,就可以通过旋转关节,使得真个皮肤跟着旋转。这个“位置关系”,就是Weight。在运动的过程中,我们获得当前的骨骼的几何信息,也就是每个关节的几何位置,然后在根据每个顶点对于这些关节的权值,分别计算每个顶点的实际几何位置,这样,整个人物网格就计算出来了。
  很显然,这其中有一个预处理过程和两个关键的步骤。预处理就是需要由静态的模型(美工做出的人物模型)和骨骼来计算得到一组Weight;两个关键的步骤是,1、获得的整个骨骼的几何信息(有可能从关键祯混合得到);2、由顶点对应的Weight来计算出每个顶点的实际几何信息。
  了解这些基本的概念,下面就来介绍人物动画系统的框架。
骨骼蒙皮基本框架
基本的类型:
关节信息:
typedef struct _CharJoint
&&& Vector3
Vector4 startP
int parentID;
char name[32];
其中,parentID为父关节,pos为对应父关节的偏移值,startPoint为旋转角度;
权值信息:
typedef struct _CharWeight
int jointID;
其中,pos为偏移量,jiontID为对应的joint,bias偏向值;
顶点信息:
typedef struct _CharVert
int startW
int weightC
  其中,startWeight为该顶点对应的Weight在Weight列表中的偏移地址,weightCount记录该顶点对应多少个权值;对于简单的顶点,比如头顶上的某个点,动画的时候涉及到的变化并不多,所以,对应的权值数也就少,可以只有一个;对于动画中涉及变化比较复杂的点,比如手肘区域的顶点,可能由较多的权值(4个或更多),这样才能够很好的表示运动中对于多个关节的相对位置。
大概还涉及到这样一些类:
CharSkeleton: 记录整个骨骼的信息,包含了关节的链表;
CharMesh: 记录整个人物模型的静态信息,包括顶点,权值,关节等;
CharBlender: 基类,根据CharMesh和CharSkeleton来计算出实际的网格,基本成员函数为Blender,用CPU来计算蒙皮,可以被子类Blend覆盖(比如可以写一个用Vertex
Shader实现的Blender);
CharAnimation: 每个CharAnimation实例对应一个动作序列,比如“人物蹲下动作”;动作序列保存的是人物骨骼动画的关键祯,也就是在某一祯时,骨骼中各个关节的几何信息;注意这里的祯的概念并不是平常说的渲染的祯,在动画中,为了进一步节省空间,一般设定了一个动作为几个格,就像动漫制作过程中的“故事板”,只是整个过程中的几个缩略图,在后期制作过程中,在“填满”中间缺省的图片;这里的骨骼动画关键祯也是如此,文件中只保存了间断的几个状态,在渲染的时候,还是要实时的生成中间的某个状态,来把整个动作序列“填满”;
CharAnimCtrl: 这个类的作用就是完成上面所说的,将动作序列“填满”的功能,输入是CharAnimation和时间,输出是一个基本的骨架,也就是CharSkeleton(当然这是靠传引用参数进行输出);
解决关键问题
  刚才提到了,整个系统中由三个关键的问题:一个预处理过程,关键祯混合以及从权值计算出实际顶点。预处理过程,基本上是编写一个建模工具导出插件的工作,这里就不讨论了。
关键祯混合:
  简单的办法,就是直接用线性的方法混合,比如现在的动画时间标识为40,而我只有标识为20和50的两个关键祯,于是:40-20 =
20,50-40 = 10;而20:10 =
2:1;所以,我们现在的状态离关键祯20的差异,以及离关键祯50的差异,这两个差异的比,就是2:1;好了,所以现在很自然地,我们取倒数,1:2;于是,我们做混合的时候,用“1份”关键祯20的骨骼,和“2份”50关键祯的骨骼,然后相加两者的结果(也就是“混合”过程)最后,除以3,得到最终的“1份”关键祯为40的骨骼。恩,就这么简单。(不过注意不要把这个比值的含义搞反了);
  际应用中还有其他的混合形式,后面再来介绍。
计算实际顶点:
我们看一下软件的(用CPU做蒙皮)Blend过程:
void CharBlender::Blend( Mesh &outputMesh, PE::CharMesh &inputMesh,
PE::CharSkeleton &inputSk )
if ( outputMesh.GetNumVertices() & inputMesh.GetNumVerts() )
CharOutVert *pOutVerts = ( CharOutVert* )outputMesh.LockVertexBuffer();
int numVerts = inputMesh.GetNumVerts();
int numTris = inputMesh.GetNumTris();
for ( int i = 0; i & numV i++ )
const CharVert *pVert = inputMesh.GetVertAt( i );
pOutVerts-&x = pOutVerts-&y = pOutVerts-&z = 0.0f;
/* u v initial */
pOutVerts-&u0 = pOutVerts-&u1 = pOutVerts-&u2 = pVert-&u;
pOutVerts-&v0 = pOutVerts-&v1 = pOutVerts-&v2 = pVert-&v;
for ( int j = 0; j & pVert-&weightC j++ )
&&&&&&&&&&&
const CharWeight *pWeight = inputMesh.GetWeightAt( pVert-&startWeight + j
&&&&&&&&&&&
int index = pWeight-&jointID;
&&&&&&&&&&&
const CharJoint *pJoint = & ( inputSk.GetJointAt( pWeight-&jointID ) );
&&&&&&&&&&&
&&&&&&&&&&&
Quat_rotatePoint( &pJoint-&startPoint.x, &pWeight-&pos.x, wv );
&&&&&&&&&&&
pOutVerts-&x += ( pJoint-&pos[0] + wv[0] ) * pWeight-&
&&&&&&&&&&&
pOutVerts-&y += ( pJoint-&pos[1] + wv[1] ) * pWeight-&
&&&&&&&&&&&
pOutVerts-&z += ( pJoint-&pos[2] + wv[2] ) * pWeight-&
outputMesh.UnlockVertexBuffer();
CharTri *pOutTri = ( CharTri* )outputMesh.LockIndexBuffer();
for ( int i = 0; i & numT i++ )
const CharTri *pTri = inputMesh.GetTriAt( i );
pOutTri-&index[0] = pTri-&index[0];
pOutTri-&index[1] = pTri-&index[1];
pOutTri-&index[2] = pTri-&index[2];
outputMesh.UnlockIndexBuffer();
其中黑体的部分,就是关键的代码,应该很容易看懂。其中,Quat_rotatePoint函数的作用就是将点进行旋转,得到新的坐标。
关于md5anim文件
  Doom3和Quake4中的动画文件都是用md5anim文件保存的。md5anim文件只含有该动作所涉及到的骨骼关节的动画信息。也就是所,文件中关键祯的关节列表,是它所对应的md5mesh文件中基本关节列表的一个子集;这样做当然是有道理的,因为,有些动作,可能只涉及到身体的一个部分,比如眨眼,换弹夹等等,那么,把一个完整的骨骼框架放在mesh文件中,把若干不同的局部或者整体的关节序列放在不同的动画文件中,这样,可以最大限度的节省空间。
可能的扩展
一、复杂动作的混合
  有时候,我们需要将两个动作混合,比如,一个人物同时的在做两种动作,一边向左平移,一边向右方开枪;不可能为每种可能的混合动作做大量的美工工作,而且空间上,我们也不允许这样做;可行的办法是,混合两个不同的动作序列,比如上半身动作和下半身动作的混合,这当然是最简单的方式。还有很多比较麻烦的混合方式,比如,人物在行走时中了枪,需要混合“行走”和“中枪”两个动作,而简单的线性混合是无法真实模拟的。
二、基于物理的动画
  这不再仅是图形方面的问题了,这其中涉及到了大量的物理模型,这个,我也不懂。。。可以从第三方的物理引擎获得帮助,ODE好像就支持了;
三、基于GPU的蒙皮
  原理和CPU蒙皮的原理一致,只是用了Shader,会比CPU蒙皮的效率快很多。在前面的代码中,只需实现CharBlender的子类就可以了。
四、非常流行的“换装”系统
  这在RPG游戏里面简直就是不可少的一条。就现在的框架来说,还不能达到随意“换装”的要求。修改CharMesh以及Character的底层,需要能够添加和删除基本的骨架,支持多层皮肤(衣服)(多个Mesh的开关)。还可以更换不同的武器(底层实现还是通过添加骨架完成)。。。
本站中所有文章以及图形均为作者本人、公司所有,本站所有资讯仅供参考,若有任何损失本站概不负责,请自行斟酌。
Copyright &
游戏开发资源网() All Rights reserved.开源的动画引擎和培训学校是否会影响创作的未来?--百度百家
开源的动画引擎和培训学校是否会影响创作的未来?
分享到微信朋友圈
游戏引擎Unity首次被用于渲染动画电影,吉卜力工作室动画制作软件OpenToonz开放下载,微软与世界顶尖大学的联合研究制作互动系统,角川集团创办高中,开源的动画引擎和培训学校是否会影响创作的未来?
文/三文娱(微信公号:hi3wyu)
4月8日,日本世嘉旗下子公司Marza动画星球发布了通过Unity游戏引擎渲染的动画短片《The Gift》。
尽管不是第一部使用游戏引擎渲染的动画短片,但《The Gift》仍然具有一定的重要意义。
Unity 原本是用于创建三维视频游戏、建筑可视化等类型的创作工具,在此之前大量被用于游戏开发。《The Gift》的出现代表着为使用Unity和Unreal的游戏制作团队们带来了更多的机会,使得往动画行业中引进游戏人才成为可能。
虽然游戏引擎制作动画的效果目前还及不上专业动画软件,但Unity和Unreal这样的游戏引擎拥有更多的使用者,相应的软件发展速度也会很快,也许在将来会成为动画制作软件的主流。而MARZA继续加强与Unity的合作和开发,并将生产VR电影的消息似乎也正验证了这一点。
近些年来,除了主流软件厂商和大型动画公司,而像Unity这样原本处在其他领域,也开始逐步涉足这个领域,基于各自不同的出发点,为用户提供开源或者开发动画制作引擎。
那么开源的动画引擎会对动画制作的未来带来什么影响?有哪些公司选择了将自家软件开源或开放新的软件?除此之外又有哪些对未来的投资方式?
吉卜力工作室使用的动画制作软件OpenToonz开放下载
同为世界动画行业标杆的吉卜力动画工作室使用的动画制作软件Toonz的开源版本OpenToonz从3月26日(日本时间)起正式开放免费下载。
OpenToonz官方下载链接:https://opentoonz.github.io/e/index.html
除了基础软件包,同时开放的还有处理照明和畸变效应等图像效果的开发工具包和由吉卜力工作室开发的可以高效扫描图纸的插件。
OpenToonz,是日本IT企业DWANGO收购了意大利软件公司Digital Video连带它的动画制作软件Toonz,将其改良得到的开源型软件。根据DWANGO与Digital Video达成的协议,Digital Video还将提供Toonz的软件调试、安装、配置、培训和定制服务。而这款名为Toonz的软件最大的用户正是吉卜力工作室。
早在1995年制作动画《幽灵公主》时,吉卜力动画工作室就开始使用Toonz,并在Toonz的基础上根据自身需求定制了Toonz Ghibli Edition。从动画《借东西的小人阿莉埃蒂》开始,吉卜力动画工作室制作动画的数字化流程,如动画润色、色彩指定等大多是由这款软件完成的。
OpenToonz官网的图片
随着开源软件OpenToonz的发行,许多动画师对其产生了浓厚的兴趣。仅在宣布开放下载的一天之内,相关用户论坛上就已经拥有数百个关于如何深入使用软件的讨论。
Toonz研发商认为,为动画师们提供一个开源动画平台或许可以成为一个新的支撑开源商业模式的出发点。Dwango也希望通过OpenToonz构建一个平台来链接学术研究和一线动画制作。OpenToonz的出现也许会改变未来的动画的生产制作模式,使更多的人加入到动画制作中,生产出更多的作品。而这也正是Toonz的制造商和吉卜力工作室所想要看到的。
更多的公司开始涉足动画制作软件领域
随着迪士尼这样的动画制作公司开放自家动画软件,再加上近些年来软件业竞争的加剧,迫使像Adobe这样开发付费软件的老牌软件公司不得不开始采用免费或者改变产品模式。
Adobe公司在去年底宣布,Flash Professional的新版本将更名为Animate CC,为通过HTML5和SVG产生动画效果提供了另一种选择。一方面是受到了HTML5对于Flash使用的影响,一方面也是受到像OpenToonz这样的开源动画制作软件的冲击而不得不对自己的产品做出改变。
微软公司则与香港大学和东京大学的联合研究并推出了互动系统“Autocomplete hand-drawn animations”,这个系统可以预测制作者们想要画出的框架或线条,填充复制颜色,以此来简化动画制作过程。
就连社交网站Facebook也在2014年公开了其新闻发布类应用Paper的动画引擎Pop。Pop是一个在iOS与OS X上通用的极具扩展性的动画引擎。Paper应用中的所有动画和效果都出自Pop。
对于一般制作者和中小型制作团队而言,没有像迪士尼和吉卜力这样的财力和资源,无法进行大规模的前期开发和投入。因此诸如“Autocomplete hand-drawn animations”这样的数字动画工具的开发和进步,也使得他们拥有了更多创作可能。而这些创作可能,也恰恰是业界巨头们所关注的重点,毕竟创作代表了未来。
动画公司开办动画培训学校对创作的未来进行投资
除了技术层面的动画制作软件的开发和开源,开办培训学校也是制作公司们对创作未来的另外一种投资。
动画公司对制作者的培养和发掘,比较成功的模式当属迪士尼创办的加州艺术学院,这所学院培养了许多的迪士尼和皮克斯的动画制作师和导演。
除此之外,皮克斯还联手了Khan Academy,创建在线课堂Pixar in a Box,提供免费的小型讲座和在线活动。课程分为六个部分,每个部分都有一系列的简短视频,讲解数学在皮克斯电影中的实际应用案例,并教授用户利用程序进行实际操作。
而日本角川集团则选择在国内开设网络高中,新高中名为“N高等学校”。除了日常科目,N高等学校预计邀请小说、游戏、动画、游戏等领域的专业人士,如创作过《刀剑神域》的川原砾等人来担任讲师,让学生可以在喜欢的时间选择喜欢的课程。与此同时,角川集团还在台湾创办了角川国际动画教育来进行海外动画、漫画制作人员的培养和发掘。
东京会场的学生佩戴VR远程参加在冲绳的“N高等学校”的开学典礼
对于这些制作公司们来说,创办学校、开放旗下动画引擎还是制作新的动画软件,都是对创作的未来进行投资。那么究竟哪一种方式才是有效的对未来投资?哪一种方式才称得上是成功的模式?三文娱将对这一话题将保持持续的关注。
新文化、新娱乐、新内容,做有趣味有营养有梦想的分析与报道,三文娱是聚焦二次元与文化娱乐创意人的产业新媒体,微信公众号hi3wyu。
阅读:1514
分享到微信朋友圈
在手机阅读、分享本文
还可以输入250个字
推荐文章RECOMMEND
阅读:2109
阅读:1117
热门文章HOT NEWS
HMD公司推出的这款所谓专为中国市场打造的诺基亚6这款产品,除...
老冀说科技
百度新闻客户端
百度新闻客户端
百度新闻客户端
扫描二维码下载
订阅 "百家" 频道
观看更多百家精彩新闻Unity引擎可以渲染动画了,或可实现影像直接转VR
在4月11日的Unity开发者大会上,总部位于日本的Marza动画星球公司以一则名为The Gift的动画短片演示了公司如何使用Unity引擎渲染动画。他们的演讲相当受欢迎,场内爆满,还有一大批开发者被拒之门外,Unity官方工作人员连呼“日本人的场爆掉了!”,不得已,Marza不得不临时加场,讲了第二次。Marza是全球首家使用Unity游戏引擎渲染动画的公司,之前4月8日,公司发布The Gift动画短片的时候,就被业界称为“革命性消息”。没错,The Gift的诞生代表了游戏引擎向动画、影像领域的拓展,对这两大行业具有颠覆性的意义;在会后的采访中,Marza公司道出了更酷炫的可能性:利用Unity的动画渲染能力,再结合Unity的VR技术,在未来实现将影像直接转成VR的场景。据Marza公司高层介绍,用游戏引擎制作动画,因为使用的是即时渲染,不是预渲染,动画制作时间大大缩短。现阶段可以缩短25%的制作时间,随着游戏引擎功能的增强,未来可能只需要普通渲染的千分之一。制作水平上,目前还不能追平好莱坞的水准,一是因为这种做法还在初期阶段,The Gift也不是全部用的即时渲染,只在后期用Unity渲染,所以只能称为半即时;二是游戏引擎目前的渲染能力还没法和好莱坞相比。其制作负责人今村理人坦言:游戏引擎更迭速度非常快,追平好莱坞可以实现,但不知道到什么时候。Marza社长前田雅尚表示:用游戏引擎制作动画,时间和成本的节约是一方面;更重要的一点是VR,只有游戏引擎适合做VR,Marza想要实现的是通过游戏引擎做动画,然后直接转到 VR上,就是动画也做VR也做。现阶段,如果VR的FPS(每秒传输帧数)没有达到75、85或接下来的120的话,头转动的时候会有眩晕;而且The Gift目前使用是Alembic格式(用于三维模型交换的开放式格式,被电影特效或专业人员使用)而不是FBX格式(2D或3D图形保存的中间格式,为3D游戏常用)。因此,前田雅尚直言:目前直接将动画转为VR还比较困难。但随着Unity在VR技术上的优化,就算Marza不怎么去研究,未来这也一定可以实现。到那时候,真正决定胜负的关键就在于有魅力的动画表现和Storytelling(故事情节)。内容方面,凭借日本发达的动漫产业和庞大的动漫储量,Marza如虎添翼,前田雅尚表示Marza和日本很多的动漫出版公司都有合作,将知名日漫做成VR非常有可能。在大家都热衷于用VR做游戏、视频和应用的当下,Marza提供了一种新思路:用VR做动画。Marza雄心勃勃,今村理人自信地表示:随着Unity引擎功能的增强,再过几年,我们一定能做出非常好的VR影视片段;到那时候,我想以我们累积的经验和技术,会在VR影像和动画方面成为全球知名的厂商。另一方面,Unity公司也乐闻其见,Marza是世嘉飒美的子公司,本身对游戏引擎非常熟悉,在他们刚开始探索这一领域的时候就得到了Unity日本的大力支持。以下是The Gift的短片视频:
【本篇文章由游戏茶馆gouling原创,如需转载请注明出处】
关注微信公众号,了解最新精彩内容
关注全球移动游戏产业手机游戏行业媒体与服务平台
需求目标:
找发行商..
游戏类型:
iOS,Android
需求目标:
找发行商..
游戏类型:
iOS,Android
需求目标:
找发行商..
游戏类型:
iOS,Android
需求目标:
找发行商..
游戏类型:
iOS,Android,IOS越狱,WindowsPhone
需求目标:
找发行商..
游戏类型:
iOS,Android,IOS越狱
Copyright (C)
游戏茶馆网 All Rights Reserved4074人阅读
Unity Animation(1)
Unity3d动画脚本&Animation&Scripting(深入了解游戏引擎中的动画处理原理)
( 13:12:16)
也许这一篇文章的内容有点枯燥,但我要说的是如果你想深入的了解游戏引擎是如何处理动画片断或者素材并
让玩家操控的角色动起来栩栩如生,那么这(当然我仅仅是翻译了一下)
动画脚本&Animation
Unity's&动画系统允许你创建一个漂亮的动画蒙皮角色.&动画系统支持动画融合,混合,添加动画,步调周期时间同步.动画层.控制动画回放的所有方面(时间,速度,混合权重)&每个顶点有1.2.4个骨骼影响的mesh,基于物理系统的布娃娃系统,另外还有程序动画.为了获得最佳效果推荐您在制作模型和动画绑定前阅读一下&&章节.
制作一个动画角色主要包括两个方面;&在世界中移动&和&由此产生的动画.&如果你想了解角色移动相关的更多内容,&请参阅.&&&实际上角色动画是由Unity's&脚本界面完成的&.
你可以下载&&中预设置好的动画角色.&当你学完本页的基础部分你还可以看一看&.
&如果需要你可以点击并快速转到以下主题:
·&&&&&动画融合
·&&&&&&&动画层
·&&&&&&&&动画混合
·&&&&&&&附加动画
·&&&&&程序动画
·&&&&动画重放和取样
Blending&动画融合
在现今的游戏中Animation
Blending是一项保证游戏动画顺畅过渡的基本的特性.动画师创建的动画例如:&walk循环,
run&循环, idle原地空闲动画&或射击动画.在游戏的任何时间点你都有可能从空闲站立转换到走动,反之亦然.&当然你不希望两个不同的动作之间突然跳转,&你需要动画平滑过渡.
而这个问题的解决就依赖动画融合技术.&在Unity中你可以让同一个角色拥有任意数量的动画.所有这些动画融合添加成为一个总的动画.
首先我们来为一个角色添加两个动画原地空闲站立和走动并平滑的使这两个动画过渡.&为了使我们在写脚本时简单些,&首先我们设置动画的&Wrap
Mode为&Loop.&然后关闭&Play
Automatically来让我们的脚本来独占动画的播放.
我们第一个动画脚本很简单;&我们需要一些方法来探查角色移动的有多快,&然后在走和站立之间淡入淡出.&在这个简单的测试中我们使用&pre-setup
input axes.
function Update () {
(Input.GetAxis(&Vertical&) & 0.2)
&&&&&&&animation.CrossFade
&&&&&&animation.CrossFade
下面我们来让这个脚本运行:
1.&创建一个js脚本&Assets-&Create
Other-&Javascript.
2.&把代码拷贝进去
3.&把脚本拖拽给角色&character
(It needs to be the same&GameObject&as
the animation)
点击Play&按钮,&当你按上下键时角色会走动,松开上下键时角色站立不动.
动画层Animation
层是一个非常有用的概念它可以让你将动画片段任意成组并且区分优先顺序.
在Unity's动画系统中,&你可以混合任意数量的动画片段.&你可以手工分配权重或者直接使用animation.CrossFade(),来自动分配权重.
混合权重混合权重总是在应用前被规格化&normalized
比如说我们现在有一个&walk
cycle&和一个run cycle,&权重都是1
(100%).当unity计算最终动画时会规格化权重,&这意味着&walk占50%&权重,&&&run
cycle占50%&权重.
这在大多数情况下都是不错的,&但当两个动画片段同时运行而其中一个权重明显大于另外一个.&那么你需要手动调整权重值,但如果你使用动画层来解决这个问题过程会容易得多.
制作动画层的范例Layering
例如现在你有一个射击动画,&一个空闲站立,一个走动循环&&.&你需要在走和站两个动作间持续的淡入淡出(在玩家走动速度的基础上)&但当玩家射击时我们只想展示射击动画.&因而射击动画此时的优先度最高.
为了达到这一目的最简单的方法是在射击时简单的保持&walk&和&idle动画.&接下来需要确定shoot
animation在一个比idle&和walk更高的层.&这意味着shoot
animation&将首先收到混合权重.&&&walk&和idle&只有在&shoot
animation不使用&100%&混合权重的情况下接收权重.&所以当&CrossFading
the shoot animation in,&权重将从0开始很短时间内到达&100%.&在开始阶段&walk&和idle&层将依然可以收到混合权重&但当&shoot
animation&完全切入时,&他们就收不到权重了.&&这才是我们需要的!
function Start () {
Set all animations to loop&设置所有动画为循环
&&&animation.wrapMode
= WrapMode.L
except shooting&除了射击(不循环)
&&&animation[&shoot&].wrapMode
= WrapMode.O
&&&//放置idle&和&walk&进低一级别的&layers&&(默认&layer&总是&0)
This will do two things这将作两件事情
-&当&calling CrossFade时,由于shoot&和&idle/walk&在不同的layers&中
&&&//&&&它们将不会影响互相之间的重放.
-&由于&shoot&在高一级的&layer,&当faded
in&时shoot动画将替换
&&&//&&&idle/walk&动画&.
&&&animation[&shoot&].layer
Stop animations that are already playing停止已经播放的动画
&&&//(万一&user&忘记的话,自动disable播放)
&&&animation.Stop();
function Update () {
Based on the key that is pressed,基于按下的键
play the walk animation or the idle animation播放走,站动画
(Mathf.Abs(Input.GetAxis(&Vertical&)) & 0.1)
&&&&&&animation.CrossFade(&walk&);
&&&&&&animation.CrossFade(&idle&);
(Input.GetButtonDown (&Fire1&))
&&&&&&animation.CrossFade(&shoot&);
默认情况下&animation.Play()&和&animation.CrossFade()&将停止或淡出在同一层里面的动画.&这是我们在绝大多数情况下需要的.&在我们shoot,
idle, run&范例中,&播放&idle&和&run&将不会影响到&shoot动画&反之亦然&(you
can change this behavior(行为) with an optional
parameter(任意参数) to animation.CrossFade if
you like).
动画混合Animation
动画混合可以让你缩减你必须为游戏制作的动画片断数量&,方法是制作只对身体某个部分起作用的动画.&这意味着这些动画可以和其他动画合并起来一起使用.
如果你想给一个动画添加&animation
mixing transform to an animation by calling&AddMixingTransform()&on
the given AnimationState.
混合范例Mixing
例如你可能有一个挥手(hand-waving)动画.&你可能需要让一个空闲站立(idle)角色或者一个走动(walking)角色&来挥手.&如果没有动画混合你可能需要制作两个挥手hand-waving动画&:&一个给&idle,&一个给walking.&可是,&如果你将挥手(hand-waving)动画作为一个mixing
transform&添加到shoulder transform,挥手动画将只控制肩膀.&身体余下部位不受其影响,&下半身会继续播放&idle&或者walk&动画.&因而你只需要一个挥手(hand-waving)动画.
/// Adds a mixing transform using a Transform variable
var shoulder : T
animation[&wave_hand&].AddMixingTransform(shoulder);
Another example using a path.
function Start () {
Adds a mixing transform using a path instead
mixTransform : Transform = transform.Find(&root/upper_body/left_shoulder&);
&&&animation[&wave_h和&].AddMixingTransform(mixTransform);
附加动画&Additive
Animations
附加动画和动画混合可以让你缩减为游戏制作的动画片断的数量,并且对面部动画(facial
animations)来说非常重要.
让我们来看看如果创建一个在跑和转身时身体可以自动倾斜的角色.
你已经制作好了一个&walk&和&run循环,&现在你还要制作一个走动左倾(
walk-lean-left),&走动右倾(walk-lean-right),&跑左倾(run-lean-left),&跑右倾(run-lean-right)动画.
这意味着你需要多做4个动画片断!&制作这么多数量的动画会累死人的.&而附加动画(Additive
animations)&和混合(Mixing)&可以大大减少这些工作量!
附加动画范例&Additive
Animation Example
附加动画允许你在顶层覆盖其他所有可能播放的动画的效果(
allow you to overlay the effects of animation on top of any others that may be playing).&当你制作一个附加动画时,
Unity将计算动画片断里的第一帧&(first
frame)和当前帧(current frame)的差异.&然后它将在所有其他播放的动画之上应用这个差异(Then
it will apply this difference on top of all other playing animations).
现在你只需要制作一个左倾(
lean-left)&和右倾( lean-right)动画.
Unity将为此倾斜动画新建一个层并置于walk, idle&或&run循环的层级之上.
下面是代码Here
is the code to make that happen:
private var leanLeft : AnimationS
private var leanRight : AnimationS
function Start () {
&&&leanLeft
= animation[&leanLeft&];
&&&leanRight
= animation[&leanRight&];
Put the leaning animation in a separate layer
So that other calls to CrossFade won't affect it.
&&&leanLeft.layer
&&&leanRight.layer
Set the lean animation to be additive&混合模式为附加
&&&leanLeft.blendMode
= AnimationBlendMode.A
&&&leanRight.blendMode
= AnimationBlendMode.A
Set the lean animation ClampForever
With ClampForever animations will not stop
automatically when reaching the end of the clip
&&&leanLeft.wrapMode
= WrapMode.ClampF
&&&leanRight.wrapMode
= WrapMode.ClampF
Enable the animation&和&fade it in completely
We don't use animation.Play here because we manually adjust the time
in the Update function.
Instead we just enable the animation&和&set
it to full weight
&&&leanRight.enabled
&&&leanLeft.enabled
&&&leanRight.weight
&&&leanLeft.weight
For testing just play &walk& animation&和&loop
&&&animation[&walk&].wrapMode
= WrapMode.L
&&&animation.Play(&walk&);
// Every frame just set the normalized time
// based on how much lean we want to apply
function Update () {
lean = Input.GetAxis(&Horizontal&);
normalizedTime is 0 at the first frame&和&1
at the last frame in the clip
&&&leanLeft.normalizedTime
&&&leanRight.normalizedTime
当使用附加动画时它会判断你同时也在播放一些其他的使用了附加动画的非附加动画(it
is critical that you are also playing some other non-additive animation on every transform that is also used in the additive animation),&否则动画将添加到最后一帧结果的顶部(animations
will add on top of the last frame's result).&这通常不是你所需要的&(This
is most certainly not what you want).
程序动画角色Procedurally
Animating Characters
有时你需要程序化的驱动你的角色骨骼.&例如你可能需要你的角色的头注视3d空间的某个点.&这个活最好让脚本来干.&幸运的是,
Unity做这个很容易.&在Unity&中所有骨骼来驱动蒙皮网格(skinned
mesh)的变换(Transforms).&因而你可以给角色的骨骼写脚本,就和其他GameObject一样.
很重要的一点是动画系统updates
the Transforms&是在Update()&function调用之后&&,LateUpdate()&function&调用之前.&因而如果你要调用&LookAt()&function&你应该do
that in&LateUpdate()&to make sure that you are really overriding the animation.
布娃娃系统Ragdolls&也是用同样的方法制作出来的.&你可以简单的把刚性物体(Rigidbodies),&角色关节(Character
Joints)&和&胶囊碰撞体(Capsule
Colliders)连接给不同的骨骼.&这样物理系统就可以作用于蒙皮角色(skinned
character).&(什么是布娃娃系统,当你在射击类游戏中打死对手时可以注意到当角色快接近地面时,他的四肢开始瘫软在地面上,这个不是动画师调出来的,而是布娃娃系统自动计算出来的。)
动画重放和取样Animation
Playback&和&Sampling
这一部分&将说明引擎如何在动画重放时取样.
动画片断制作时总是有一个特定的速率.&举例来说,&你可能在Max&或Maya
at&创建了一个帧速为&60 frames&每秒(fps)的动画.&当导入&Unity后,&输入模块将读取帧速,&所以导入的动画帧速还是60fps.
可是,&游戏运行时的速率是不断变化的.&有的电脑帧速快有的电脑帧速慢,&即使是同一台电脑前一秒和后一秒因为视角的不同帧速也不一样.&基本上当游戏开始运行时我们无法确定一个精确的帧速.&这意味着即使我们的动画片断制作时是&60
fps,&它重放时也许用的是另外一个速率,&例如&56.72
fps,&或&83.14 fps.&它可以变成任何一个速率.
Unity&对这些变化的速率取样,&不在于其制作时的速率.&幸运的是,3d电脑图形动画不是由分散的动画组成,&确切地说是由连续的曲线构成的.&这些曲线可以让我们在任何时间点取样;&而不是适配某一个原始帧的时间点.
I这也意味着如果游戏运行速率高于原始制作速率,&动作事实上看起来会更平滑流畅.
对绝大多数应用场合,&&Unity对变化帧速的采样我们无需对其进行干预.&可是,&如果你的某个游戏逻辑所依赖的动画变化或道具(transforms
or properties)结构十分特殊,&那你必须知道这一点.&&举例说,&如果你有一个动画是把一个物体30帧内从&0旋转到180度,&你想从代码中得知什么时候动画完成一半,&你不能写一段条件语言来检查现在旋转值是不是90度.&因为&Unity&依照游戏的变化速率来对动画采样,&它可能在旋转快到90度时进行采样,&或者是刚好过90度的时候采样.&如果你需要通报动画中一个特殊点到达时,你可以使用&&来替代.
同样需要注意的是变化的帧速采样结果,&一个使用WrapMode.Once&模式重放的动画的采样不一定是精确的最后一帧(
last frame).在游戏中很有可能是刚好结束前的某一帧,&在下一帧时间可能超过动画的长度,
so it is disabled&和&not sampled further.&如果你需要动画的最后一帧采样精确,你可以使用WrapMode.ClampForever.&如果是那样的话动画将不停的对最后一帧进行采样直到你自己停止动画.&
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:395627次
积分:3029
积分:3029
排名:第9152名
原创:42篇
转载:29篇
评论:63条
(15)(28)(1)(3)(5)(1)(3)(3)(4)(9)}

我要回帖

更多关于 文化打造内生引擎 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信