MS3D模型骨骼动画
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MS3D模型骨骼动画MS3D Model Skeleton Animation
Copyright© 2009 JJ
骨骼动画介绍
当前有两种模型动画的方式:顶点动画和骨骼动画。顶点动画中,每帧动画其实就是模型特定姿态的一个“快照”。通过在帧之间插值的方法,引擎可以得到平滑的动画效果。在骨骼动画中,模型具有互相连接的“骨骼”组成的骨架结构,通过改变骨骼的朝向和位置来为模型生成动画。
骨骼动画比顶点动画要求更高的处理器性能,但同时它也具有更多的优点,骨骼动画可
以更容易、更快捷地创建。不同的骨骼动画
可以被结合到一起——比如,模型可以转动头
部、射击并且同时也在走路。一些引擎可以实
时操纵单个骨骼,这样就可以和环境更加准
确地进行交互——模型可以俯身并向某个方
向观察或射击,或者从地上的某个地方捡起一
个东西。多数引擎支持顶点动画,但不是所有的引擎都支持骨骼动画。
一些引擎包含面部动画系统,这种系统使用通过音位(phoneme)和情绪修改面部骨骼集合来表达面部表情和嘴部动作。
以上是百度知道对骨骼动画的解释,所谓骨骼动画就是一种关节的动画,关节直接有某种动作的变化,比如手臂和手的就是一种骨骼动画,手臂的转动会带动手的移动和转动,这个关系就是父节点运动对子节点的影响。至于数学上的关系后面阐述。
MAX里的蒙皮和骨骼动画关键帧
接下来简单介绍如何在max里蒙皮步骤。
1、建立模型后,在对应的位置建立骨骼,建立骨骼有很多种方法,这
里用的MAX9.0有一个叫做Biped的工具,快速建立人体骨骼。(注意一般来
如你建立的模型的姿势对后面蒙皮很重要所以一般建模的人体模型都是四
肢张开的这样方便后面的处理)。
2、接下来你需要做的是将骨骼的关节移动到你模型的关节上。点击任
意一骨骼,单击左图中的小人,进入体型模式,这一步调整需要精确,将骨
骼摆放到模型的最佳位置。
3、调整完后你的模型的姿势就是这个模型的标准姿势,可以关掉体型
模式调整模式。
4、接下来要蒙皮,单击模型,进入网格编辑,添加修改器列
表的Physigue,然后点击附加到节点此时MAX会让你选择一个骨骼,
你需要选择这个骨骼的跟节点,然后单击初始化,这个时候max为你的模型自动绑定了节点。
5、单击网格修改器列表里的Physigue,点中封套,此时你可以修改封套,以正确的将顶点绑定到节点。这是个需要耐心的步骤,如果在这之前你已经完成了模型分UV的步骤,绘制贴图纹理的步骤,那修改封套对你来说不算什么。完成这步模型的处理已基本完成。
6、设置动画关键帧,这
一步根据你模型的需要而定,
你可以为模型添加一系列动
作这样你就可以在程序里播
放对应的动画。添加动画的步
骤比较复杂,你可以寻找max
的动作库导入动作,也可以自
己设置模型几个关键的pose,
并且调整动画曲线就可以做
出骨骼动画,至于器原理可以参考动画原理,其中有介绍人走路的动画,如果你能自己独立完成一个人走路的动画序列,那么相信你也能完胜其他动画了。
如何从MAX导入带骨骼动画的模型到MilkShape 3D
1、剩下最后一步导出到ms3d格式,可惜max并没有提供
这个插件,如果你不会写max的输出插件,那么你可以像我一
样,通过Unreal Tech ActorX插件间接的导入网格和骨骼到
ms3d,这个插件可以在官方网
/Two/ActorX.html下载来。安装好
插件后,你可以通过左图的设置输出.Psk和.Psa。其中psk
是网格,psa是骨骼动画。在输入网格的时候要注意,为了减
少ms3d里的麻烦,你必须将体型模式下的骨骼导出,前面说
过那个是标准姿势甚至在后面程序里也很关键。位骨骼动画设
置名字和关键帧范围后,可以安吉Animation manager后,右
移你的动作save。这个时候MAX的任务也就完成了。
2、打开MilkShape 3D,先导入psa,在导入psk,这个时
候,如果你前面没啥差错骨骼和模型是严格的按照你的标准姿势,单击后你可以拖动滚动条块观察你刚才导入的动画,然后你需要设置一下贴图,这里MilkShape 3D 对贴图名称有限定,不过貌似新版本没,名字尽量用英文。之后如果模型动作贴图都没有错误,保存被ms3d格式就可以了。此时导出的就是一个能够在游戏程序里使用的模型了。
MilkShape 3D 模型格式(ms3d)
任何一个模型文件想要使用都要了解他的文件结构,建立对应的数据类型通过文件指
针读取保存到内从中。一下的格式是从ms3d 官方开发包里提取出来的。
首先从这段代码可以了解到ms3d 支持的顶点数和面数,六万面对一个PC 游戏来说足够了,
当然人家次时代和这个不是一个数量级的。
#define MAX_VERTICES 65534
#define MAX_TRIANGLES 65534
#define MAX_GROUPS 255
#define MAX_MATERIALS 128
#define MAX_JOINTS 128
接下来是ms3d 文件里得东西。由于内容很多所以精简出来,就是一个ms3d 模型由几个
网格组和骨骼构成。
1. 每个网格保存了里面所以三角形(TRIANGLES)的索引,而每个TRIANGLES 保存了三个
顶点的索引,每个顶点保存了三个float 型,也就是点的XYZ 坐标。其中每个顶点指定
了一个绑定的节点,当然也可以指定多个节点并附上权值来规定节点对顶点的影响程
度。
2. 每个骨骼都存储了该骨骼对应于父节点的相对变换包括Position 和Rotation 变换。根
节点的的坐标是也是绝对坐标。
由此可以设计出读取ms3d 格式的函数。你也可以用别人现成的不过一定要选择一个适合的,
应为以后的编程都是基于这个读取展开的,如果其类写的不好,会增加不必要的麻烦。
参考:
*************** 顶点 **************** typedef struct { byte flags; float vertex[3]; char boneId; byte referenceCount; } ms3d_vertex_t; ***************三角形**************** typedef struct { word flags; word vertexIndices[3]; float vertexNormals[3][3]; float s[3]; float t[3]; byte smoothingGroup; ************多边形组******************
typedef struct
{
byte flags;
char name[32];
word numtriangles;
word triangleIndices[numtriangles]; char materialIndex;
} ms3d_group_t;
***********材质和贴图****************
typedef struct
{
char name[32];
float ambient[4];
float diffuse[4];
float specular[4];
float emissive[4];
float shininess;