Unity3D Mecanim 动画系统骨骼动画问题解决方法
http://7dot9.com/2014/08/16/unity3d-mecanim%E5%8A%A8%E7%94%BB%E7%B3%BB%E7%BB%9F%E9%AA%A8%E9%AA%BC%E5%8A%A8%E7%94%BB%E9%97%AE%E9%A2%98%E8%A7%A3%E5%86%B3%E6%96%B9%E6%B3%95/
这几天开始做游戏中跟动画相关的部分了,此次新项目我们决定一次从新开始,就是能用新的东西就都用新的东西,没有必要总是把自己局限在之前的认知里头,所以此次我们大胆而又现实的采用了 Unity 4.x 版本新增的 Mecanim 动画系统,并且我们果断地又选择了使用 Humanoid 动画类型。好吧,一切从新开始。
一切从新开始就意味着会有很多新的坑需要自己一个个去填,我们一直都拥有一颗坚强受虐的心不是吗。在我们的动画设计师将骨骼动画调好了之后,给了我一组 FBX 文件,导入 Unity 之后,预览一下这个动画吧。
我们可以很明显得看出这两个动画中人物角色的右手和武器之间的位置关系是不对的,跟动画设计师在 3DS Max 中制作和预览的效果也不对,好吧,碰到第一个坑,上吧。
通常我们先做的第一件事情就是先查查文档,看看 Unity 官方是否有一些最佳实践的建议,可是我翻遍了 Unity Manual 中关于 Mecanim Animation System 的所有文档没有看到相关的内容,而游戏引擎通常对于开发者来说就是个黑盒,出了问题除了查查看看别人是否碰到同样的问题也就是直接找 Support 这条路了,或者就是自己各种尝试呗。好吧,那就先 Google 一下吧,找啊找,找啊找,找了将近两天看了很多跟 Mecanim 动画相关的问题,但是就是没有找到这个这么基础的问题相关的帖子啥的,简直没有天理啊。
既然 Humanoid 不行,那我们试试 Generic 动画吧,这下就都 OK 了,那么显然动画资源自身肯定木有问题了,这下就确定肯定是 Unity 按照 Humanoid 动画导入 FBX 资源的时候有某些设置我们没有按照要求来做,所以导致了这个武器完全不跟着右手骨骼运动的情况。自己纠结了又一天,又是各种查啊各种试,完全木有进展。最后,只能求助于其他有经验的人了,通过我们的动画设计师,找到了一个他一个做技术美术的朋友,该大牛对 Unity 非常熟悉,专门解决项目中碰到的技术问题,哪里有问题哪里就有他。直接远程协助一下,看着大神一点点地调整,先是检查了一下 Avatar 设置中骨骼对应的关系是否正确,确认无误之后,再次运行看看效果依然如此,大牛稍微思考了一下,马上打开了 Unity 导入动画的页面,找到了 Animations 标签页,然后展开 Mask 设置中的 Transform 节点,将所有未勾选的人物角色骨骼节点都勾选上,然后 Apply 一下,再次运行游戏,搞定。
再回顾一下完整的调整过程吧,首先我们要确定我们出问题的骨骼具体是哪根,因为目前看到的现象是右手拿的刀和挂在腰上的刀鞘出现了问题,打开 Avatar 设置页面,查看一下,确定是 Bip001 Prop1 和 Bip001 Prop2 这两根骨骼出了问题。
确定了是这根骨骼出现问题了,然后进入到出现问题的动画文件 jin_wei_jun@run.FBX 的导入设置页面,打开 Animations 标签页 =》展开 Mask 节点 =》展开 Transform 子节点 =》找到左右手对应的刀和刀鞘的骨骼,勾选上,然后点击 Apply 按钮就好了:
虽然大神帮我们解决了这个困扰了我将近 4 天的问题,那么究竟为啥捏?其实在被困扰的 4 天里头,其实也发现了一些蛛丝马迹的,就是每次我们导入动画 jin_wei_jun@run.FBX 的时候,Unity 总会提示以下的警告:
MuscleClip ‘jin_wei_jun@run’ conversion warning: Bone position is different in avatar and animation
‘Bip001 L Thigh’ : position error = 31.473890 mm
‘Bip001 R Thigh’ : position error = 8.405679 mm
‘Bip001 L Clavicle’ : position error = 37.673038 mm
‘Bip001 R Clavicle’ : position error = 76.461647 mmUnityEditor.DockArea:OnGUI()
和这样的一个警告:
MuscleClip ‘jin_wei_jun@run’ conversion warning: ‘Bip001/Bip001 Pelvis’ is between humanoid transforms and has rotation animation. This might lower retargeting quality.
MuscleClip ‘jin_wei_jun@run’conversion warning: ‘Bip001/Bip001 Pelvis/Bip001 Spine’ has translation animation. It is not supported.
MuscleClip ‘jin_wei_jun@run’ conversion warning: ‘Bip001/Bip001 Pelvis/Bip001 Spine’ is between humanoid transforms and has rotation animation. This might lower retargeting quality.
MuscleClip ‘jin_wei_jun@run’conversion warning: ‘Bip001/Bip001 Pelvis/Bip001 Spine/Bip001 L Thigh’ has translation animation. It is not supported.
MuscleClip ‘jin_wei_jun@run’conversion warning: ‘Bip001/Bip001 Pelvis/Bip001 Spine/Bip001 R Thigh’ has translation animation. It is not supported.
MuscleClip ‘jin_wei_jun@run’conversion warning: ‘Bip001/Bip001 Pelvis/Bip001 Spine/Bip001 Spine1/Bip001 Neck/Bip001 L Clavicle’ has translation animation. It is not supported.
MuscleClip ‘jin_wei_jun@run’conversion warning: ‘Bip001/Bip001 Pelvis/Bip001 Spine/Bip001 Spine1/Bip001 Neck/Bip001 R Clavicle’ has translation animation. It is not supported.UnityEditor.DockArea:OnGUI()
这两个警告大体的意思是啥呢,刚开始自己没有太注意,后来总是找不到原因就想着会不会还就真是这俩警告给弄的呢,自己仔细看了一下。第一个警告的意思,应该说的是动画中有几个骨骼的位置跟这个动画实际使用的 Avatar 中骨骼的位置不相符,这个原因我大概能理解的原因是这样的。我们在制作的过程中会将模型文件和动画文件分开,我在导入模型文件的时候会创建一个属于这个模型的 Avatar,其他的动画都会直接引用这个 Avatar 文件而不会每个动画都创建自己的 Avatar,而不同的动画中人物可以会有一些不同的动作,这就会让动画中角色的一些骨骼位置和模型(模型默认姿态就是站姿)站立姿态时的骨骼的位置会出现一些不匹配的情况,所以这个可以理解了。那么第二个警告呢,这个警告都是说某根骨骼有位移动画和旋转动画,而这些动画会降低 Retargeting 的质量,同时 Humanoid 动画不支持在这些骨骼上使用位移动画。虽然这个警告中提到的带有位移和旋转动画的骨骼不少,但是涉及的就是角色躯干、胸部、臀部、左右手、左右脚这几个非常关键的骨骼,并没有提到影响到刀和刀鞘的骨骼 Bip001 Prop1 和 Bip001 Prop2 啊。
综合大神提供的解决方案,应该可以初步得出结论,导入 FBX 动画的时候,选择 Humanoid 动画类型进行导入的时候,Unity 会自行进行计算和判断,然后根据 Retargeting 最佳原则,设置 Animations 选项卡中 Mask 节点下 Transform 子节点中的骨骼是否需要在 Humanoid 动画中应用位移动画,而这个时候 Bip001 Prop1 和 Bip001 Prop2 这俩骨骼就被忽略了,所以我们需要手动的去勾选,如果有必要的话,那么就把所有的未勾选的骨骼都勾选上,然后再 Apply 一下吧,如果出现 Apply 一次不生效的话,重新重复设置遍,然后再 Apply 一下吧(我自己碰到了一次把所有的都勾选,然后 Apply 之后无效,重新展开之后发现只有部分被勾选上了,重新再全勾选 Apply 一次才好的情况)。
刚才我们提到了使用 Generic 动画的时候就不会出现这个问题对吧,那么为了印证这个结论是否正确,我们可以检查一下 Generic 动画导入设置页面中 Animations 标签页中 Mask 节点下 Transform 子节点中的骨骼节点是神马情况就好了。如下图,所有的节点默认都是勾选上的。
鉴于此,我们可以得出结论就是,在我们使用 Humanoid 动画类型导入 FBX 文件时,Unity 会以最佳匹配 Retargeting 规则的方式自行计算,看看那些骨骼是需要勾选 Transform 动画选项的,而默认使用 Generic 动画就会将所有的骨骼节点 Transform 动画选项都勾选上,所以效果是正确的。OK,所以问题到这里就彻底明了了。
本条目发布于2014年8月16日。属于Programming、Unity3D分类,被贴了 Mecanim、Unity3D 标签。
Unity3D Mecanim 动画系统骨骼动画问题解决方法的更多相关文章
- Unity 动画系统 AnimationEvent 动画事件
- Unity 动画系统 StateMachineBehaviour 动画状态机
- [原]Unity3D深入浅出 - 新版动画系统(Mecanim)
Mecanim概述: Mecanim是Unity提供第一个丰富而复杂的动画系统,提供了: 针对人形角色的简易的工作流和动画创建能力 Retargeting(运动重定向)功能,即把动画从一个角色模型应用 ...
- [Unity3D]Unity4全新的动画系统Mecanim
Unity4.X添加一个新的动画系统,以取代原有的3.X旧的动画系统,全新的动画系统Mecanim是官方推荐,它使我们能够写更少的代码实现连续动画. 效果图 Unity3.X中动画系统播放动画 使用播 ...
- Spine Skeleton Animation(2D骨骼动画)
骨骼动画 首先我们来看到底什么是骨骼动画: 在早期的机器上,渲染本身已经占用了很多CPU资源,因此,对于渲染,往往采取的是一种空间换时间的策略,以避免在模型的渲染中继续加重CPU的负担.帧动画模型在这 ...
- 【咸鱼教程】DragonBones帧动画、骨骼json、极速、二进制
公司的人想用龙骨,但是同事在官网找不着二进制的资料...于是写了个简单demo. demo中包含了帧动画.骨骼动画json.极速和二进制的资源和代码 测试环境:DragonBonesPro 5.5 ...
- cocos2d-x开发记录:二,基本概念(骨骼动画)
九,骨骼动画 1.骨骼动画vs Sprite sheets 你能使用sprite sheets 创建动画,它很快又容易.直到你意识到你的游戏需要大量的动画并且内存消耗越来越高,并且需要时间载入全部数据 ...
- spine骨骼动画组件使用详解
1. spine骨骼动画工具 骨骼动画: 把动画打散, 通过工具,调骨骼的运动等来形成动画spine是一个非常流行的2D骨骼动画制作工具spine 动画美术人员导出3个文件: (1) .png文 ...
- Skeleton with Assimp 骨骼动画解析
Skeleton with Assimp 骨骼动画解析 骨骼动画是图形学中十分常见应用很广泛的一个技术,也是比较基础的内容,作为图形学的工程师需要将这一部分内容梳理清晰,主要关键在于几点:第一,分清楚 ...
随机推荐
- EasyUI-标签(Tabs)用法
用法示例 创建tabs 1. 经由标记创建Tabs 从标记创建Tabs更容易,我们不需要写任何JavaScript代码.记住把 'easyui-tabs' 类添加到<div/>标记,每个t ...
- 2016年10月13日 星期四 --出埃及记 Exodus 18:24
2016年10月13日 星期四 --出埃及记 Exodus 18:24 Moses listened to his father-in-law and did everything he said.于 ...
- P1119 灾后重建
题目背景 B地区在地震过后,所有村庄都造成了一定的损毁,而这场地震却没对公路造成什么影响.但是在村庄重建好之前,所有与未重建完成的村庄的公路均无法通车.换句话说,只有连接着两个重建完成的村庄的公路才能 ...
- BZOJ 2666: [cqoi2012]组装
题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2666 题意:n种零件,m个位置,每个位置有一种零件.求一个位置x,使得cost(1 ...
- 登录界面 beta版
1.MainActivity.java package com.example.administrator.myapplication; import android.content.Intent; ...
- UVA 10564 十 Paths through the Hourglass
Paths through the Hourglass Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & % ...
- CodeForces 508C Anya and Ghosts
Anya and Ghosts Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u S ...
- SQL生成随机数
ALTER FUNCTION [dbo].[ufn_Random] ( @A INT, @B INT ) RETURNS INT AS BEGIN /* 功能:生成随机数 */ ,) , SELECT ...
- [转]Linux下的暴力密码破解工具Hydra详解
摘自:http://linzhibin824.blog.163.com/blog/static/735577102013144223127/ 这款暴力密码破解工具相当强大,支持几乎所有协议的在线密码破 ...
- SQL GUID和自增列做主键的优缺点
我们公司的数据库全部是使用GUID做主键的,很多人习惯使用int做主键.所以呢,这里总结一下,将两种数据类型做主键进行一个比较. 使用INT做主键的优点: 1.需要很小的数据存储空间,仅仅需要4 by ...