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).至于最后一个变换矩阵,还需下一步具体研究。
DirectX9.0c SDK学习笔记(一)的更多相关文章
- OpenXml SDK学习笔记(1):Word的基本结构
能写多少篇我就不确定了,可能就这一篇就太监了,也有可能会写不少. OpenXml SDK 相信很多人都不陌生,这个就是管Office一家的文档格式,Word, Excel, PowerPoint等都用 ...
- OpenXml SDK学习笔记(4):设置文件级别的样式
观察上一段日记最后的代码: 这里的样式基本可以理解为行内CSS.那么既然有行内的样式,就肯定有外部的样式.那这部分就对应笔记1里说的style.xml文件.这个文件对应的是Document.MainD ...
- RealThinClient SDK 学习笔记(1)
从客户端调用远程函数的两种方法 1: RtcClientModule1.Prepare('select'); // call the "select" function on th ...
- 一起学ASP.NET Core 2.0学习笔记(一): CentOS下 .net core2 sdk nginx、supervisor、mysql环境搭建
作为.neter,看到.net core 2.0的正式发布,心里是有点小激动的,迫不及待的体验了一把,发现速度确实是快了很多,其中也遇到一些小问题,所以整理了一些学习笔记: 阅读目录 环境说明 安装C ...
- golang学习笔记18 用go语言编写移动端sdk和app开发gomobile
golang学习笔记18 用go语言编写移动端sdk和app开发gomobile gomobile的使用-用go语言编写移动端sdk和app开发https://blog.csdn.net/u01249 ...
- Intel® Media SDK Media Samples Linux 学习笔记(转)
最近折腾intel media sdk,主要硬件平台是在HD4600的核显上进行测试,intel media sdk是intel提供的一种基于核显的硬件编解码的解决方案,之前已经有使用ffmpeg进行 ...
- go微服务框架kratos学习笔记五(kratos 配置中心 paladin config sdk [断剑重铸之日,骑士归来之时])
目录 go微服务框架kratos学习笔记五(kratos 配置中心 paladin config sdk [断剑重铸之日,骑士归来之时]) 静态配置 flag注入 在线热加载配置 远程配置中心 go微 ...
- DirectX 11游戏编程学习笔记之1: 开场白
本文由哈利_蜘蛛侠原创,转载请注明出处.有问题欢迎联系2024958085@qq.com 这是我之前的博客系列"DirectX9.0c游戏开发手记之'龙书'第二版学习笔记 ...
- react-native学习笔记--史上最详细Windows版本搭建安装React Native环境配置
参考:http://www.lcode.org/react-native/ React native中文网:http://reactnative.cn/docs/0.23/android-setup. ...
随机推荐
- MVC Route路由
由于某些原因,需要默认区域,所以需要对路由进行设置 具体实现如下: using System.Web; using System.Web.Mvc; using System.Web.Routing; ...
- 【jQuery系列之插件】jquery插件之jquery-validation
equalTo方法: equalTo: function( value, element, param ) { // Bind to the blur event of the target in o ...
- LeetCode - Customers Who Never Order
Description: Suppose that a website contains two tables, the Customers table and the Orders table. W ...
- ios 给键盘上面加上“完成”
#import <UIKit/UIKit.h> @interface FirstViewController : UIViewController<UITextFieldDelega ...
- Jmeter性能测试实践之java请求
前言 Apache Jmeter是开源.易用的性能测试工具,之前工作中用过几次对http请求进行性能测试,对jmeter的基本操作有一些了解.最近接到开发的对java请求进行性能测试的需求,所以需要 ...
- scrapy爬虫系列之二--翻页爬取及日志的基本用法
功能点:如何翻页爬取信息,如何发送请求,日志的简单实用 爬取网站:腾讯社会招聘网 完整代码:https://files.cnblogs.com/files/bookwed/tencent.zip 主要 ...
- Qt 模拟鼠标点击(QApplication::sendEvent(ui->pushbutton, &event0);)
QPoint pos(0,0);QMouseEvent event0(QEvent::MouseButtonPress, pos, Qt::LeftButton, Qt::LeftButton, Qt ...
- 广通软件荣获“2016年度ITSS优秀会员”称号
1月12日,为了表彰在IT服务标准研制和应用推广工作中所做出的贡献,中国电子工业标准化技术协会信息技术服务分会(以下称ITSS分会)在北京召开“2016年度ITSS优秀会员”专家评选活动,广通软件获得 ...
- 实现IT服务弹性伸缩的利器
随着互联网业务快速持续增长,IT资源使用量按需变化成为常态,这就要求信息部门能快速响应资源使用的变化要求,对运维提出不小挑战.比如电商.在线教育等企业经常推出一些秒杀.抢红包活动,在特定时间段对资源的 ...
- python分段算利润、税收
''' 题目:企业发放的奖金根据利润提成. 利润(I)低于或等于10万元时,奖金可提10%: 利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%: 2 ...