第12章动画技术骨骼动画基础刚体动画蒙皮动画刚体动画蒙皮动画刚体动画蒙皮动画理解骨骼动画原理理解蒙皮动画原理12.1骨骼动画基础1.为什么使用顶点混合12.1.1顶点混合概念骨骼动画是用于在计算机上模拟或再现动物运行的技术。一个骨骼动画由骨骼支撑下的顶点运动构成。如果有网格附着在骨骼上,就必须将网格分割成受不同骨骼控制的片断,骨骼运动时势必导致网格断裂,或者部分重叠。实际应用模型动画是采用网格与多个骨骼共同协作完成的。将蒙皮分割成受到不同骨骼控制的片段适合刚体动画例如机器人关节处出现断裂、重叠现象12.1骨骼动画基础1.为什么使用顶点混合12.1.1顶点混合概念要使网格在弯曲时实现平滑过渡,需要使用顶点混合技术。渲染系统在顶点上使用额外的世界变换矩阵进行变换,得到多个结果,然后再进行线性混合。所谓混合就是根据多个顶点,按照一定的比例计算中间值即权重,混合:根据多顶点,按照一定比例计算出一个中间值。权重:这个比例称之为权重(weight),它代表了一个顶点对结果的影响程度,所有顶点的权重之和为1。混合与权重12.1骨骼动画基础2.顶点权重12.1.1顶点混合概念假设顶点为Vn,该顶点的权重为Wn。一般由建模软件计算。vBlend=V1W1+V2(1.0-W1)//2个影响vBlend=V1W1+V2W2+V3(1.0-(W1+W2))//3个影响vBlend=V1W1+V2W2+V3W3+V4(1.0-(W1+W2+W3))//4个影响几个权重之和为1.0,因此其中一个可以通过其他权重计算出来,在存储时可以少存储1个权重。DirectX支持最多4个世界顶点的混合,因此每个顶点可以包含2~4个矩阵信息(矩阵索引)和1~3个权重信息。12.1骨骼动画基础2.顶点权重12.1.1顶点混合概念权重信息由美术师设计角色时用建模工具定义。水平部分受到水平骨骼影响的权重为1,在关节附近影响的程度减小,权重也减小,超过一定范围不受水平骨骼影响。12.1骨骼动画基础3.在DirectX中使用顶点混合12.1.1顶点混合概念Vn=VTnWn权重存储每个顶点受到各个骨骼影响的权重各不相同。骨骼数量较少在顶点中附加几个骨骼的权重信息很容易。权重信息是存储在顶点中的DirectX支持最多顶点3个权重用于混合,每个权重对应特定的矩阵。12.1骨骼动画基础3.在DirectX中使用顶点混合12.1.1顶点混合概念1)设置世界变换矩阵。顶点混合使用额外的世界变换矩阵。矩阵类型:D3DTS_WORLDMATRIX(n)或D3DTS_WORLDn。其中n取0~255,矩阵索引可使用一个字节存储。m_pD3DDevice-SetTransform(D3DTS_WORLDMATRIX(0),&matBlend[0]);m_pD3DDevice-SetTransform(D3DTS_WORLDMATRIX(1),&matBlend[1]);m_pD3DDevice-SetTransform(D3DTS_WORLDMATRIX(2),&matBlend[2]);12.1骨骼动画基础3.在DirectX中使用顶点混合12.1.1顶点混合概念2)指定权重个数。d3dDevice-SetRenderState(D3DRS_VERTEXBLEND,D3DVBF_2WEIGHTS);DirectX支持多达3个权重(4个世界变换矩阵)用于顶点混合。typedefenum_D3DVERTEXBLENDFLAGS{D3DVBF_DISABLE=0,//关闭D3DVBF_1WEIGHTS=1,//1权重,2个矩阵D3DVBF_2WEIGHTS=2,//2权重,3个矩阵D3DVBF_3WEIGHTS=3,//3权重,4个矩阵D3DVBF_TWEENING=255,//用D3DRS_TWEENFACTOR对两个点混合D3DVBF_0WEIGHTS=256//使用单一矩阵,权重为1.0}D3DVERTEXBLENDFLAGS;12.1骨骼动画基础3.在DirectX中使用顶点混合12.1.1顶点混合概念3)顶点定义。权重的格式:D3DFVF_XYZB1、D3DFVF_XYZB2或D3DFVF_XYZB3。顶点应该包含每个矩阵的权重信息,用于指定顶点混合系数。#defineD3DFVF_BLENDVERTEX(D3DFVF_XYZB3|D3DFVF_NORMAL|D3DFVF_TEX1)structBLENDVERTEX{D3DXVECTOR3v;//位置FLOATblend1;//权重1FLOATblend2;//权重2FLOATblend3;//权重3D3DXVECTOR3n;//法线FLOATtu,tv;//纹理坐标};12.1骨骼动画基础4.索引顶点混合12.1.1顶点混合概念骨骼系统比较复杂时,需要反复切换矩阵,效率较低。DirectX提供一种索引的方法使用矩阵:索引顶点混合(IndexedVertexBlending)注意:这里的索引是对混合进行索引,和顶点索引没有任何关系。设备可以设置多达255个矩阵,用4个字节足够存储4个索引:m_pD3DDevice-SetRenderState(D3DRS_INDEXEDVERTEXBLENDENABLE,TRUE);65200123456255vw1w2w3ntu,tv256矩阵indices12.1骨骼动画基础12.1.2运动插值关键帧动画使用像素图,因此只能做到近似的平滑。骨骼动画也使用关键帧存储一系列关键的状态数据,利用这些数据可以计算出关键帧中间的一些状态,因此能够实现平滑的动画。矩阵存储骨骼状态,但插值困难,一般都是用缩放、旋转和平移变量进行插值。存储运动数据的数据类型:向量:存储缩放比例和平移量。四元数:存储转动量。12.1骨骼动画基础12.1.2运动插值1.向量线性插值向量插值较为简单,插值方法分为线性插值和二次曲线插值算法。t1-tP0P1P=P0*t+P1*(1-t)V=Vn*t+Vn+1*(1-t)D3DXVECTOR3*D3DXVec3Lerp(D3DXVECTOR3*pOut,CONSTD3DXVECTOR3*pV1,CONSTD3DXVECTOR3*pV2,FLOATs//插值系数t);•骨骼动画也是利用类似传统2维动画关键桢实现的,由于一个模型的皮肤顶点数据量庞大,所以不可能记录每桢皮肤顶点的坐标信息,所以我们存储的是数量较少的骨骼的每桢的顶点变化信息,播放时让每个骨骼按照记录的状态切换到相应的位置,再去用某种方式再去影响皮肤位置就能模拟动物运动了。12.2刚体动画12.2.1骨骼模型的构成1.为什么要使用骨骼动画直接存储、播放顶点帧动画,由于顶点较多,存储和渲染效率较低。实际使用骨骼存储动画信息。皮肤的位置由骨骼驱动,骨骼的运动是造成动物运动的关键。动画数据只要存储每个骨骼的运动信息。动画设计师可以专门地从事动画设计,可以用动作捕捉仪或是用三维建模工具建立动画序列。•骨骼动画的思想很简单,自然界中的大多数动物都用有一套骨骼,身体的皮毛血肉都依附于骨骼,当骨骼开始运动的时候,都依附于骨骼的皮肉都随骨骼一起运动。在三维图形编程领域,角色的躯体是由网格来表示的,网格由大量三角形组成,三角形由定点组成,为了模仿现实世界中角色自身的动作,就需要为角色网格添加一套骨骼,同时需要确定那些顶点依附于那块骨骼,这样当骨骼运动的时候就能牵引依附骨骼的顶点一起运动,这就是骨骼动画的基本原理。•每个骨骼都包含完整的坐标系统,在这个坐标系下如果存在一个网格,顶点都是以本地坐标系的形式存储的,那么在渲染他的时候需要将他转换到世界坐标系。•骨骼在转化为数学模型时,包含名称和一个矩阵,这个矩阵用于将顶点从本地空间转换到父结点空间的变换矩阵。那么我们就需要将子结点的所有顶点和这个矩阵进行相×,然后父结点再乘以父结点的父结点,直到根节点为止。最终才能把模型中所有的顶点转换到世界空间。12.2刚体动画12.2.1骨骼模型的构成3.骨骼的数学模型MCM2=MTM2*MTM1从bone2转换到世界坐标系的变换矩阵为:其中:从bone1的坐标系转换到世界坐标系的转换矩阵为MTM1从bone2的坐标系转换到bone1的坐标系的转换矩阵为MTM2bone1bone2MCM3=MTM3*MCM212.2刚体动画12.2.1骨骼模型的构成3.骨骼的数学模型bodyPelvisbodySpinebodySpine1bodySpine2bodyLThighbodyRThigh0000000CM:世界变换矩阵(CombinedTransformMatrix),需要计算TM:转换到父节点空间的变换矩阵(TransformMatrix),由动画序列决定TM0=根结点到骨骼系统本地的变换矩阵CM0=TM0×骨骼系统世界变换矩阵TM1=Spine→Pelvis坐标系变换矩阵CM1=TM1*CM0TM2=LThigh→Spine坐标系变换矩阵CM2=TM2*CM1TM3=RThigh→Spine坐标系变换矩阵CM3=TM3*CM1TM4=Spine1→Spine坐标系变换矩阵CM4=TM4*CM1TM5=Spine2→Spine1坐标系变换矩阵CM5=TM5*CM4顶点坐标(在对应节点的本地坐标)父节点空间坐标根节点空间世界空间…12.2刚体动画12.2.2动画信息1.动画序列既然骨骼的的状态是由自身的变换矩阵决定的,那么要实现骨骼动画,只要不断改变这个变换矩阵(通过2各关键帧之间的插值计算获得),并且不断的进行渲染。每个关键帧存储各个骨骼的状态信息,它可以是一系列数组。数组元素包含:状态信息(位移、缩放和旋转角度)和时间。每个骨骼的状态信息都是相对于父节点的信息,因此,每个骨骼的运动信息可以根据实际帧数单独存储。每个骨骼对应一个数组。bodyPelvisbodySpinebodySpine1bodySpine2bodyLThighbodyRThighScaleKeysRotationKeysTranslateKeysAnimationSetAnimationInterpolatorAnimationInterpolatorAnimationInterpolatorAnimationInterpolatorAnimationInterpolatorAnimationInterpolatorbodyPelvisbodySpinebodyLThighbodyRThighbodySpine1bodySpine212.2刚体动画12.2.2动画信息1.动画序列一个骨骼系统可以有多个动画序列和它对应。骨骼系统支持多种动画。在播放的时候可以切换不同的动画序列就可以了。在DirectX中:实现动画序列的接口为:ID3DXAnimationSet。单个骨骼动画控制的接口为:ID3DXKeyFrameInterpolator。它内置了缩放,平移,和旋转的关键桢。动画控制接口:ID3DXAnimationController。负责管理骨骼,蒙皮和动画信息。12.2刚体动画12.2.2动画信息2.动画的播放当要更新骨骼时,需要遍历当前动作序列,更新所有骨骼的状态信息。状态信息是相对于父节点的,因而不能直接用于三角形渲染,必须计算骨骼的世界变换矩阵。首先根据动画序列中每个骨骼的关键桢信息,计算当前的时刻的状态,这个状态以向量和四元数的形式存储,需要转为矩阵,然后用这些矩阵逐一的更新所有的骨骼节点的本地父结点空间的变换矩阵。Directx使用AnimationController实现本地到父结点的空间变化根据动画序列中每个骨骼的关键帧信息更新骨骼相对变换矩阵更新骨骼节点的世界变换矩阵(递归函数)12.3蒙皮蒙皮即Mesh,它和骨骼关联(绑定)后才能在骨骼的作用下产生变形,从而实现动画。小结(理论课)本章主要介绍了骨骼动画的基本原理:骨骼动画基础刚体动画蒙皮动画小测验(题目部分)单选题1.下列选项中对顶点混合理解正确的是()。A.顶点混合就是将几个顶点合并生成一个顶