X文件的导出系列5——蒙皮动画模型
首先请参考X文件的导出系列4——关键帧动画建立三个长方体代表身体、左右脚,如下图所示:
但这次我们需要将这三个对象合并成一个,我使用的方法是使用“复合对象”,即先选择代表身体的蓝色正方体,在右侧版面中选择“复合对象”,选择“布尔”,操作为“并集”,然后选择“拾取操作对象”,选择右腿后,右腿就和身体组合在了一起。同样的操作将左腿也合并在一起。
最终结果如下图所示:
下一步是添加骨骼,最好在这之前将此模型“冻结”。在工具栏中选择创建→系统→骨骼IK链:
然后创建脊柱骨骼,在正方体底部点击鼠标左键,然后将鼠标移动到正方体顶部点击左键,拉出一个骨头,再点击右键,自动形成骨骼末端,分别命名为Spine和Spine_Nub,同样的操作制作左右腿的骨头,命名为R_Leg,R_Nub,L_Leg,L_Nub,如下图所示:
将R_Leg和L_Leg链接到Spine上,层次结构如下图所示:
选择Body几何体,在右键菜单中将它转换为“转换为可编辑多边形”,如下图所示:
在右侧“修改”选项卡中选择“蒙皮”:
选择“蒙皮”,在相关菜单的骨骼中选择“添加”,添加骨头Spine,R_Leg,L_Leg:
接着选择R_Leg,选择自动关键帧,在0-9帧通过旋转右腿制作提右腿的动画,同样的方法在10-19帧制作提左腿的动画。
Panda插件导出X的设置与X文件的导出系列4——关键帧动画中是相同的,KW-Exporter导出X相同(除了还要勾选“Export Skinning”),不再赘述。这样就制作了一个最简单的蒙皮骨骼动画模型,以上过程主要参考了http://www.3dcognition.com/SpiderAnimation1.htm。
看一下导出的源文件,发现相比X文件的导出系列4——关键帧动画中的模型,x文件多出了蒙皮数据,例如Spine的蒙皮数据为:
// 蒙皮头文件信息 XSkinMeshHeader { 3; //一个顶点可以受到骨骼影响的最大骨骼数,可用于计算共同作用时减少遍历次数 0; // 一个三角面可以受到骨骼影响的最大骨骼数。这个数字对硬件顶点混合计算提出了基本要求。 3; //当前Mesh的骨骼总数。 } SkinWeights { "Spine"; //骨骼名 40; // 权重数组的元素个数,即该骨骼相关的顶点个数 4, // ]受该骨骼控制的顶点索引,实际上定义了该骨骼的蒙皮 5, 6, 7, 8, 9, 10, 11, 16, 17, 18, 19, 20, 21, 26, 27, 28, 29, 31, 33, 38, 41, 43, 45, 46, 49, 51, 52, 54, 56, 58, 59, 61, 62, 65, 67, 69, 70, 73, 75; 1.000000, // 蒙皮各顶点的受本骨骼影响的权值 1.000000, 1.000000, 1.000000, 0.004229, 0.498919, 0.498919, 0.004229, 0.000001, 0.000001, 0.004227, 0.498940, 0.004227, 0.498940, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 0.498919, 0.498919, 0.004229, 0.004229, 0.498919, 0.004229, 0.004229, 0.498919, 1.000000, 1.000000, 0.000001, 0.000001, 0.498940, 0.004227, 0.004227, 0.004227, 0.004227, 0.498940, 0.498940, 0.498940; // 骨骼偏移矩阵,用来从初始Mesh坐标,反向计算顶点在子骨骼坐标系中的初始坐标。 0.000000,0.000000,-1.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,-1.000000,0.000000,0.000000,-10.000000,-0.000000,-3.000000,1.000000;; }
以上知识可参见关于骨骼动画及微软示例Skinned Mesh的解析(http://bbs.gameres.com/showthread.asp?threadid=87707)。
但是若是使用3DSMAX自带的fbx插件,无法导出两个动画,因为插件中根本就没有设置多个动画的选项,它会将所有动画输出成一个,动画名称默认为Take001。要解决这个问题,一个办法是导出两次fbx文件,一次只有0-9帧的提右腿动画,一次只有0-9帧的提左腿动画,我命名为manSkinningFbx.fbx和manSkinningFbx01.fbx,然后用文本编辑器打开manSkinningFbx01.fbx,找到以下部分并复制:
Take: "Take 001" { FileName: "Take_001.tak" LocalTime: 0,13855847400 ReferenceTime: 0,13855847400 ;Models animation ;---------------------------------------------------- Model: "Model::L_Leg" { Version: 1.1 Channel: "Transform" { Channel: "R" { Channel: "X" { Default: 5.00895612276508e-006 KeyVer: 4005 KeyCount: 2 Key: 0,180,U,s,0,-0,a,0.333233326673508,0.333233326673508,13855847400,180,U,s,0,0,r,0.989998996257782 Color: 1,1,1 } Channel: "Y" { Default: -5.00895612276508e-006 KeyVer: 4005 KeyCount: 2 Key: 0,180,U,s,0,-0,a,0.333233326673508,0.333233326673508,13855847400,225,U,s,0,0,r,0.989998996257782 Color: 1,1,1 } Channel: "Z" { Default: -179.999984741211 KeyVer: 4005 KeyCount: 2 Key: 0,1.36603784994804e-005,U,s,0,-0,a,0.333233326673508,0.333233326673508,13855847400 ,1.36603784994804e-005,U,s,0,0,r,0.989998996257782 Color: 1,1,1 } LayerType: 2 } } } ;Generic nodes animation ;---------------------------------------------------- ;Textures animation ;---------------------------------------------------- ;Materials animation ;---------------------------------------------------- ;Constraints animation ;---------------------------------------------------- }
然后打开manSkinningFbx.fbx,将复制的内容粘贴到正确位置,并改变默认的Take001名称,即:
;Takes and animation section ;---------------------------------------------------- Takes: { Current: "" Take: "RaiseRight" { FileName: "RaiseRight.tak" LocalTime: 0,13855847400 ReferenceTime: 0,13855847400 ;Models animation ;---------------------------------------------------- Model: "Model::R_Leg" { Version: 1.1 Channel: "Transform" { Channel: "R" { Channel: "X" { Default: 0.000305537279928103 KeyVer: 4005 KeyCount: 2 Key: 0,180.000305175781,U,s,0,- 0,a,0.333233326673508,0.333233326673508,13855847400,180.000305175781 ,U,s,0,0,r,0.333233326673508 Color: 1,1,1 } Channel: "Y" { Default: 0.00420238729566336 KeyVer: 4005 KeyCount: 2 Key: 0,179.995803833008,U,s,0,-0,a,0.333233326673508,0.333233326673508,13855847400,225 ,U,s,0,0,r,0.333233326673508 Color: 1,1,1 } Channel: "Z" { Default: -179.999984741211 KeyVer: 4005 KeyCount: 2 Key: 0,1.36603784994804e-005,U,s,0,-0,a,0.333233326673508,0.333233326673508,13855847400 ,1.36603784994804e-005,U,s,0,0,r,0.333233326673508 Color: 1,1,1 } LayerType: 2 } } } ;Generic nodes animation ;---------------------------------------------------- ;Textures animation ;---------------------------------------------------- ;Materials animation ;---------------------------------------------------- ;Constraints animation ;---------------------------------------------------- } Take: "RaiseLeft" { FileName: "RaiseLeft.tak" LocalTime: 0,13855847400 ReferenceTime: 0,13855847400 ;Models animation ;---------------------------------------------------- Model: "Model::L_Leg" { Version: 1.1 Channel: "Transform" { Channel: "R" { Channel: "X" { Default: 5.00895612276508e-006 KeyVer: 4005 KeyCount: 2 Key: 0,180,U,s,0,- 0,a,0.333233326673508,0.333233326673508,13855847400,180,U,s,0,0,r,0.989998996257782 Color: 1,1,1 } Channel: "Y" { Default: -5.00895612276508e-006 KeyVer: 4005 KeyCount: 2 Key: 0,180,U,s,0,- 0,a,0.333233326673508,0.333233326673508,13855847400,225,U,s,0,0,r,0.989998996257782 Color: 1,1,1 } Channel: "Z" { Default: -179.999984741211 KeyVer: 4005 KeyCount: 2 Key: 0,1.36603784994804e-005,U,s,0,-0,a,0.333233326673508,0.333233326673508,13855847400 ,1.36603784994804e-005,U,s,0,0,r,0.989998996257782 Color: 1,1,1 } LayerType: 2 } } } ;Generic nodes animation ;---------------------------------------------------- ;Textures animation ;---------------------------------------------------- ;Materials animation ;---------------------------------------------------- ;Constraints animation ;---------------------------------------------------- } }
这样就可以实现多个动画了,这个方法来自于XNA官网的Multiple animations (takes) in FBX(http://forums.xna.com/forums/p/10726/56461.aspx),这篇文章中还提到可以使用另一个软件motionbuilder导出多个动画。
以上三个导出文件在我的引擎、DirectX Viewer、Deep Exploration中全都显示正常。
复杂蒙皮动画文件的导出
当然制作最简单的动画是为了更好的将注意力集中到XNA动画代码的实现上,真正制作游戏时模型通常很复杂,比方说我从网上下载了一个复杂的人物模型Alien.max。
首先,它的眼球与身体是分离的,属于不同的网格,但导出后,XNA的SkinnningModel内容处理器会将眼球删除,并显示信息“Mesh has no skinning information, so it has been deleted”,即眼球模型不包含蒙皮信息将会被删除,结果是眼球不会被显示。所以事先将眼球和身体组合成为一个模型。
然后建立骨骼,创建提左腿和提右腿的动画,导出x文件,这与前面的操作是相同的。 我偷懒只做了脊柱、脖子。头、腿、脚、胳膊的骨骼,更详尽的操作可参见http://www.ddove.com/3dmax/sl/tut_building_the_leg_bones.html。
然后费了老大劲设置封套,对我这种3DSMAX菜鸟来说真是艰巨的挑战,贻笑大方了,以下是调整封套的截图:
除了panda导出的X文件在DirecX Viewer中显示不正常外,在Deep Exploration和XNA中显示都正常。以下是截图:
但是,现在3DSMAX中动画人物主流的做法是使用Biped,从网上下载的Alien文件包含一个行走动画的Biped模型。直接将它导出的话,两种X文件在DirecX Viewer显示正常,两种X文件和fbx文件在Deep Exploration中显示正常,在XNA程序中KW导出的X能播放,但不显示眼球,这是因为眼球链接到了骨骼上,会被内容处理器删除,不过这可以在3DSMAX中重新将眼球和身体组合在一起加以解决。fbx报错,因为它导出的文件bone数量为63,超出了内容处理器最大支持的59。Panda导出的X文件bone数量为110,也不能播放,只是我是菜鸟,不知道如何在3DSMAX中将不必要的Bone减小一些,我想应该可以解决这个问题。
下图为能正常播放的KW导出的X文件在XNA程序中的截图:
以上就是我在导出文件时的操作,你可以试着做一下,有什么更好的做法请告知我。
最后是我导出的文件压缩包manSkinning.rar,其中:
- manSkinning.max为第一个制作的简陋模型的max文件
- manSkinningRaiseLeft.max只包含提左腿的动画
- manSkinningRaiseRight.max只包含提右腿的动画
- manSkinningX.X为Panda插件导出的X文件
- manSkinningKW.X为KW插件导出的X文件
- manSkinningFbx1.FBX为只包含提左腿动画的fbx文件
- manSkinningFbx.FBX为包含两个动画的fbx文件
- AlienOriginal.max为第二个人物的原始max文件
- AlienCompound.max为将眼球和身体组后后制作了两个动画的max文件
- AlienSkeletonAnimationX.X,AlienSkeletonAnimationKW.X,AlienSkeletonAnimationFBX.FBX分别为三种导出文件
- AlienBipedOriginal.max为使用biped并包含一个行走动画的max文件
- AlienBipedAnimationX.X,AlienBipedAnimationKW.X,AlienBipedAnimationFbx.FBX对应上面这个行走动画的三种导出文件。
发布时间:2010/6/4 下午4:23:55 阅读次数:16502