当前位置: 首页 > news >正文

【Sceneform-EQR】通过filament(gltfio)加载gltf模型动画(Filament使用Animator)

Sceneform-EQR

简介

Sceneform-EQR是EQ基于sceneform(filament)扩展的一个用于安卓端的三维渲染器。

相关链接

Git仓库
  • Sceneform-EQR
码云
  • EQ-Renderer的示例工程
EQ-R相关文档
  • 文档目录
  • CSDN专栏

实现通过filament加载gltf模型动画

运行示例

注意

原录屏经过压缩,并转成gif。实际效果远优于gif图所展示。

模型动画

在sceneform-eqr中使用

我在sceneform-eqr中对模型动画做了一层封装,简化了模型动画的使用。

示例

示例工程:Sceneform-EQR

关键类:GltfSampleScene.java

创建模型

之前的文档【Sceneform-EQR】使用EQ-R加载模型 ,已经详细介绍如何在场景(AR场景、普通三维场景)中加载一个模型,这里不再赘述。

主要是创建了一个Node对象,而下面的示例需要用到这个Node。

创建动画

在sceneform-eqr中,当执行Node#setRenderable(model)后,我们即可创建动画

其中,创建动画的代码示例如下:

public void createAnimation(Node node){if (node.getRenderableInstance() == null) {return;}int animationCount = node.getRenderableInstance().getAnimationCount();if (animationCount > 0){//创建动画参数(这里主要设置周期)ARAnimationParameter parameter = new ARAnimationParameter();parameter.setDuration(6000L);//设置播放周期parameter.setRepeatMode(ARAnimationRepeatMode.INFINITE);//设置循环方式//创建默认动画ARAnimationModel animationModel = new ARAnimationModel(node);animationModel.createAnimation(parameter);//默认播放第一个索引的动画animationModel.setCurrentIndex(0);//播放动画animationModel.play();}
}

至此,若使用Sceneform-EQR,读取模型动画及加载的教程已结束。

后文将结合filament,详细介绍流程。


分界线


Filament调用解析

创建FilamentAsset

我们先看一段使用filament加载gltf模型的代码片段。

loader = new AssetLoader(engine,newUbershaderProvider(filamentEngine),EntityManager.get());FilamentAsset filamentAssets = loader.createAsset(gltfByteBuffer);

其中,gltfByteBuffer是通过InputStream读取gltf文件得到的Buffer对象。我们通过loader的createAsset方法,得到了filamentAssets对象。

获取FilamentAnimator

现在,我们从filamentAssets中获取FilamentAnimator,并用存入List。

ArrayList<ModelAnimation> animations = new ArrayList<>();//...省略其他代码filamentAnimator = filamentAssets.getInstance().getAnimator();
animations = new ArrayList<>();
for (int i = 0; i < filamentAnimator.getAnimationCount(); i++) {animations.add(new    ModelAnimation(this,filamentAnimator.getAnimationName(i),     i,filamentAnimator.getAnimationDuration(i),getRenderable().getAnimationFrameRate()));
}

这里使用到的ModelAnimation,参考Sceneform-EQR中ModelAnimation.java。

也可不使用ModelAnimation.java,与后续updateSkinning时对应上就行。

更新骨骼动画

在每一帧(“doFrame”)绘制前,执行updateSkinning。

            // 更新蒙皮skinningif (updateAnimations(false)) {updateSkinning();}

updateAnimations(false)中,则是从之前的List中取出ModelAnimation,将其应用。代码片段如下:

这里的关键是ModelAnimation.java中采用了不同的单位计算TimePosition,因此是个不错的参考。

    public boolean updateAnimations(boolean force) {boolean hasUpdate = false;for (int i = 0; i < getAnimationCount(); i++) {ModelAnimation animation = getAnimation(i);if (force || animation.isDirty()) {if (getFilamentAnimator() != null) {getFilamentAnimator().applyAnimation(i, animation.getTimePosition());}animation.setDirty(false);hasUpdate = true;}}return hasUpdate;}

undateSkinning方法则是更新FilamentAnimator的骨骼动画

    private void updateSkinning() {if (getFilamentAnimator() != null) {getFilamentAnimator().updateBoneMatrices();}}

综上所述

若要在filament中使用3D模型自身的动画,需要通过FilamentAssets获取Animator对象,然后在每一帧绘制前,调用applyAnimation以修改当前进度值,然后再updateBoneMatrices即可。

当然,使用Sceneform-EQR,是最简单的。当前Sceneform-EQR已适配最新的filament依赖(v1.53.4),并已开源,欢迎有缘人加入。若有其他使用问题,请在git讨论。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【一起学Rust | 框架篇 | Tauri2.0框架】rust和前端的相互调用(前端调用rust)
  • ElasticSearch7.12.1详细安装
  • hdfs的慢盘检测
  • 浏览器插件利器--allWebPluginV2.0.0.18-alpha版发布
  • 快速学习安装使用etcd
  • 图像变换——等距变换、相似变换、仿射变换、投影变换
  • net core中byte数组如何高效转换为16进制字符串
  • 【maven】阿里云仓库配置
  • MySQL 中间件 MySQL-Router
  • 力扣229题详解:求众数 II 的多种解法与模拟面试问答
  • 由浅入深学习 C 语言:Hello World【基础篇】
  • 更改了ip地址怎么改回来
  • linux下一切皆文件,如何理解?
  • 搜索引擎通过分析网页标题中的关键词来判断内容的相关性
  • SAP BAPI-创建供应商客户主数据
  • 深入了解以太坊
  • 【前端学习】-粗谈选择器
  • CentOS 7 修改主机名
  • Django 博客开发教程 16 - 统计文章阅读量
  • ESLint简单操作
  • Iterator 和 for...of 循环
  • MobX
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • PHP 的 SAPI 是个什么东西
  • unity如何实现一个固定宽度的orthagraphic相机
  • windows下mongoDB的环境配置
  • 测试如何在敏捷团队中工作?
  • 跨域
  • 前言-如何学习区块链
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 山寨一个 Promise
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • # .NET Framework中使用命名管道进行进程间通信
  • # 计算机视觉入门
  • $nextTick的使用场景介绍
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (C++)八皇后问题
  • (搬运以学习)flask 上下文的实现
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (排序详解之 堆排序)
  • (一)、软硬件全开源智能手表,与手机互联,标配多表盘,功能丰富(ZSWatch-Zephyr)
  • (一)springboot2.7.6集成activit5.23.0之集成引擎
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .a文件和.so文件
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别
  • .NET Core WebAPI中封装Swagger配置
  • .Net Core 微服务之Consul(三)-KV存储分布式锁
  • .NET 反射的使用
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
  • .NET和.COM和.CN域名区别
  • .net经典笔试题
  • .NET学习全景图
  • .net知识和学习方法系列(二十一)CLR-枚举