蒙皮动画模型(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

工作原理

本示例有三个项目。

  1. SkinnedModel包含几个类用于保存和播放动画数据。这些类既用于内容管道处理也用于游戏的实时处理。
  2. SkinnedModelPipeline是一个内容管道项目。它实现了一个新的内容管道处理器构建蒙皮模型。
  3. SkinningSample是一个展示如何绘制蒙皮动画模型的示例。

这个示例包含不同的SkinnedModel和SkinningSample项目用来开发Windows或Xbox 360。但只需一个SkinnedModelPipeline项目,它只运行在Windows平台。

Xbox 360解决方案文件同时包含Xbox 360和Windows版本的SkinnedModel项目。这个项目既用于内容创建的处理(在Windows平台),也用于实时处理(在Xbox 360平台),所以必须在两个平台上构建这个项目。

要绘制蒙皮模型,我们需要两样东西:

  1. 一个effect实现网格的变形。
  2. 一些动画数据表示网格如何进行变形。

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  阅读次数:8933

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

沪 ICP 备 18037240 号-1

沪公网安备 31011002002865 号