3D模型和3D模型动画
在Unity3D中,MeshRenderer 与 SkinnedMeshRenderer 分别用于渲染 3D模型 和 3D模型动画。
普通网格(MeshRenderer)渲染的是模型,由3D模型数据组成,蒙皮网格(SkinnedMeshRenderer)渲染的也是模型,也是由3D模型数据组成。不过蒙皮网格被创造出来主要是为了动作动画服务的,所以蒙皮网格除了3D模型数据外还有骨骼数据以及顶点权重数据。
如果蒙皮网格(SkinnedMeshRenderer)上没放置任何骨骼数据,那么它和普通网格的作用没有任何区别,都只能渲染静止不动的3D模型。
3D模型要做动作,首先是模型上的点/线/面要动起来,只有点/线/面动起来了,在每帧渲染的时候才能在每帧渲染时有不同的3D模型形状。
点/线/面动起来有两种方法:(1) 用算法来改变顶点位置,叫顶点动画; (2) 用骨骼机制去影响顶点,叫骨骼动画。这两种方法都是通过每一帧改变模型上的各个顶点位置,从而让模型变形形成动画的效果,每一帧模型的形状不一样,播放时形成动画,只是方法不同。
顶点动画:
模型上成千上万的顶点,如果每个都要手动来调整,每一帧都要手动调整一次,这种量级的劳动力,人类无法承受,所以在最初,还没有骨骼动画这个概念的时候,只能用程序写一个顶点走向算法去改变每个顶点的位置,或者用着色器(Shader)在顶点函数中去改变顶点位置成为动画效果,这种动画效果现在很多游戏中都还在使用,这种方法已经成为节省骨骼动画开销的必要手段,比如草、树在风中的左右摆动,丝带或国旗在空中自然飘动等。
骨骼动画:
由简单的几个骨骼点组成,一般骨骼动画的骨骼数量都不会超过50个,是人类能够承受的操控范围之内。
首先,骨骼动画由骨骼点组成,每个骨骼动画可以由许多个骨骼,现代手机游戏中每个人物的骨骼动画的数量一般都会在30个左右,PC单机游戏中会更多点到达40-50个左右。骨骼数量越多,表现出来的动画越细腻越有质感,但同时也消耗掉更多的CPU计算。
其次,一个骨骼可以有很多个子骨骼,每个子骨骼都与父节点拥有相同的功能,只是当父节点移动、旋转、缩放时子节点也随着父节点的一起移动、旋转、缩放,他们的相对位置、相对角度、相对比例不变。父子节点有着相对位置的关系。
在SkinnedMeshRenderer中就由bones来记录所有骨骼点,骨骼点的表现在SkinnedMeshRenderer中就是 Transform 数组,因此 bones 这个变量就是 Transform[] 类型。
另外,一个骨骼点可以影响周围一定范围内的所有顶点。每个单一顶点也可以受到多个骨骼的影响。在Unity3D中的Quality setting图形质量设置中,我们可以看到关于Blend Weights的设置,就是关于一个顶点能被多少骨骼影响的参数设置,可选1Bone、2Bones、4Bones,被影响的骨骼数越多,CPU消耗在骨骼计算蒙皮的时间越长,消耗量越大。同时,模型中每个顶点都维护有影响其本身的最多4个骨骼的权重值,在Unity3D中这4个骨骼权重被记录在了BoneWeight这个类中。每个Mesh类都有一个boneWeights变量来记录所有顶点的骨骼权重值,BoneWeight中boneIndex0、boneIndex1、boneIndex2、boneIndex3分别代表被影响的骨骼索引值,而weight0、weight1、weight2、weight3则是分别代表被影响的权重值,权重最大为1,最小为0,所有权重分量之和为1。
- 点赞
- 收藏
- 关注作者
评论(0)