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

xiaoxiao2021-02-28  83

一。了解骨骼结构(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
转载请注明原文地址: https://www.6miu.com/read-73068.html

最新回复(0)