unity怎么显示骨骼_浅谈Unity3D 骨骼动画

最近研究了一下游戏中模型的骨骼动画的原理,做一个学习笔记,便于大家共同学习探讨。

ps:最近改bug改的要死要活,博客写的吭哧吭哧的~

首先列出学习参考的前人的文章,本文较多的参考了其中的表述:

一、骨骼动画、关节动画、关键帧动画

在实际的游戏中,用的最多的是这三种基本的动画。

在关键帧动画中,模型在每个关键帧中都是一个固定的姿势,相当于一个“快照”,通过在不同的关键帧中进行插值平滑计算,可以得到一个较为流畅的动画表现。关键帧动画的一个优势是只需要做插值计算,相对于其他的动画计算量很小,但是劣势也比较明显,基于固定的“快照”进行插值计算,表现大大被限制,同时插值如果不够平滑容易出现尖刺等现象, 同时一个无法忽略的问题就是,对于每帧动画都需要进行内存占用,在帧数较多和顶点数较多的时候,这会带来极大的内存占用。当然帧动画也有其实际的应用场景,目前在一些模型的表情动画中会较多的应用到帧动画,因为其动画较少,同时可以用插值实现较为平滑的效果,不需要骨骼动画。

关节动画是早期出现的一种动画,在这种动画中,模型整体不是一个Mesh, 而是分为多个Mesh,通过父子的关系进行组织,这样父节点的Mesh就会带动子节点的Mesh进行变换,这样层层的变换关系,就可以得到各个子Mesh在不同关键帧中的位置。关节动画相比于关键帧动画,依赖于各个关键帧的动画数据,可以实时的计算出各个Mesh的位置,不再受限于固定的位置,但是由于是分散的各个Mesh,这样在不同Mesh的结合处容易出现裂缝。

骨骼动画是进一步的动画类型,原理构成极其简单,但是解决问题极其有优势。将模型分为骨骼Bone和蒙皮Mesh两个部分,其基本的原理可以阐述为:模型的骨骼可分为基本多层父子骨骼,在动画关键帧数据的驱动下,计算出各个父子骨骼的位置,基于骨骼的控制通过顶点混合动态计算出蒙皮网格的顶点。在骨骼动画中,通常包含的是骨骼层次数据,网格Mesh数据, 网格蒙皮数据Skin Info和骨骼的动画关键帧数据。本文重点讲解一下骨骼动画。

二、骨骼动画原理分析

对于Skinned Mesh的理解关键是蒙皮的计算过程,这里的皮,并不是我们常见的在shader中用到的贴图texture,而是模型的mesh, 所以蒙皮其实就是计算mesh相对于骨骼的位置变换过程。如果我们的骨骼没有变化,那么我们的mesh就没有变化,此时的mesh就相当于一个静态的mesh。所以对于skinned的理解,就是指具有蒙皮数据skin info的mesh :D。 在实际的实例中,skin info主要包含当前mesh上的顶点受到哪些骨骼影响,各个骨骼的影响权重。借用文章1中的表述,整个mesh顶点的变换过程可以用矩阵的方式表述:

Vworld = Vmesh * BoneOffsetMatrix1 * CombineMatrix1 * W1 +Vmesh * BoneOffsetMatrix2 * CombineMatrix2 * W2 +...+ Vmesh * BoneOffsetMatrixn * CombineMatrixn * Wn

其中BoneOffsetMatrix 和 CombineMatrix在下面的讲解中会详细讲解求解过程。

1、骨骼动画中的骨骼

在我们常见的模型建模中,美术通常将模型设置成双手水平,双腿分立的类“大”字型。 为什么要用这样的方式? 这与我们的模型的骨骼有一定的关系。通常模型骨骼数量都有一个限制(通常为30,下面会解释为什么受到限制),模型不可能为一根骨骼,如果为一根骨骼,那么模型的表现就会显得比较单一,想要表现出类似于人体的动画,一般都会有多个骨骼。对于每个骨骼,如何建立其组织关系,在建模的时候就进行了基本的设定。在完成建模后,在进行骨骼绑定的时候,通常美术会选择模型的盆骨做为模型的根骨骼。那么基于根骨骼,可以递推出各个骨骼相对于根骨的父子关系。通过骨骼所在的空间,其原点我们会选择两个脚之间的中点作为原点,这时候就会发现根骨骼并没有和原点重合,这时美术会构建一个Scene_Root做为额外的骨骼,其位置就为世界原点,而真正的根骨骼Bip01会作为Scene_Root的唯一子骨骼。

请忽略我的灵魂画法:D

基于根骨骼,我们可以递推出各个骨骼相对于根骨骼的父子转换矩阵,通常这样的矩阵转换为旋转矩阵,不存在平移和缩放,当然比如你的一个模型动画是拉长模型的身体(比如海贼王这种动画:D),那么你可以添加平移和缩放到变换矩阵中。此时对于整个模型就有了一个基本的直观的感受了,模型的具体动画,取决于模型的根骨骼,牵一发而动全身(这儿的牵一发是指模型的动画数据驱动),整个模型的运动会带动外面的mesh一起运动,就可以表现出整个模型的骨骼动画,这样,我们对于骨骼动画就有一个基本的理解。

借用参考文1的说话,骨骼的本质,其实就是一个坐标空间,我们

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值