6. 加载Camera和Light

在FBX模型中除了几何数据外较为常用的信息可能就是Camera和Light,虽然在游戏中一般不直接从模型中得到这两部分信息,而是由引擎来提供,但是FBX中提供了对这些信息保存的支持。其实单纯加载这两部分的信息很简单,就像之前介绍的在整个Scene Graph中对每个Node遍历过程中,判断得到当前结点是Camera或Light时调用相应的ProcessCamera或ProcessLight来完成相关的处理操作即可。

如果对于当前结点判断得到其是一个Camera结点,那么可以直接调用GetCamera来得到一个KFbxCamera类型的指针,之后就可以通过该指针来完成Camera属性的获取。

void ProcessCamera(KFbxNode* pNode)
{KFbxCamera* pCamera = pNode->GetCamera();// 调用相应的接口获取Camera的属性即可
}

对于Light结点的处理与Camera类似。至于Camera与Light结点所具有的属性可以直接在SDK中看kfbxcamera与kfbxlight的类型定义即可。

void ProcessLight(KFbxNode* pNode)
{KFbxLight* pLight = pNode->GetLight();// 调用相应的接口获取Light的属性即可}

7. 加载动画

动画信息是模型数据中非常重要的一部分,也是一个渲染或游戏引擎最基本的需求之一。FBX对Animation的良好支持也成为其与.obj等静态模型最主要区别之一,而且最新的SDK中也提供了对Animation很丰富与简便的操作接口,包括自定义写入与读出等。接下来介绍一下如何使用FBX SDK来加载FBX中存储的动画信息。

7.1 动画数据读取

在FBX中实现对于动画数据的存储主要通过以下三个对象层来实现:Animaiton Stack、 Animation Layer、Animation Node,其层次关系为

Animation Stack -> Animation Layer -> Animation Node,图示化结构为(图片来自于FBX SDKRef):

其中的Animation Stack为FBX动画管理的最高层,其中包含着与之相关联的Animation Layer等;每个Animation Stack对应着一套动作过程。每个Stack中包含一个或多个Animation Layer(当用来做blend时就需要多个Layer,但一般是一个)。在每个Layer中又通过一个KFbxAnimCurveNode的结点使Layer与具体的动画数据发生关系。一般情况下可以根据自己的需要情况或引擎的动画实现方式来读取FBX中的动画数据,例如本人在实现时从FBX中读取数据的方法就可以抽像化为如下图所示的结构:

其中对每个Node判断其是否有对应的动画数据,若有则读取其Curve中的数据并存储以供渲染更新使用,代码如下所述:

void LoadNodeCurve(KFbxAnimLayer* pAnimationLayer , KFbxNode* pNode , StackTimeSpan& timeSpan)
{KTime       keyTimer;unsigned long millseconds;for(UINT i = 0 ; i < timeSpan.mKeyNums ; ++i){millseconds = timeSpan.mStart + (float)i * timeSpan.mStep;keyTimer.SetMilliSeconds(millseconds);// 计算得到当前结点在当前时刻下所对应的空间局部和全局矩阵                // 局部矩阵对于Skeleton是必需的,因需要使用它来计算父子Skeleton之间的空间关系KFbxXMatrix curveKeyLocalMatrix  = pNode->EvaluateLocalTransform(keyTimer);KFbxXMatrix curveKeyGlobalMatrix = pNode->EvaluateGlobalTransform(keyTimer);}
}

代码中的timeSpan是一个自定义的结构,其中包含了整个FBX对象动画信息的相关数据,比如帧数、起始时间、帧间时差等;在读取时需将其中的信息转换为一个KTime类型的对象(keyTimer)以供FBX SDK的API使用。上述操作加载了动画数据中直接相关的空间Matrix信息,这是普通模型对象的基本动画信息。但是对于Camera或Light等对象而言,动画不仅包含着位置或空间信息的变化而且还包含着一些其它的属性变化如Camera的FOV,Light的Direction,Color等,这些信息也导出FBX时被存储到了FBX中。而这些信息的获取就是通过KFbxCurveNode来实现,其关联具体的Curve到相应的Property上,进而从中获得对应的动画信息。比如我们熟悉的Camera实现中有一个常用的属性PixelAspectRatio,用来描述视口Width与Height之间的比值,对于某些动画效果这个Ratio可能是时变的,因而在建模时就会将该信息同样以动画的信息进行存储,现在我们想要得到这一部分动画数据。通过查看kfbxcamera.h可以发现在KFbxCamera的定义中含有

KFbxTypedProperty<fbxDouble1> PixelAspectRatio

的一个成员变量,这即是PixelAspcetRatio动画数据所存储的位置;而在ProcessCamera时已经由当前Node的指针得到了Camera对应的指针,之后该部分读取代码基本上如下所述:

void LoadCameraCurve(KFbxAnimLayer* pAnimationLayer , KFbxCamera* pCamera , StackTimeSpan& timeSpan)
{if(pCamera == NULL){return;}// 通过FBX的属性对象而获取其所对应的Animation CurveKFbxAnimCurve* pCameraAttriAnimCurve = pCamera->PixelAspectRatio.GetCurve<KFbxAnimCurve>(pAnimationLayer);// 判断当前的属性是否含有可变的Animation值if(pCameraAttriAnimCurve){KTime         keyTimer;unsigned long millseconds;for(UINT i = 0 ; i < timeSpan.mKeyNums ; ++i){millseconds = timeSpan.mStart + (float)i * timeSpan.mStep;keyTimer.SetMilliSeconds(millseconds);// 计算Camera的某属性在当前时刻所对应的值pCameraAttriAnimCurve->Evaluate(keyTimer);}}
}

上述代码通过PixelAspectRatio的属性对象加载了其不同时刻下的动画值,其它的属性的动画读取也可以用类似的操作实现。

7.2 动画驱动

加载了上述的动画数据以后,即可以使用其来驱动模型中的直接动画相关部分,如Camera、Light、Skeleton等。由之前的代码可知,在加载动画数据时我们使用了当前Node的指针,因而就可以用它在加载动画时存储其它的一些额外信息使这些动画数据与对应的Camera、Light、Skeleton等部件进行关联(比如Node的指针,或是Node的Name等),从而可以从动画管理器中随时查得到某结点在指定时刻位置上的动画数据。该部分可以根据具体的实现采取适宜的操作即可完成。

最后,带有动画驱动的Skeleton渲染效果如下列图所示(Camera,Light的动画效果木有绘出):

 

 

下一篇介绍一下Skeleton Skinning~~

基于FBX SDK的FBX模型解析与加载 -(三)相关推荐

  1. Html监听Fbx文件加载,FBX格式mesh解析与加载(一)

    FBX格式mesh解析与加载(一) FBX格式mesh解析与加载(一) ** 理解FBX格式中Mesh数据结构** fbx文件是现在许多建模动画软件和游戏引擎之间共用的模型文件格式.fbx文件分为两种 ...

  2. 微信小程序实现FBX模型的动画加载

    鉴于有CSDN友问我FBX模型在小程序端加载的问题,我就在这里给大家介绍一下吧~ 首先,加载fbx模型,我们用到的是three.js和不同的模型类型的加载库,那么,我们在得到了web版本的加载库的前提 ...

  3. nuScenes自动驾驶数据集:格式转换,模型的数据加载(二)

    文章目录 一.nuScenes数据集格式精解 二.nuScenes数据格式转换(To COCO) 数据格式转换框架 2.1 核心:convert_nuScenes.py解析 其他格式转换文件 2.1. ...

  4. nuScenes自动驾驶数据集:数据格式精解,格式转换,模型的数据加载 (一)

    nuScenes数据集及nuScenes开发工具包简介 文章目录 nuScenes数据集及nuScenes开发工具包简介 1.1. nuScenes数据集简介: 1.2 数据采集: 1.2.1 传感器 ...

  5. pytorch模型保存与加载总结

    pytorch模型保存与加载总结 模型保存与加载方式 模型保存 方式一 只存储模型中的参数,该方法速度快,占用空间少(官方推荐使用) model = VGGNet() torch.save(model ...

  6. 人工智能算法之梯度下降法、协同过滤、相似度技术、ALS算法(附案例分析)、模型存储与加载、推荐系统的冷启动问题

    梯度下降法 求解机器学习算法的模型参数,即无约束优化问题时,梯度下降法是最常采用的方法之一,另一种常用的方法是最小二乘法.这里对梯度下降法做简要介绍. 最小二乘法法适用于模型方程存在解析解的情况.如果 ...

  7. tensor和模型 保存与加载 PyTorch

    PyTorch教程-7:PyTorch中保存与加载tensor和模型详解 保存和读取Tensor PyTorch中的tensor可以保存成 .pt 或者 .pth 格式的文件,使用torch.save ...

  8. Spring解析,加载及实例化Bean的顺序(零配置)

    点击上方蓝色"方志朋",选择"设为星标"回复"666"获取独家整理的学习资料! 作者:jb_hz blog.csdn.net/qq_2752 ...

  9. 页面加载完毕_【前端面试】dom 的解析,加载,渲染

    本文会把 dom 的解析,加载,渲染结合 window.performance 一起讲. dom 的解析 解析:HTMl 解析器把 HTML 构建成 HTML 树形数据结构,也就是 DOM 树. 注意 ...

最新文章

  1. MinkowskiEngine多GPU训练
  2. python自定义随机数_python:numpy.random模块生成随机数
  3. 【总结】清除webbrowser cookie/session的6种方法
  4. 运维监控利器Nagios:概念、结构和功能
  5. 智能假手与机器人融合可以灵活抓取物品
  6. 仿联想商城laravel实战---7、lavarel中如何给用户发送邮件
  7. 【c++】8.map和vector容器查找、删除指定元素、emplace、insert
  8. 7月24日 学习笔记
  9. vector 释放内存 swap
  10. iOS开发 字符串的转化 小技巧
  11. 【数据结构笔记03】算法实例:最大子列和
  12. Android解压boot.img
  13. 计算机基础(六):内存申请方式
  14. python input函数用法mac_sublime text3解决input()函数无法使用的问题(Python)
  15. uniapp封装request
  16. 图像处理-放大和缩小
  17. 使能和测试ARM64内核PAN机制
  18. nyoj-1182旅游【三进制状态压缩dp】
  19. 出现ora-01400错误解决办法
  20. win10+黑苹果 单硬盘 双系统 超简单安装 一看就会

热门文章

  1. 1986~1991年JS时间差一小时的奇怪问题
  2. 【测绘程序设计试题集】 试题04 最短路径计算
  3. 依存句法分析与语义依存分析的区别
  4. python -m pip install --upgrade pip
  5. 【jackson异常】com.fasterxml.jackson.databind.JsonMappingException异常处理方法
  6. Netcat的使用教程
  7. netcat工具安装
  8. 创建Direct3D9设备-------VB6编程学习DX9游戏编程DirectX9编程2D小游戏源码冷风引擎CoolWind2D游戏引擎(5)
  9. 计算机毕业设计Java学校食堂管理(源码+系统+mysql数据库+lw文档)
  10. OpenCV混合高斯模型前景分离