`
daojin
  • 浏览: 690016 次
  • 性别: 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

分享到:
评论

相关推荐

    Milkshape 3D建模

    尽管Milkshape是一款试用版软件,但它提供的功能足以满足许多3D模型制作的需求。 首先,我们来了解一下Milkshape 3D的基本概念。3D建模是指在计算机中创建三维物体的过程,这包括了设计、塑造和纹理化等步骤。...

    VR虚拟技术初探.zip

    - **渲染引擎**:负责将3D模型转化为逼真的图像,实时地显示在HMD上。 - **交互算法**:处理用户的输入,更新虚拟环境的状态,确保实时性和响应性。 4. **应用领域** - **游戏娱乐**:VR为玩家提供了身临其境的...

    冒险者,unity3d游戏

    4. 导入资源:Unity支持多种格式的3D模型、音频和图片,可导入到项目中使用。 5. 设置物理引擎:Unity内置物理引擎,用于模拟现实世界的重力、碰撞等现象。 6. 测试与调试:使用Unity内置的播放器进行游戏测试,发现...

    Python与机械教育初探.zip

    通过matplotlib和Plotly进行3D绘图,能帮助学生直观地理解机械结构和运动轨迹。 综上所述,Python在机械教育中的作用不可忽视,它不仅简化了编程教学,而且为机械工程问题的解决提供了强大工具。随着技术的发展,...

    3d 坦克大战源码 要先装dx sdk才能运行

    3D模型的创建和渲染涉及到顶点缓冲区的使用,这些缓冲区包含了描述3D形状的顶点数据。坦克的运动和射击逻辑则需要编写相应的游戏循环和碰撞检测算法。此外,可能还会涉及深度缓冲区(Z-Buffer)的使用,以解决多边形...

    3Dfluid:第一次测试 3D 流体 Openframeworks

    《3Dfluid:初探3D流体模拟与Openframeworks的应用》 在计算机图形学领域,3D流体模拟是一种复杂而引人入胜的技术,它能够将真实世界中的液体运动转化为逼真的数字表现。"3Dfluid:第一次测试 3D 流体 Openframeworks...

    3DSolarSytemModel:由ThreeJs制作的基本的非比例3D太阳系模型。 工作正在进行中

    《ThreeJs构建的3D太阳系模型初探》 ThreeJs是基于WebGL的JavaScript库,用于在浏览器中创建3D图形。它使得开发者能够利用HTML5 Canvas元素,轻松地在网页上展示交互式的三维图形,无需安装任何插件。在“3...

    学习opencv中文版

    mean-shift和camshift跟踪 运动模板 预估器 condensation算法 练习 第11章 摄像机模型与标定 摄像机模型 标定 矫正 一次完成标定 罗德里格斯变换 练习 第12章 投影与三维视觉 投影 仿射变换和透视变换 POSIT:3D姿态...

    OGRE 制作的一个rpg

    OGRE是一个开源的C++库,它的核心功能是将3D模型、纹理、光照、阴影等元素渲染到屏幕上,同时提供场景管理、资源管理、网络通信等多种辅助功能。它支持Direct3D和OpenGL等多种图形API,可以在Windows、Linux、Mac ...

    taiyangxi.zip_Taiyangxi

    - **坐标变换**:理解并应用局部坐标到全局坐标的转换,这对于理解3D图形学至关重要。 - **数值计算**:掌握数值积分方法,如Euler方法,了解它们在解决物理问题中的应用。 - **C++编程**:练习面向对象编程,掌握类...

    AndorinhaEsporte:Primeiro Projeto com unity3d

    《AndorinhaEsporte: Unity3D初探与C#编程实践》 Unity3D,作为全球最受欢迎的游戏开发引擎之一,被广泛应用于游戏、虚拟现实(VR)、增强现实(AR)等多个领域。在这个名为"AndorinhaEsporte"的项目中,我们将深入...

    Python库 | blender-basico-0.1.9.tar.gz

    例如,通过Python脚本自动化创建大量角色模型,或者根据数据库数据动态生成3D场景,可以大大提高工作效率。 总之,Python库blender-basico-0.1.9为Python开发者提供了与Blender交互的便捷途径,使得3D内容的创建和...

    汇总游戏:这是我的第一个Unity项目,它是一个简单的游戏,您必须用球来收集立方体

    1. **3D模型创建**:球体和立方体的3D模型可以通过内置的Unity几何形状或外部3D建模软件(如Blender)创建,然后导入到Unity中。 2. **材质和纹理**:为了让物体看起来更生动,需要为它们分配材质和纹理。Unity支持...

    Introduction-To-HTC-Vive-Final-Unity5.5.1.zip

    《HTC Vive与Unity开发初探》 在虚拟现实(VR)领域,HTC Vive以其卓越的硬件性能和丰富的交互体验赢得了广大开发者和用户的青睐。本资料“Introduction-To-HTC-Vive-Final-Unity5.5.1.zip”是针对使用Unity引擎...

    浅谈机械制图与机械CAD的有机结合.pdf

    3D建模技术使得设计师可以从各个角度观察零件或装配体的几何形状和尺寸关系,进行干涉检查、运动模拟、力学分析等,这有助于提前发现设计中可能存在的问题,确保设计的可行性。 4. 数学在机械制图与CAD中的应用:...

    Snailgine:一个简单的C ++游戏引擎

    **蜗牛胶(Snailgine):C++游戏开发的初探** 蜗牛胶(Snailgine)是一款专为C++编程爱好者设计的简易游戏引擎,它为初学者和经验丰富的开发者提供了一个基础平台,用于快速原型设计和游戏开发。这个引擎的核心目标...

Global site tag (gtag.js) - Google Analytics