一。了解骨骼结构(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

3D模型初探(人体运动学)相关推荐

  1. Unity3D游戏开发初探—2.初步了解3D模型基础

    一.什么是3D模型? 1.1 3D模型概述 简而言之,3D模型就是三维的.立体的模型,D是英文Dimensions的缩写. 3D模型也可以说是用3Ds MAX建造的立体模型,包括各种建筑.人物.植被. ...

  2. 元宇宙里的虚拟数字人:十几分钟就能制作出人体3D模型

    元宇宙是虚拟世界与现实社会的交互平台,在虚拟世界里都有一个现实世界的复制品,包括真人模型,也就是元宇宙里的虚拟数字人,数字人的概念就出来了. 数字人就是逼真的人体3D模型.就是利用技术创造出来的虚拟人 ...

  3. 第八章 DirectX 3D模型加载和骨骼动画(下)

    接下来,我们介绍一些骨骼动画.我们之前大致讲过骨骼动画,存储骨骼动画的网格文件要比普通的文件复杂一下.主要是增加了骨骼信息,蒙皮信息以及动画帧信息.骨骼动画的实现原理是仿照人体运动学,将3D模型由一种 ...

  4. BundleTrack:无需实例或类级别3D模型的6D姿态跟踪算法(IROS2021)

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨paopaoslam 来源丨泡泡机器人SLAM 标题:BundleTrack: 6D Pose ...

  5. 5分钟给商品建立3D模型,我是如何做到的?

    提问:3D模型展示商品不香吗? 香!当然香. 当3D建模成为电商网购应用的左膀右臂,大同小异的产品首图就有了焕然一新的呈现面貌!商品3D模型360°全方位展示,细节更丰富,辅以线上虚拟"看. ...

  6. 基于3D关节点的人体动作识别综述(转)

    原文:2016,Pattern Recognition: 3D skeleton-based human action classification: A survey 摘要 近年来,基于深度序列的人 ...

  7. react 3d模型_制作3D React Carousel

    react 3d模型 There is something in me that is amazed but beautiful 3D interfaces. And it doesn't matte ...

  8. Cesium中文教程-3D模型(3D Models)

    目录 3D模型(3D Models) (1)快速入门(Quick start) (2)动画(Animations) (3)各取所需(Picking) (4)转化COLLADA为glTF(Convert ...

  9. 人物模型3d模型素材推荐 精品 小众

    今天小编针对人物模型3d模型素材为大家整理了很多内容哦,肯定有需要的小伙伴吧,实用.免费.优质的素材谁又不心动呢!赶紧码住! 在找寻资源的时候,无意中发现了这个网站,资源多,质量好,让我深深的喜欢上这 ...

最新文章

  1. android 关于字符转化问题
  2. Ueditor富文本添加视频内容,视频不显示以及编辑富文本时,视频不显示解决方案
  3. CentOS7安装xfce桌面环境
  4. OpenCASCADE:OCCT应用框架OCAF之函数机制使用示例
  5. linux那些事之page table
  6. OpenCV辅助对象(help objects)(6)_InputArray和OutputArray
  7. python标准输出_Python(2.7)-标准输入输出,标准错误输出
  8. 构建Blazor WASM和服务器一体化解决方案
  9. 2011浙江省公务员考试申论大作文的写作
  10. 电子信息/通信保研/考研复试经验贴,保姆级经验之联系导师篇
  11. word中首行缩进、悬挂缩进、左缩进有什么区别?如何操作?
  12. Geophysics背景知识(2)
  13. 写给 -- Arrow.L
  14. MySql性能优化及常见面试题
  15. linux日志文件详解
  16. 在线转换mobi文件的软件哪个好?分享3个mobi转换软件
  17. iTunes的下载windows
  18. C++ Hook 键盘记录器
  19. testlink界面优化_Testlink中文问题修改
  20. 即刻APP产品体验分析

热门文章

  1. python入门学习基础数据结构与语法
  2. MFC关于Radio按钮分组与选择的操作
  3. 美国拟将14项关键技术列入出口管制清单 商务部回应
  4. iptables端口映射实例
  5. mydumper 0.6.2 安装,dba的必备备份工具,必须掌握
  6. CentOS 6.7 配置 yum 安装 nginx
  7. Exchange 2010和Exchange 2016共存部署-10:配置多域名证书
  8. ApiCloud云端管理平台(v.20151022)
  9. linux下rpm包和命令使用简介
  10. android sqlite 怎么写入存储时间