3D骨骼动画是实现较为复杂3D场景的重要技术,Babylon.js引擎内置了对骨骼动画的支持,但Babylon.js使用的骨骼动画的模型多是从3DsMax、Blender等3D建模工具转换而来,骨骼动画的具体生成方式被透明化。本文从babylon格式的3D模型文件入手,对骨骼动画数据的生成方式进行具体分析,并尝试建立一个简易的3D骨骼动画生成工具。

一、模型文件分析

我们从Babylon.js官方网站上的一个骨骼动画示例开始分析:

(示例地址:https://www.babylonjs-playground.com/frame.html#DMLMIP#1)

下载示例中的3D模型dummy3.babylon文件后,在JSON工具中展开:

(使用的JSON工具是bejson在线工具,地址:https://www.bejson.com/jsoneditoronline/)

可以看到,这个模型文件中包含了作者信息、背景色、雾效、物理效果、相机、光照、网格、声音、材质、粒子系统、光晕效果、阴影效果、骨骼、行为响应、额外信息、异步碰撞运算标志等场景信息。(也许称之为“场景文件”更合适)

我们主要关注其中与骨骼动画有关的网格数据和骨骼数据,展开网格数据:

其中,positions保存每个顶点在网格自身坐标系中的位置(数组中的每三个元素对应一个顶点),normals保存每个顶点对应的法线方向,uvs是顶点的纹理坐标,indices是顶点的绘制索引。

matricesIndices中保存每一个顶点属于哪一块骨骼,在这个模型里matricesIndices数组每个元素都是数字索引,但是从Babylon.js的这一段代码可以看出:

1 if(parsedGeometry.matricesIndices) {2 if (!parsedGeometry.matricesIndices._isExpanded) {3 var floatIndices =[];4 for (var i = 0; i < parsedGeometry.matricesIndices.length; i++) {5 var matricesIndex =parsedGeometry.matricesIndices[i];6 floatIndices.push(matricesIndex & 0x000000FF);7 floatIndices.push((matricesIndex & 0x0000FF00) >> 8);8 floatIndices.push((matricesIndex & 0x00FF0000) >> 16);9 floatIndices.push(matricesIndex >> 24);10 }11 mesh.setVerticesData(BABYLON.VertexBuffer.MatricesIndicesKind, floatIndices, parsedGeometry.matricesIndices._updatable);12 }13 else{14 deleteparsedGeometry.matricesIndices._isExpanded;15 mesh.setVerticesData(BABYLON.VertexBuffer.MatricesIndicesKind, parsedGeometry.matricesIndices, parsedGeometry.matricesIndices._updatable);16 }17 }18 if(parsedGeometry.matricesIndicesExtra) {19 if (!parsedGeometry.matricesIndicesExtra._isExpanded) {20 var floatIndices =[];21 for (var i = 0; i < parsedGeometry.matricesIndicesExtra.length; i++) {22 var matricesIndex =parsedGeometry.matricesIndicesExtra[i];23 floatIndices.push(matricesIndex & 0x000000FF);24 floatIndices.push((matricesIndex & 0x0000FF00) >> 8);25 floatIndices.push((matricesIndex & 0x00FF0000) >> 16);26 floatIndices.push(matricesIndex >> 24);27 }28 mesh.setVerticesData(BABYLON.VertexBuffer.MatricesIndicesExtraKind, floatIndices, parsedGeometry.matricesIndicesExtra._updatable);29 }30 else{31 deleteparsedGeometry.matricesIndices._isExpanded;32 mesh.setVerticesData(BABYLON.VertexBuffer.MatricesIndicesExtraKind, parsedGeometry.matricesIndicesExtra, parsedGeometry.matricesIndicesExtra._updatable);33 }34 }

View Code

数组的一个元素也可以保存四个骨骼索引,并且可以使用扩展模式使一个顶点同时和八块骨骼关联。

matricesWeights数组保存每个顶点默认的四块骨骼对顶点姿态影响的权重。

展开骨骼数据:

可以看出同一个场景文件中可以包含多套不同id的骨骼,通过网格的skeletonId属性可以标示使用哪一套骨骼。网格的ranges属性里保存不同动作对应的动画帧数范围,比如第127帧到148帧动画对应机器人奔跑的动作。

展开一个骨骼元素:

经过试验得知,网格的matricesIndices属性中应该保存bones数组的自然索引,而不是bone的index元素。

bone的parentBoneIndex属性表示这个骨骼的“父骨骼”的索引,parentBoneIndex为-1表示这块骨头没有父骨骼(经过试验,Babylon.js只支持一个parentBoneIndex为-1的“根骨骼”,且根骨骼在骨骼数组中的位置应先于所有其他网格,所以可以添加一个不包含动画变化和顶点关联的“空骨骼”作为唯一的根骨骼,以避免出现多个根骨骼)

matrix属性是和骨头关联的顶点在进行了一系列变化之后,最终附加的一个在骨骼当前坐标系中的姿态变化矩阵(?)。

每一块骨骼有一个animation属性保存这个骨骼的动画信息,animation中的dataType=3表示这个动画是对矩阵类型的值进行动态变化,framePerSecond=30表示默认每秒播放30帧,keys里保存了每一个关键帧对应的矩阵值:

在关键帧时和这块骨骼关联的顶点会在骨骼的自身坐标系里进行values矩阵所表示的姿态变化,其父骨骼的姿态变化会和它的姿态变化叠加。

可以看出这个动画的每一个帧都是关键帧,这些数据应该是通过动作捕捉技术获取的。

二、生成并导出骨骼模型:

1、html文件:

1

2

3

4

5

最简单元素测试

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

babylonjs 分部加载模型_基于babylon3D模型研究3D骨骼动画(1)相关推荐

  1. babylonjs 分部加载模型_基于Babylonjs自制WebGL3D模型编辑器

    一.总述 当代WebGL编程所使用的3D模型大多是从3DsMax模型或Blender模型转化而来,这种工作模式比较适合3D设计师和3D程序员分工配合的场景.但对于单兵作战的WebGL爱好者来讲这种模式 ...

  2. babylonjs 分部加载模型_17 Babylonjs入门进阶 使用场景加载器加载glTF,OBJ,STL模型...

    Babylon.js内置的模型格式是.babylon,Babylon.js可以不需要其它额外的插件即可加载. 注意:由于你导入的模型可以具有rotationQuaternion的设置,因此再设置rot ...

  3. babylonjs 分部加载模型_用基于WebGL的BabylonJS来共享你的3D扫描模型

    用基于WebGL的BabylonJS来共享你的3D扫描模型 本文由 极客范 - 杰克祥子 翻译自 Andy Beaulieu.欢迎加入极客翻译小组,同我们一道翻译与分享.转载请参见文章末尾处的要求. ...

  4. babylonjs 分部加载模型_如何使用BabylonJS加载OBJ或STL模型

    BabylonJS(也就是babylon.js,这是一个和three.js类似的WebGL开发框架),更多的用在游戏领域. 本文说明和演示如何使用babylon.js来加载一个标准3d模型文件,如OB ...

  5. babylonjs 分部加载模型_使用 Babylon.js 在 HTML 页面加载 3D 对象

    五一 Windwos Blogs 推了一篇博客, Babylon.js v3.2 发布了.因为一直有想要在自己博客上加载 3D 对象的冲动,这两天正好看到了,就动手研究研究.本人之前也并没有接触过 W ...

  6. babylonjs 分部加载模型_初学WebGL引擎-BabylonJS:第2篇-基础模型体验

    此次学习进度会比之前快很多,有了合适的学习方法后也就会有更多的乐趣产生了. 接上一章代码 上章代码 Babylon - Getting Started }#renderCanvas{width:100 ...

  7. babylonjs 分部加载模型_babylonjs使用笔记

    目录 一.介绍了解 1.游乐场:playground 2.沙盒:sanbox 1)Nodes 2)Materials 3)Textrues 3.在线例子:examples 二.模型文件 三.项目使用 ...

  8. ansys 内聚力模型_基于内聚力模型(CZM)的单筋拉拔数值分析方法研究

    基于内聚力模型( CZM )的单筋拉拔数值分析方法研究 景剑 1 , 强峰 2 , 施凯 1 [摘 要] [摘 要]目前化学植筋粘结性能数值模拟中界面单元均以双弹簧单元 为主,但是模拟结果与相应的试验 ...

  9. lstm模型_基于LSTM模型的学生反馈文本学业情绪识别方法

    | 全文共8155字,建议阅读时长8分钟 | 本文由<开放教育研究>授权发布 作者:冯翔 邱龙辉 郭晓然 摘要 分析学生学习过程产生的反馈文本,是发现其学业情绪的重要方式.传统的学业情绪 ...

最新文章

  1. 判断一个数为多少位 比如 3 是 1位 102 是3位。
  2. this. $ refs: undefined 的解决办法
  3. 简书上的大牛总结的 ServerSocket Accept() 的确是阻塞方法 与猜想一致 一些理解 转载如下
  4. 区块链学习(6)区块链
  5. session或者error引起的iframe嵌套问题的解决
  6. spring配置文件注解方式引入的两种方式
  7. 在线阅读试听视频小程序模板源码
  8. oracle常用系统变量,Oracle环境变量
  9. 编程随想 关系图_支持PLC编程的5大语言,全部会用的才是大神!
  10. 集训队论文之经典数学题【收藏】
  11. 办公专用计算机配置,办公电脑用什么配置的好 2017办公电脑配置推荐
  12. 【雷达】毫米波雷达和激光雷达
  13. 【计算机网络】第六部分 应用层(26) 远程登录、电子邮件与文件传输
  14. java四大名著知乎_四大名著放到世界文学史上,各处于怎样的地位?
  15. 计算机组成原理mgk换算,计算机组成原理十套卷(本科)计算题及答案
  16. 万字拆解自嗨锅:造价近百万的直播间,是单场直播GMV破100万的法门吗?
  17. 前端开发中环境变量配置
  18. 盘点那些年 半死不活的国产操作系统们
  19. 作业十: 坦克对战游戏 AI 设计
  20. 华为服务器通过ilo虚拟光驱,如何用 ilo 实现虚拟光驱

热门文章

  1. WPS技巧之保护工作表实现允许部分单元格输入内容
  2. 计算机自定义桌面,电脑桌面图标自定义摆放,如何自定义桌面图标
  3. 演练VC中的common一族
  4. 强烈推荐!几款windows效率工具,文件查找、资源管理器标签化,效率控必备
  5. 规范升级 NPM 包
  6. 关于Form表单的提交与验证???
  7. [VBA学习]如何在Excel的下拉选中显示多选?
  8. dB,dBi和dBm的区别
  9. 运动控制器用c语言怎么编程,三菱运动控制器:Q173HCPU(N)/Q172HCPU(N)系列
  10. 2022第四届长安杯复盘