`
daojin
  • 浏览: 678081 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

3D模型初探(人体运动学)

阅读更多
一。了解骨骼结构(Skeletal Structures)和骨层级(Bone Hierarchies)
代码如下:

骨骼从本质上来说应该是一个n叉树形结构。

FrameRoot->Frame1->frame10
                   frame11
                   frame12
                    ...
          
           Frame2
          
                    ... 
          
           Frame3
                    ...


然后为了简化处理:

利用变换将 n 叉树转换为2叉树:

变换后为:
       
FrameRoot->Frame1->childframe10
                  
              |     frame12
              |     ...
          
           BrotherFrame2
              |
              |     ... 
             
           BrotherFrame3
                    ...

也就是下面这个理论:


一个父骨仅仅有一个子骨和一个兄弟骨。


下面这个问题是如何给骨骼定位:

    骨骼的位置是由它的变换矩阵(相对于初始位置)决定的:

    而mesh决定了它的顶点坐标。
   模型:

class 骨骼{
      矩阵(4X4) 变换矩阵
       网格点表数组(mesh)
   };


因此有下面这个模板:
template Frame
{
        < 3D82AB46-62DA-11cf-AB39-0020AF71E433 >
        FrameTransformMatrix frameTransformMatrix;      // 骨骼相对于节点的坐标变换矩阵,就是一个matrix
        Mesh mesh;                                      // 骨骼的Mesh
}



它的抽象层级很高.

给骨架下了这么个定义:


1.有网格点 mesh
2.能进行变换

骨骼是有了,可是没有显示出它与其他骨骼的关系啊?


问题是“骨架”在哪里?


上面说过,骨架就是一个二叉树(由n叉树变换过来)


class 骨架{
  骨架名称 name;       // 骨骼名称   
  骨架*  pFrameSibling;//指向兄弟  
  骨架*  pFrameFirstChild;//指向第一个孩子
   骨骼    Frame;//本节点骨骼数据
}
下面考虑如何实现的问题:

一个人体是一个骨架:

腰盘骨 -----》根骨

头骨-------》第一子骨

胸骨------》第一子骨的兄弟骨1

两个胳臂骨--》第一子骨的兄弟骨2

两个大腿骨-》第一子骨的兄弟骨3

首先:

所有的骨头通过各种变换安装到了人的骨架之上。

所以:

怎么装上去的呢?

在.X文件中,专门保存了这么个矩阵:

D3DXMATRIX matOriginal;   // 从X文件加载的原始变换矩阵


这个矩阵定位了骨骼的原始位置。



以后,所有的变换都要从它开始。


幸运的是,骨骼的模板中(上面的Frame)已经有了个变换矩阵:


FrameTransformMatrix frameTransformMatrix;


它表示一个目前将要发生的变换。



而下面这个东西是累计变换矩阵:



D3DXMATRIX matCombined;   // 组合变换矩阵,用于储存变换的骨骼矩阵


mathCombined



下面这个结构体让骨骼能够随意扭动,飞奔!!!


struct D3DXFRAME_EX : D3DXFRAME
{
D3DXMATRIX matCombined;   // 组合变换矩阵,用于储存变换的骨骼矩阵
D3DXMATRIX matOriginal;   // 从X文件加载的原始变换矩阵
D3DXFRAME_EX()
{
    Name = NULL;
    pMeshContainer = NULL;
    pFrameSibling = pFrameFirstChild = NULL;
    D3DXMatrixIdentity(&matCombined);
    D3DXMatrixIdentity(&matOriginal);
    D3DXMatrixIdentity(&TransformationMatrix);
}

~D3DXFRAME_EX()
{
    delete [] Name;          Name = NULL;
    delete pFrameSibling;    pFrameSibling = NULL;
    delete pFrameFirstChild; pFrameFirstChild = NULL;
}
}


到这里,应该都很清楚了哈。至于如何便利骨架。二叉树么,如何读取模型文件,.X文件,

很简单了。。


不说了。。


动画呢?


如何实现呢?关键帧技术?矩阵插值?


定义帧:(关键帧跟帧一样)


class 帧
{
骨架 骨架//骨架
Time time;//时间
}

根据time,对骨架的Matrix 线性插值就可以了,插值很复杂啊啊啊 啊 啊!!!不说了

下面是动画:

animation


class 骨骼动画
{
  //渲染某一帧:
  GetTimeFrame(temptime,关键帧original,关键帧terminal);
  //播放
  replay(time1,time2)
  {
    for(time=time1,time=time+间隔,time<time2){
     Frame f=GetTimeFrame(temptime,关键帧original,关键帧terminal);
     render(f);
   }
}
}


结束了。哈哈简单吧。。。希望有人能把,根据time,对骨架的Matrix 线性插值就可以了,插值很复杂的算法给我。。。谢谢了哈


wa505@126.com

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics