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学习笔记(一)的更多相关文章

  1. OpenXml SDK学习笔记(1):Word的基本结构

    能写多少篇我就不确定了,可能就这一篇就太监了,也有可能会写不少. OpenXml SDK 相信很多人都不陌生,这个就是管Office一家的文档格式,Word, Excel, PowerPoint等都用 ...

  2. OpenXml SDK学习笔记(4):设置文件级别的样式

    观察上一段日记最后的代码: 这里的样式基本可以理解为行内CSS.那么既然有行内的样式,就肯定有外部的样式.那这部分就对应笔记1里说的style.xml文件.这个文件对应的是Document.MainD ...

  3. RealThinClient SDK 学习笔记(1)

    从客户端调用远程函数的两种方法 1: RtcClientModule1.Prepare('select'); // call the "select" function on th ...

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

    作为.neter,看到.net core 2.0的正式发布,心里是有点小激动的,迫不及待的体验了一把,发现速度确实是快了很多,其中也遇到一些小问题,所以整理了一些学习笔记: 阅读目录 环境说明 安装C ...

  5. golang学习笔记18 用go语言编写移动端sdk和app开发gomobile

    golang学习笔记18 用go语言编写移动端sdk和app开发gomobile gomobile的使用-用go语言编写移动端sdk和app开发https://blog.csdn.net/u01249 ...

  6. Intel® Media SDK Media Samples Linux 学习笔记(转)

    最近折腾intel media sdk,主要硬件平台是在HD4600的核显上进行测试,intel media sdk是intel提供的一种基于核显的硬件编解码的解决方案,之前已经有使用ffmpeg进行 ...

  7. go微服务框架kratos学习笔记五(kratos 配置中心 paladin config sdk [断剑重铸之日,骑士归来之时])

    目录 go微服务框架kratos学习笔记五(kratos 配置中心 paladin config sdk [断剑重铸之日,骑士归来之时]) 静态配置 flag注入 在线热加载配置 远程配置中心 go微 ...

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

    本文由哈利_蜘蛛侠原创,转载请注明出处.有问题欢迎联系2024958085@qq.com           这是我之前的博客系列"DirectX9.0c游戏开发手记之'龙书'第二版学习笔记 ...

  9. react-native学习笔记--史上最详细Windows版本搭建安装React Native环境配置

    参考:http://www.lcode.org/react-native/ React native中文网:http://reactnative.cn/docs/0.23/android-setup. ...

随机推荐

  1. LeetCode——Generate Parentheses

    Description: Given n pairs of parentheses, write a function to generate all combinations of well-for ...

  2. Linux下TCP延迟确认(Delayed Ack)机制导致的时延问题分析

    版权声明:本文由潘安群原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/105 来源:腾云阁 https://www.qclo ...

  3. webpack中,css中打包背景图,路径报错

    css-loader: //打包样式中背景图 { test: /\.(png|jpg)$/, loader: "url-loader?limit=8192&name=images/[ ...

  4. intellijIDEA常用快捷键以及和Eclipse快捷键的对照

    ​CTRL + D 复制当前行到下一行  相当于eclipse中的 CTRL + SHIFT + 下 CTRL + /  单行注释和反注释 CTRL +SHIFT + / 块儿注释和反注释 CTRL ...

  5. C#IIS网站应用程序池启动回收停止 .

    //添加应用程序池空间引用using System.DirectoryServices;using System.Text; using System.Text.RegularExpressions; ...

  6. 网络费用流-最小k路径覆盖

    多校联赛第一场(hdu4862) Jump Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  7. Hibernate之核心文件

    一个Hibernate项目核心配置文件主要分为以下三个方面:1.配置文件hibernate.cfg.xml:2.配置文件*.hbm.xml,此文件一般包括映射文件的结构以及各种属性的映射方式:3.Hi ...

  8. 【node】----mocha单元测试框架-----【巷子】

    1.mocha简介 单元测试是用来对一个模块.一个函数.或者一个类来进行正确性的检测工作   特点:      既可以测试简单的JavaScript函数,又可以测试异步代码,           可以 ...

  9. JS拖拽事件

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. 170628、springboot编程之Druid数据源和监控配置一

    Spring Boot默认的数据源是:org.apache.tomcat.jdbc.pool.DataSource,那么如何修改数据源呢?我已目前使用比较多的阿里数据源Druid为例,如果使用其他的数 ...