【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 3342|回复: 0

[DirectX] Skinned Mesh学习笔记 (1)

[复制链接]
发表于 2008-11-5 09:22:53 | 显示全部楼层 |阅读模式
学习资料:
<Skinned Mesh Character Animation with Direct3D 9.0c>
    by Frank Luna (www.moon-labs.com)
[1 an Overview of Character Mesh Hierarchies]
[1.1]
1) 有两个空间,一个是bone space,一个是character space,其实都是一套坐标系。显示模型的时候,先把bone的从bone的坐标系转换到character的坐标系,形成了character以后,再转换到world坐标系。
2) bone有自己的local transform {L},其中包含一个旋转和一个移动(offset)。
3) bone也有一个combined transform {C},用来把bone从bone坐标系转换到character坐标系。
4) L中的offset是为了方便求出C,arm的例子非常形象。
5) 转换是带有世袭性的,对一个bone的转换同时作用给该bone所有的孩子。
[1.2]
1) 一个典型的继承式结构:
Pelvis
 |
 +-Left Thigh
 |  |
 |  +-Left Calf
 |     |
 |     +-Left Foot
 +-Right Thigh
 |  |
 |  +-Right Calf
 |     |
 |     +-Right Foot
 +-Lower Spine
    |
    +-Upper Spine
       |
       +-Neck
          |
          +-Left Clavicle
          |  |
          |  +-Left Upper Arm
          |     |
          |     +-Left Forearm
          |        |
          |        +-Left Hand
          +-Right Clavicle
             |
             +-Right Upper Arm
                |
                +-Right Forearm
                   |
                   +-Right Hand
P.S. 其实我觉得至少也得有个Head吧…… -_-#
2)D3DXFrame的声明:
typedef struct D3DFRAME {
    LPSTR Name;
    D3DXMATRIX TransformationMatrix;
    LPD3DXMESHCONTAINER pMeshContainer;
    struct D3DXFRAME *pFrameSibling;
    struct D3DXFRAME *pFrameFirstChild;
} D3DXFRAME, *LPD3DXFRAME;
又见儿子-兄弟二叉树!看来多叉树都是这么表示的。一个D3DXFrame其实就是一个bone,不过D3DXFrame不仅仅可以用来做bone,还可以表示任何继承的结构(当然了,本身就是多叉树)。
3) 文章中说D3DXFrame不包含C,所以需要再定义一个。我怎么记得.x文件里面有local和conbined两个矩阵阿……,先note一下……
[1.3]
1) 在代码中也是通过frame->TransformationMatrix来储存local,而自己写了一个combined来存C的。
2) C(combined) = L(local) * P(parent's combined)
[2 Keyframes and Animation]
[2.1]
1) 这里只关心预先录制好的动画数据,即已经定义在模型中或者通过动作捕捉设备(估计这玩意不能便宜)捕捉到的动画数据。
2) 只要移动bone,附属于这个bone的mesh(skin)也相应移动。
3) 动画是通过“动画序列”来定义的。
4) 关键帧(Key Frame)是一个具有代表性的动作,两个关键帧之间的动作通过这两个关键帧插值得到。
5) 一个key frame包括一个rotation四元数、一个scaling向量和一个translation向量。
[2.2]
1) 缩放和平移通过D3DXVec3Lerp()做线形插值,而旋转通过D3DXQuaternionSlerp()做球面插值。
2) 对矩阵插值以后,旋转部分就不正确了。这也是为什么key frame要储存RST(Rotation/Scaling/Translation)而不是一个矩阵的原因。
3) Key Frame的定义:
struct Keyframe
{
    float time;
    D3DQUATERNION R;
    D3DXVECTOR3    S;
    D3DXVECTOR3    T;
};
4) 插值的步骤(给定关键帧K0、K1和当前时间t):
首先计算需要用于插值的参数lerp=(t-K0.time)/(K1.time-K0.time),然后插值得到新的RST,再把RST转换成相应的矩阵,最后matL=matR*matS*matT(matL就是一个bone在t时刻的local)。
5) 通常情况下T和S都是不需要变换的,所以不用插值,仅仅计算R即可。
6) 所有插值以后的的bone叫做interpolated-skeleton。
7) 其实插值是不需要手动计算的,通过ID3DXAnimationController就可以了。但是知道原理还是必要的。
[3 Rigid Body Animation; A Problem]
1) 可以通过递归来渲染整个模型。
2) 这种渲染方法叫做“刚体动画”。
3) 刚体动画在某些时候(例如旋转)会导致mesh的分离。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2025-2-6 07:09

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表