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程序中的截图:

Biped模型截图

以上就是我在导出文件时的操作,你可以试着做一下,有什么更好的做法请告知我。

最后是我导出的文件压缩包manSkinning.rar,其中:

文件下载(已下载 2024 次)

发布时间:2010/6/4 下午4:23:55  阅读次数:16502

2006 - 2024,推荐分辨率 1024*768 以上,推荐浏览器 Chrome、Edge 等现代浏览器,截止 2021 年 12 月 5 日的访问次数:1872 万 9823 站长邮箱

沪 ICP 备 18037240 号-1

沪公网安备 31011002002865 号