蒙皮动画模型(Skinned Model)示例
本示例展示了如何使用XNA框架的内容管道处理和绘制一个蒙皮动画模型。
原文地址:http://creators.xna.com/en-US/sample/skinnedmodel。
示例概览
XNA框架对动画只提供部分支持。它定义了一个中间对象模型在内容管道中存储了动画数据,可以从FBX和X格式中导入动画数据。内建的ModelProcessor也可以将顶点通道中的BoneWeightCollection数据转换到VertexElementUsage BlendIndices和BlendWeight两个通道,这样就可以用于GPU上的蒙皮绘制。但是,框架并没有包含实时动画类,这个功能是由本示例实现的。
最小Shader配置
Vertex Shader Model 2.0
Pixel Shader Model 2.0
示例控制
本示例使用以下键盘和手柄控制。
动作 | 键盘控制 | 手柄控制 |
旋转模型 | 方向键或W, S, A,D | 右摇杆 |
变焦 | Z和X | Triggers |
重置 | R | 按下右摇杆 |
退出 | ESC或ALT+F4 | BACK |
工作原理
本示例有三个项目。
- SkinnedModel包含几个类用于保存和播放动画数据。这些类既用于内容管道处理也用于游戏的实时处理。
- SkinnedModelPipeline是一个内容管道项目。它实现了一个新的内容管道处理器构建蒙皮模型。
- SkinningSample是一个展示如何绘制蒙皮动画模型的示例。
这个示例包含不同的SkinnedModel和SkinningSample项目用来开发Windows或Xbox 360。但只需一个SkinnedModelPipeline项目,它只运行在Windows平台。
Xbox 360解决方案文件同时包含Xbox 360和Windows版本的SkinnedModel项目。这个项目既用于内容创建的处理(在Windows平台),也用于实时处理(在Xbox 360平台),所以必须在两个平台上构建这个项目。
要绘制蒙皮模型,我们需要两样东西:
- 一个effect实现网格的变形。
- 一些动画数据表示网格如何进行变形。
SkinnedModelProcessor从XNA提供的Moedl类中提取所需的信息。
SkinnedModelProcessor.ConvertMaterial方法通过创建一个EffectMaterialContent类实例将新的effect施加到模型上。它根据输入的材质将纹理信息进行复制,但总是将Effect属性设置为SkinnedModel.fx文件的引用。
注意:虽然蒙皮模型使用的effect包含在Game Studio项目文件中,但它不是内容管道的一部分。因为它被SkinnedModelProcessor引用,所以会自动创建,所以无需把它复制到内容管道项目中,本例中放在内容管道的目的是为了可以容易地查看并编辑effect代码。
动画数据被SkinnedModelProcessor.ProcessAnimations方法转换到一个合适的实时格式,这个方法将一个自定义的SkinningData对象存储在Model实例的Tag属性中。
扩展示例
AnimationPlayer类只能一次播放一个动画。你可以实现不同动画的混合,方法是通过对几个AnimationPlayer实例调用UpdateBoneTransforms播放模型不同部分的不同动画,然后在调用UpdateWorldTransforms和UpdateSkinTransforms之前将结果矩阵混合到BoneTransforms数组中。
源代码SkinningSample_3.1.rar下载(注释已翻译为中文)
文件下载(已下载 1417 次)发布时间:2010/6/7 下午12:07:58 阅读次数:9377