Direct-X学习笔记--骨骼动画

学习DirectX几个月后,终于掌握了骨骼动画技术。本文将介绍如何让3D模型动起来,包括简介、X文件解析和一个易用的骨骼动画类的封装。
摘要由CSDN通过智能技术生成

学了几个月DX了,终于到了骨骼动画这一步了,好激动!之前导入过一些静态的模型,还是挺帅的。不过不能动,实在是太遗憾了。今天学习了骨骼动画,终于让偶的模型动起来啦!!!

一.简介

说到动画,其实本人又想起了最早开始写小游戏的时候从网上找的那些关键帧素材,设置一个定时器,或者根据游戏循环,不断切换图片,就形成了动态的效果。不过这样实在是太麻烦了,需要美术一张一张的画图或者用PS调整。到了3D时代,骨骼动画这个神器,可以大大的缩短动画的制作周期。
3D中的动画,就是我们常说的模型动画。一共有三种:
1.关节动画:将网格拆分为多个刚体,按照关键帧插值运算,能够实现复杂的动画效果。但是,模型各部分交接的地方容易出现缝隙。
2.渐变动画:与2D游戏中的关键帧类似,每一帧的所有顶点位置等等都记录下来,效果很好,但是由于记录的数据太多,文件很大,载入很慢,还占地方。
3.骨骼蒙皮动画:这种就是现在最常用的方法,取上两者之精华,去之糟粕。占用空间小,但是表现力还很好。

骨骼蒙皮模型中含有按照一定层次组织起来的骨骼,还含有单一网格模型的蒙皮。骨骼层次仿照关节动画的组织结构将模型组织成一个整体,相邻骨骼之间通过关节相连,通过关键帧确定骨骼位置朝向等信息,然后再动画序列中相邻两个关键帧之间做差值运算,获得完整的动画信息。这样就可以很好的表现出动画,而又不至于占用过大空间。


二.X文件

.X文件,之前也有用过,LoadMeshFromFile。就是简单的把网格载入程序中,读取其中的顶点信息,纹理材质信息,然后调用DX的API将它画出来。不过,这只是普通的网格,其实X文件中还可以包含更加深层次的东东,就是骨骼动画。
这个是微软自带的例子:SkinMesh中的那个人物,自带了骨骼动画。看一下.X文件中记录了什么东东:
AnimationSet 动画的组合,包括一个或者多个Animation。
  Animation 描述一个动画,包含一个或几个AnimationKey
  AnimationKey 动画关键帧,定义具体的动作数据,包括一些列旋转、移动、放缩、矩阵变换。
  ColorRGB 定义RGB对象,包括三个Float的值,分别是R、G、B。
  ColorRGBA 定义RGBA对象。包括四个Float的值,分别是R、G、B、alpha。
  Coords2d 定义纹理坐标向量,包括两个Float值,分别是u、v。
  FloatKeys 定义浮点数组,用来定义动画键数值,包括两个部分:浮点值个数,浮点值列表。
  Material 定义材质信息,可以被应用到一个完整的Mesh对象,也可以应用到其中的一个面。包含:
           1.FaceColor环境光
           2.Power镜面反射的强度
           3.specularcolor镜面反射等等。
  Matrix4X4 定义4X4矩阵,16个浮点数值。
  Mesh 定义个Mesh对象,共有9个部分组成:
1、包含的顶点数
2、顶点列表,一个顶点包含三个浮点值
3、面数
4、面的顶点索引列表,每个面包含三个顶点
5、MeshFaceWraps 结构,暂时无用
6、MeshTextureCoords纹理坐标,可选
7、MeshNormals 法向,可选
8、MeshVertexColors 顶点颜色,默认为白色
9、MeshMaterialList 材质,不提供的话默认为白色。
  MeshFace 面索引,包含两部分:面数,定点索引构成的面数组。
  MeshTextureCoords 定义纹理坐标,包括:纹理坐标的个数,纹理坐标(每个纹理坐标有两个浮点值)。
  MeshMaterialList 定义材质的应用,包括:多少个材质被使用,材质影响面的个数,面索引。
  MeshNormals 定义Mesh的法向量,包括4部分:
1.nNormals法向量的个数=顶点数
2.Normals顶点法向量列表
3.nFaceNormals面的个数
4.FaceNormals面对应的法向量。
  MeshVertexColors  指定顶点的颜色代替原来的材质,包含:顶点数目,颜色索引
  TextureFilename  纹理的名称,字符串类型。
  VertexDuplicationIndices  保留副本,用于精简Mesh的操作,包含:顶点数,原始顶点数,实际顶点数。
  XSkinMeshHeader  描述被导出的SkinMesh相关信息,影响一个顶点的最多变换数目,影响每个面三个顶点的最大变换数目,影响一个顶点的骨骼数。
  TimedFloatKeys 时间值,用于Animaterkey中定义时间间隔。
  Vector 三维向量,三个浮点值。
  SkinWeights 定义骨骼影响权重。包括以下几个部分:骨骼的名字,有多少个权重值,顶点的索引列表等等

三.封装一个容易使用的骨骼动画类

DX这个.X文件也看不太懂,不过,我们也没必要看懂这个,关键还是怎么用。给我们一个带动画的.X文件,我们能够把它读取,并播放出来才是最重要的。这个骨骼动画相关的内容貌似还是比较难,不过好在网上有一些教程,最重要的是DX官方文档给的那个例子,其实已经封装了一个可以使用的骨骼动画类。不过他还需要几个全局函数和全局变量才能读取并绘制出骨骼动画,还是没有彻底封装。所以,我们进一步把这几个函数和全局变量加上DX给的那个类,进行再次封装,写一个简单粗暴的骨骼动画类。只用几步就可以播放骨骼动画。
AllocateHierarchy.h文件(DX官方给出的类):
/*!
 * \file AllocateHierarchy.h
 *
 * \author puppet_master
 * \date 九月 2015
 *
 * \微软SDK自带的关于骨骼动画的类,用于骨骼动画的创建以及绘制更新
 * \注:程序不直接使用该类,而是将此类二次封装后再使用。
 */

#ifndef __ALLOCATEHIERARCHY_H_
#define __ALLOCATEHIERARCHY_H_

//--------------------------------------------------------------------------------------
// Name: struct D3DXFRAME_DERIVED
// Desc: 
//--------------------------------------------------------------------------------------
struct D3DXFRAME_DERIVED : public D3DXFRAME
{
	D3DXMATRIXA16 CombinedTransformationMatrix;
};


//--------------------------------------------------------------------------------------
// Name: struct D3DXMESHCONTAINER_DERIVED
// Desc: Structure derived from D3DXMESHCONTAINER so we can add some app-specific
//       info that will be stored with each mesh
//--------------------------------------------------------------------------------------
struct D3DXMESHCONTAINER_DERIVED : public D3DXMESHCONTAINER
{
	//纹理信息
	LPDIRECT3DTEXTURE9* ppTextures;       //纹理数组  

	//网格信息             
	LPD3DXMESH pOrigMesh;					//原始网格
	LPD3DXATTRIBUTERANGE pAttributeTable;	//属性表
	DWORD NumAttributeGroups;				//属性组数量(子网格数量)
	DWORD NumInfl;							//每个顶点最多受几个骨骼影响
	LPD3DXBUFFER pBoneCombinationBuf;		//骨骼结合缓存
	D3DXMATRIX** ppBoneMatrixPtrs;			//骨骼组合变换矩阵
	D3DXMATRIX* pBoneOffsetMatrices;		//骨骼初始变换矩阵
	DWORD NumPaletteEntries;				//骨
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值