前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >VR中的动画就是这么玩哒

VR中的动画就是这么玩哒

作者头像
腾讯移动品质中心TMQ
发布2018-02-08 11:20:00
1.4K0
发布2018-02-08 11:20:00
举报

导读

大家是不是觉得VR中的动画特别神奇,其实它是基于Unity中的动画系统Mecanim实现的,Unity在5.0之后,Mecanim动画控制越来越强大好用,小白甚至可以在稍微看下demo后,就可以构建自己的动画需求。本篇介绍通过Mecanim构建动画的整体流程,通过实例,对构建的各个部分进行介绍,其中穿插作者对部分参数或设置的理解。 好了,咱们愉快的开始吧。

文章中会涉及到一些常用术语,大家可以在“术语列表”中查看,其中涉及的主要术语有:视频片段Animation Clip阿凡达Avatar重定向Retargeting绑定Rigging蒙皮skinning动画组件Animator Component动画控制器Animator Controller动画层Animation Layer动画状态机Animation State Machine动画参数Animation Parameters

大家不用特意记忆这些术语,随着对动画系统的深入,许多术语自然就记住了。

动画基础内容

动画系统创建流程

⊙导入动画资源:导入外部动画资源或者unity创建的动画资源(这些动画资源保存在fbx格式文件中)。

⊙创建动画控制器:创建动画控制器,控制动作(通过状态机控制动画之间的切换)。

⊙导入外部人物模型:外部模型导入后和unity内部骨骼肌肉映射,之后生成avatar。

⊙资源关联:在动画组件中,关联动画控制器和avatar。

一、导入动画资源

此处的动画资源,是指动画片段,即animation chip,它一般包含在模型资源,即在fbx文件中。

Unity支持从外部导入和内部创建(或修改外部动画资源)两种方式导入动画资源,内部创建暂时不讲-较复杂,留待后续补充。

1.1unity支持模型格式

Unity 大部分动画资源都是在外部3D软件上创建的如3DMax,Maya等,支持的几种模型格式为fbx,obj,max,mb,blend,fbx为3D模型的通用格式,也是Unity建议使用的格式。

1.2Fbx文件内容

以下是一个导入的fbx动画资源的内容(包括骨骼结构,动画片段,动画avatar文件)

Ps:有的模型也会有网格mesh文件(后面会介绍到);有的不需要动画avatar文件(此时模型的avatarDefinition参数要设置为从外部获取avatar)。

1.3导入方式

导入方式很灵活,可以通过unitypackage一块导入多个fbx到asset目录下,可以直接把fbx文件复制粘贴到asset的目录下。

1.4资源获取

可以在assetstore中下载一些免费的动画资源,比如搜索defaultavatar,其中的Raw Mocap Data for Mecanim包括了很多基础的动画,用的同学可以下载下来:

当然,如果想要更好的一些资源,还是需要一些银子找些付费资源的。

让我们导入一些动画资源吧

现在,你已经可以导入构建自己的动画所需要的一些动画资源了。比如:idle(空闲状态的动画),walk(走动的动画),run(跑动的动画)。

重点掌握

小结:本部分,大家知道通过导入fbx文件,可以导入一些动画资源,这些动画资源是我们用来实现动画系统的重要组成部分。

二、创建动画控制器

动画控制器是个啥捏?通俗的讲,动画控制器就是把你的动画资源连接起来,你可以通过它控制系统什么时候(什么条件)播放你想要的动画(如:走,跑,跳等);他是一个单独的.controller文件,可以在asset中右键创建此文件Create》animation controller;他通过一个或多个状态机去控制动画之间的各种切换。

那我们来创建一个动画控制器吧

2.1创建一个control文件

2.2双击打开动画控制器文件

初始的动画控制器由以上部分组成:

1)Layers,动画层级,控制动画叠加,比如我们熟悉的CS中的角色动画,可以由上下两层组成,上层控制打枪动画,下层控制运动(走,跑,跳等)的动;Parameters,控制状态之间的切换,当参数满足某条件时,由一个状态跳转到另一个状态;它由四种类型float,bool,int,trigger组成。

2)初始创建会生成一个基础层。

3)在基础层中,anystate,代表任何状态;用法:比如,你想实现在任何状态下,按某个按键Key,都会跳转到特定状态,就可以使用它。

4)入口和出口,在状态机做为子状态机时,会用到;在使用anystate时一般也会用到这里的出口。

2.3动画添加到状态机中

通过拖动的方式,把之前添加的动画资源拖入到状态机中

1)你会发现拖入的第一个动画片段显示为黄色,并且有一条线从Entry连接到这个状态,这是什么捏?系统会把第一个拖动进入的动画片段设置为默认状态,就是动画播放时的初始状态,你可以通过在各状态上右键对默认状态进行修改。

2)是非默认状态,显示为灰色

3)你可以在这里修改各状态的名称

4)为状态机添加transition(状态转换)

可以通过在状态机上右键“Make transition”添加,以下为添加好状态转换及对状态修改名字后的状态机(可以从idle状态过度到walk状态,从walk状态过度到run状态,这很好理解,你总不能从站立状态直接达到跑的状态吧)

2.4添加参数

细心的同学应该发现,“哎,状态之间满足什么条件之后可以跳转到下一个状态捏,这里马上就讲!”下面为我们的状态机添加转换条件

1)点击parameter层,为状态机添加一个speed参数,默认参数值为0.0这个初始值可以自己设定,你想让你的初始状态是哪一个,就把speed值设置到触发他的状态上。

2)点击一个transition,可以在右侧看到相关参数设定,点击右侧标记的+号处,添加一个转换条件(当speed大于0.1时,转换到walk状态,这里可以根据实际效果进行调整)

3)同样的为其他状态添加状态转换条件,最后实现是:当speed大于0.5时进入到walk状态,大于0.8时进入run状态,小于0.8时,进入walk状态,小于0.1时进入idle状态。

Ps:上面有个has exit time参数,如果勾选,当满足某条件需要跳转时并不会马上跳转,只能等到当前正播放动画播放完之后,才可以跳转;不勾选,则直接可以跳转。

好了,一个简单的动画控制器就创建完成了,后面我们可以用他来控制动画了。

重点掌握

小结:动画控制器是由状态机构成的,可以把动画片段拖动到状态机中,做为状态机中的各种状态,通过为各种状态添加transition控制状态间的切换方向,通过为transition添加参数,控制状态转换的条件

三、导入外部人物模型

现在,是不是迫不及待的想把自己从网上下载的模型放到自己场景中了,让我们慢慢来。

下面这个资源是我在网上下载的一个动画模型fbx文件

大家有没有发现,相比第一部分导入的动画资源,多了什么东西?少了什么东西?

多的东西:相对之前导入的动画资源,多了一些Materials材质,多了一些贴图,fbx文件内多了一些mesh文件(这些多出来的东西就是针对每个模型特有的皮肤,好比张三和李四,内部的骨骼大概都是一样的,当然也可能不一样,但是外部的皮肤肯定是不一样的

少了东西:少了avatar文件

这个少的avatar文件就是导入模型内的骨骼和系统内部骨骼系统匹配后生成的文件

下面我们来生成一下avatar资源。

3.1选择中u_character_REF文件

在右边的inspector中可以看到对应参数

3.2设置Model部分

我们只关注以下参数即可

Scale Factor模型缩放 这里理论上都应该是1,也就是模型的原大小。但也有可能是0.1或者10之类的,跟你3DMax的单位设置有关,无论是几都可以,只要跟其他模型是统一的就OK(技巧,可以把模型拖到场景中,同时拖入一个3D cube,一般cube默认边长为1m,对比一下来调整模型的此处的参数)。

Mesh Compression网格压缩,用来降低模型的面数,这个一般都是选择关闭的,如果程序说,我们模型的面数太高了,要在这里进行压缩,揍他,然后叫做模型的同学想办法在3DMax里降低面数。

3.3设置Rig部分

Animation type 选择 Humanoid(人型),我们导入的模型是人型。

Avatar Definition 此处可以选择从自己或从外部引用,此处是为了生成自己的avatar,所以选择从自己生成。

Configure 点击可以对模型骨骼肌肉进行配置,配置ok,点击done后,这里会出现对勾,如果匹配不成功,会出现X,这时需要手动调整。

Optimize Game Object:简单点说,项目发布前,把这一项勾上。When turned on, the game object transform hierarchy of the imported character will be removed and stored in the Avatar and Animator component. The SkinnedMeshRenderers of the character will then directly use the Mecanim internal skeleton. This option improves the performance of the animated characters.You should turn it on for the final product. In optimized mode skinned mesh matrix extraction is also multithreaded.

这里进行骨骼映射,比较省力的方法是,直接apply,系统会自动把模型的骨骼肌肉和unity内部的肌肉映射,然后点击configure查看映射关系,如果有问题,再进行调整。

好了,我们已经点击了apply,configure这里也显示了对钩,如上,这时我们观察一下之前导入的模型文件,生成了一个avatar文件

3.4设置Animation部分

我们导入的模型资源中是没有animationchip

的,所以不用对其进行编辑。

重点掌握

小结:一般导入的动画资源,有Materials材质,有贴图,fbx文件内有mesh文件,才能把动画资源拖动到scene中(毕竟场景中的动画,怎么也要有皮吧);在Rig部分点击apply后,要到configure中进行检查,关联映射是否正常;

四、资源关联

来,我们掰手指算一下,我们导入了动画资源,做了动画控制器,生成了avatar;我们做了这么多东西,现在可以在场景中添加动画了吧;好的,让我们在场景中添加模型,增加动画吧,我们还是一步一步来:

4.1第一步

我们把已经添加的模型

U_Character_REF拖入到Hierarchy中,在Hierarchy中点击它,可以发现,模型中自带了一个Animator组建,如果没有也没关系,我们可以自己添加

4.2第二步

进行关联,如下图,把之前创建的动画控制文件和avatar文件关联到下面两个位置

注意,这里的Apply RootMotion 要勾选上,如果不勾选,动画自身发生的位置变化不会应用到场景中。好了,添加完这些之后,我们可以点击运行,天啊,动画没有动!为什么?为什么呢?好像我们忘记控制动画状之中的参数变化了

4.3第三步

添加脚本我们来创建一个脚本,脚本内容如下:

1获取动画组件

2通过方向键控制速度大小

3通过SetFloat设置 动画参数speed的大小,来实现控制动画状态机间的状态切换。

就是这么简单,添加完脚本之后,我们再运行下,神奇的事情发生了,我们的动画动起来了!哈哈。

重点掌握

小结:通过把avatar和动画控制器关联,来实现动画系统的重定向,大家可以想一下:假如我们有一个新角色新模型添加,我们只需要让这个模型和unity内部的骨骼进行关联生成avatar,然后把已经做好的动画控制器连同这个avatar一块用到模型上,就实现了动画控制的复用,多神奇的事情!

五、调整动画

上面的工作做完之后,我们可能会发现我们的动画运行的并不是那么好:比如,跑动的腿怎么是一边的,好像瘸了一样;动画为什么是陷到地面以下的;按上下键控制速度时,怎么这么慢啊,等等。。。

我想告诉大家的是,我们还远没有做完,我们还需要对动画参数进行调节,对代码中的逻辑设置进行调节,对动画切片中的动画进行整,这部分笔者暂时先不写了,以后会在后续文章上逐步对动画系统Mecanim的各部分进行讲解,大家记住,上面的工作做完后,还需要进行进一步调整

术语列表

Animation Clip视频片段:通常存在于fbx的文件中,也可以单独存在。用来构建动画状态机中的每个状态,我们也可以通过Unity内置的Animation插件对动画片段进行编辑。

Animation Curves动画曲线:我们可以通过把曲线附加到动画片段上,通过曲线上对应的数值控制动画片段所对应的对象的某些参数,最终达到控制动画片段的效果。

举个例子,有一个向前跳跃的动画,要穿过一堵墙上的小孔,我们可以这么实现:先为这个动画片段加入动画曲线;然后,在动画跳跃起来后,设置动画的碰撞体大小为很小或0;最后,在穿墙过后,或者说动画播放过后,碰撞体大小再进行恢复。

Avatar Maskavatar蒙板:在动画状态机中用于不同的层进行动画合成,控制显示或不显示动画模型的某些部分(如,我可以设计只显示手臂)。

Avatar阿凡达:主要用于动画重定向retargeting,从一个骨架重定向到另外一个骨架(外部导入的模型最开始没有avatar,通过和unity内部骨架和肌肉关联,通过configuration生成)。

Retargeting重定向:把为一个模型创建的动画应用到另外一个模型(一般在animator的组件中通过设置avatar 和设置动画控制器实现)。

Rigging 绑定:为你的网格建立一个骨架的层次结构和关节的过程(这里指的是导入模型的内部层次结构,这些层次结构在外部如3Dmax中指定)。

skinning蒙皮:把骨骼关节绑定到角色网格或者“皮肤”的过程(这里指的是导入模型的外部皮肤,这些皮肤在外部如3Dmax中指定)。

Muscle Definition肌肉定义:它允许你更直接地控制Avatar。当一个Avatar准备好了之后,Mecanim工作在肌肉空间,这比骨骼空间更直接。(在导入模型后,可以在muscle tab中定义各肌肉模块的控制范围)。

T-pose T姿势:角色双臂平伸,形成一个“T”字的姿势。一般角色保持这个姿势更容易观察Avatar。

Bind-pose绑定姿势:the pose at which the character was modelled建模过程中的姿势

Human template人型模板:一个预先定义的骨骼映射(用于从fbx文件中匹配骨骼到Avatar)

Animator Component动画组件:在模型上使用Mecanim动画系统的组件(这个组件通过Animator Controller资源和avatar 对动画进行重定向)

Root Motion根运动:角色根级动作,它可以被动画本身或者外部控制(可以理解为每个animation clip 预览中下面的圆圈圈)

Animator Controller动画控制器:一个状态机,控制动画的状态转换。

Animation Layer动画层:每个层包含一个控制动画的状态机。例如我们可以创建“基础层”控制走路、跑动;创建更高的层控制上半身动作比如投掷、跳跃(更高层对于身体部位有更高的控制权)。

Animation State Machine动画状态机:一个控制动画状态之间交互的图。每个状态引用一个混合树或者单一动画剪辑。

Animation Blend Tree动画混合树:基于浮点动画参数(代码中可以通过控制浮点参数实现控制具体动画执行的目的),用于连续在多个近似的动画剪辑之间进行混合。

Animation Parameters动画参数:用于在脚本和Animator Controller之间通信。一些参数可以在脚本中设定并且在控制器中被引用;另一些参数是基于在动画剪辑中的自定义曲线,这些参数,可以使用脚本接口来采样。(参数分为bool,int,float和tigger型)。

Inverse Kinematics (IK)反向动力学:用世界中各种对象来控制角色身体部分运动(子对象控制父对象运动)

以下是官网的解释:

http://docs.unity3d.com/Manual/AnimationGlossary.html

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-12-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 腾讯移动品质中心TMQ 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 导读
  • 动画基础内容
  • 小结:本部分,大家知道通过导入fbx文件,可以导入一些动画资源,这些动画资源是我们用来实现动画系统的重要组成部分。
  • 二、创建动画控制器
  • 三、导入外部人物模型
  • 四、资源关联
  • 五、调整动画
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档