DirectX9.0c SDK学习笔记(一)

Direct9.0c SDK中提供了一个叫DXviewer的*.x格式文件查看器的源码,代码给出了基于DXUT框架的模型显示接口使用方法,

对于我想编写一个动作捕捉的上位程序是大有助益的。

我的想法是基于这个显示框架,实现实时导入经过四元数运算修改骨骼动画之后的*.x文件。而这就需要研究*.x模型文件的骨骼

动画部分的数据格式,经过查找资料,详细解释如下:

骨骼在.X文件里面用模板Frame来定义。

看看带骨骼的.X文件,一般的结构是:

Frame Frame1

{

FrameTransformMatrix

{

}

Mesh Mesh1

{

}

}

FrameTransformMatrix 表示了骨骼相对模型中心的变化矩阵,假如我们人的中心位置是在躯体的中心(大概是胃的位置),手臂的骨骼离那个位置是有一些偏移的,这个矩阵就是用来计算这个偏移信息的。

Mesh1是表示附属在Frame1上的模型顶点信息。比如我们手臂的骨头动了,附在上面的皮肤和肉都要动,在3D里面这些是用三角形来表示的。因此Mesh1表示Frame1影响到得顶点的信息。

要想产生动画, 光有骨骼还不行,必须得有描述这些骨骼在某一时候如何运动的信息。在.X文件里面,这些运动信息用模板AnimationSet来描述。

AnimationSet walk

{

Animation Animation1

{

{Frame1}

AnimationKey

{

}

}

Animation Animation2

{

{Frame2}

AnimationKey

{

}

}

}

以上是AnimationSet一般结构。要想产生walk(走路)的动作,要让脚动,有时候手也要动。Animation就记录了运动的骨骼的信息。在这个动作里面,走路要动的骨骼是Frame1,和Frame2。

那么怎么知道Animation里面骨骼在某个时候怎么运动呢?这些信息就放在AnimationKey里面。下面是AnimationKey的一个实例

AnimationKey AnimationKey1

{

4;

6;

0;16;0.881635,-0.111735,0.458514,0.000000,0.114895,0.993153,0.021101,0.000000,-0.457732,0.034078,0.888437,0.000000,-0.303751,9.349454,-0.603032,1.000000;;,

160;16;0.881635,-0.112752,0.458265,0.000000,0.114895,0.993104,0.023303,0.000000,-0.457733,0.032108,0.888510,0.000000,-0.304559,9.352407,-0.603871,1.000000;;,

320;16;0.881635,-0.113764,0.458015,0.000000,0.114896,0.993050,0.025496,0.000000,-0.457733,0.030146,0.888579,0.000000,-0.305481,9.355353,-0.604827,1.000000;;,

480;16;0.881635,-0.114774,0.457763,0.000000,0.114896,0.992992,0.027686,0.000000,-0.457733,0.028186,0.888643,0.000000,-0.306449,9.358295,-0.605831,1.000000;;,

640;16;0.881634,-0.115785,0.457509,0.000000,0.114896,0.992928,0.029878,0.000000,-0.457733,0.026225,0.888703,0.000000,-0.307393,9.361239,-0.606811,1.000000;;,

800;16;0.881634,-0.116798,0.457252,0.000000,0.114897,0.992859,0.032076,0.000000,-0.457733,0.024258,0.888759,0.000000,-0.308247,9.364190,-0.607697,1.000000;;,

}

4表示变化信息是矩阵(0:旋转,1:平移,2:缩放) 6表示下面有6个关键帧。第一个关键帧中的0:表示起始时间,16表示矩阵是4*4的,接下来就是变化矩阵的信息了。

这里就有问题了,我们只知道时间点0, 160, 320, 480, 640, 800处的变化信息,那么在100或是200的时间点上骨骼怎么运动呢?这就需要对关键帧进行线性插值。比如时间t1处变化矩阵是mat1, 时间t2处变化矩阵是mat2, 当t1<=t<t2时,mat = mat1+(mat2-mat1)*t/(t2-t1)。把100代入到上面的公式用AnimationKey1数据表示:mat=mat1+(mat2-mat1)*100/160, mat1,mat2是已知的,所以就可以得到mat。

就这样,walk这个动作的所有信息就可以表示了。

以上讲的骨骼(Frame)只包含了一个受影响的Mesh的顶点信息,这样的话,一个顶点只能受一块骨头影响,这样明显不符合实际情况(比如人的上臂和下臂过渡区得皮肤,明显要同时受到上臂骨骼和下臂骨骼的影响)。

如果一个顶点只受一个骨骼影响,比较明显的情况就是在两块骨头的过渡区间会产生撕裂现象。蒙皮动画就是为解决这个问题而产生的。下面是对蒙皮信息的定义:

SkinWeights

{

"Bip01_L_Clavicle";

2;

150,

3512;

0.303157,

0.601147;

1.253361,-0.000002,0.254069,0.000000,-0.218659,-0.223923,1.078679,0.000000,0.058231,-1.440720,-0.287275,0.000000,-8.131670,62.204407,-2.611076,1.000000;;

}

SkinWeights

{

"Bip01_Neck";

2;

150,

2100;

0.696843,

0.601147;

1.253361,-0.000002,0.254069,0.000000,-0.218659,-0.223923,1.078679,0.000000,0.058231,-1.440720,-0.287275,0.000000,-8.131670,62.204407,-2.611076,1.000000;;

}

第一个蒙皮该信息表示 索引值为2,150号的顶点受到骨骼Bip01_L_Clavicle的影响,影响的权重是0.303157,0.601147; 这里解释一下权重的概念。DX9最多支持一个顶点受到4个骨骼影响,

假设一个顶点受到4个骨骼影响,骨骼对应的矩阵分别是mat1,mat2,mat3,mat4. 权重是w1,w2,w3,w4。那个最终顶点变换矩阵就是mat1*w1+mat2*w2+mat3*w3+mat4*w4。必须满足w1+w2+w3+w4=1

由上面的信息看出 150号顶点只受到Bip01_L_Clavicle,Bip01_Neck两个骨骼的影响(应为0.303157+0.696843=1).至于最后一个变换矩阵,还需下一步具体研究。

时间: 2024-08-10 17:21:11

DirectX9.0c SDK学习笔记(一)的相关文章

IOS Vuforia SDK学习笔记

最近可能工作会用到关于AR方面的东西 所以找了一下有名气的AR库 发现2个:Metaio和Vuforia 先说说Metaio 我看了看网上的反应 好像这个库反响不错 用的人蛮多的.但是悲催的是 我7月1号去看的时候已经无法注册新用户了.没办法用 因为它被苹果收购了,也不知道该高兴还是该忧伤  好像目前是没办法用了.只好找了别的,比如:Vuforia Vuforia是个啥? Vuforia™是Qualcomm Connected Experiences, Inc.的产品.它是一款针对移动设备开发增

Android第三方SDK学习笔记(二)

今天来看jni的部分吧 主Activity里static 的System.loadLibrary("String"); 这句话是为了加载你所加载的库,可能是文件也可能是一个命名空间等. public native functionName();这个是声明你在jni里需要调用的函数,只用做声明不用去定义实现他. 一般就只是传递一些基本类型,复杂类型我也不知道该如何去做,这就够了. 传递的大多是些整形的或者字符型的变量,这些就是买的游戏里的东西或者传递的一些简单消息. 因为java和c是不

IOS Vuforia SDK学习笔记(二)

上次我们已经完美运行了官方的demo,这次写一下如何添加自己的识别图 上传识别图 我们先到官网上的develop选项卡下的TargetManager 添加一个Database 选择Device后点击Create就可以创建出一个Database 点击进入新创建的Database后选择 add Target添加 Type选择Single Image 选择电脑上的一张图片(最大不能超过2MB)Width可以自己定 Name可以自己定(唯一) 然后就可以看到已经创建好了一张识别图(Rating)这个选项

一起学ASP.NET Core 2.0学习笔记(一): CentOS下 .net core2 sdk nginx、supervisor、mysql环境搭建

作为.neter,看到.net core 2.0的正式发布,心里是有点小激动的,迫不及待的体验了一把,发现速度确实是快了很多,其中也遇到一些小问题,所以整理了一些学习笔记: 阅读目录 环境说明 安装CentOS7 安装.NET Core SDK for CentOS7 搭建ftp服务器 安装mysql 部署ASP.NET Core应用程序 配置Nginx 配置守护服务(Supervisor) 环境说明 服务器系统:CentOS 7.3 64位 相关工具:putty.Xftp 服务器软件软件:.n

DirectX 11游戏编程学习笔记之7: 第6章Drawing in Direct3D(在Direct3D中绘制)(重点回顾+勘误)

        本文由哈利_蜘蛛侠原创,转载请注明出处!有问题欢迎联系[email protected]         注:我给的电子版是700多页,而实体书是800多页,所以我在提到相关概念的时候,会使用章节号而非页码.同样的情况适合于"龙书"第二版. 上一期的地址: DX 11游戏编程学习笔记之6 这一章应该是本书最长的一章了,可能也是最难的一章,所以大家一定要好好消化,仔细学习!这一章大致相当于"龙书"第二版的第7章和第8章,还添加了一些别的东西. 由于这一

DirectX 11游戏编程学习笔记之1: 开场白

本文由哈利_蜘蛛侠原创,转载请注明出处.有问题欢迎联系[email protected] ? ? ? ? ? 这是我之前的博客系列"DirectX9.0c游戏开发手记之'龙书'第二版学习笔记"的平行版,也可以说是续集. 说是平行版,由于这两个博客系列由于某种显而易见的原因.内容是非常平行的:而之所以说是续集,是由于前面那个系列可能就此坑掉了-- ? ? ? ? 前面那个系列是关于"龙书"第二版的学习笔记的.而这一系列是关于"龙书"第四版的.&qu

java/android 设计模式学习笔记(14)---外观模式

这篇博客来介绍外观模式(Facade Pattern),外观模式也称为门面模式,它在开发过程中运用频率非常高,尤其是第三方 SDK 基本很大概率都会使用外观模式.通过一个外观类使得整个子系统只有一个统一的高层的接口,这样能够降低用户的使用成本,也对用户屏蔽了很多实现细节.当然,在我们的开发过程中,外观模式也是我们封装 API 的常用手段,例如网络模块.ImageLoader 模块等.其实我们在开发过程中可能已经使用过很多次外观模式,只是没有从理论层面去了解它. 转载请注明出处:http://bl

Android学习笔记——关于onConfigurationChanged

从事Android开发,免不了会在应用里嵌入一些广告SDK,在嵌入了众多SDK后,发现几乎每个要求在AndroidManifest.xml申明Activity的广告SDK都会要求加上注明这么一句属性: android:configChanges="orientation|keyboard|keyboardHidden" 通过查阅Android API可以得知android:onConfigurationChanged实际对应的是Activity里的onConfigurationChan

Android NDK学习笔记(一) 为什么要用NDK?

NDK是什么 NDK是Native Development Kit的简称,即本地开发工具包.通过NDK,Android允许开发人员使用本地代码语言(例如C/C++)来完成应用的部分(甚至全部)功能.注意:由于翻译原因,有些地方也把Native翻译为"原生". NDK是SDK的一个补充,可以帮助你做这些事情: 生成可以在ARM CPU,Android 1.5(及以上)平台运行的JNI兼容的共享库. 将生成的共享库放置在应用程序项目路径的合适位置,使其能自动地添加进你最终的(和经过签名的)