首页 > 其他分享 >服务器端glTF格式模型转换方案

服务器端glTF格式模型转换方案

时间:2022-11-07 15:33:11浏览次数:71  
标签:Node 服务器端 three js fbx2gltf sharp 格式 glTF

太长不看版

Node.js + fbx2gltf / obj2gltf / ……(初步模型转换) + @gltf-transform (精修)(+ sharp / ……(贴图处理))

 

背景

手里有个网页3D模型展示的项目,内核选了three.js。虽然three.js也可以用FBX之类的传统格式模型文件,但目前来说支持最好的还是glTF格式。

需求

有相当数量的模型资产是以FBX+贴图包的方式储存的,需要按照特定的规则进行转换。

过程

1. Java类库

  由于应用服务器用的是Java,最初想找一个Java类库来处理。

  结果:只找到一些收费类库,试用的效果并不理想。

2. Node.js + fbx2gltf

  glTF官方推荐列表里列出了脸书版fbx2gltf转换器,npm上也找到了Node.js环境下的封装包,就拿来试了下。

  结果:可以用,但接口参数太少,不能完全满足要求。其中,内嵌TGA格式贴图不能自动转换成PNG/JPEG格式最为致命。而fbx2gltf的内核是用C++写的,定制开发搞不定。

3. Node.js + fbx2gltf + three.js (+ jsdom & node-canvas)

  既然最终渲染用three.js进行,而且three.js也有glTF导出功能,就试着引入工程。

  结果:浏览器环境的JS库和Node.js的结合那叫一个酸爽……代价不小,引入jsdom和node-canvas作为浏览器环境模拟,再对three.js中涉及文件读取的类进行改写以后,勉强整合了。

  ………………

  …………

  ……

  然后栽在了贴图转换上(进行了一些相当原始的原生Node.js处理,然后内存不足)

4. Node.js + fbx2gltf + three.js (+ jsdom & node-canvas) + 外部图像处理(自制Java库)

  反正都已经这么地精工程学了,不介意炸得再猛烈一些吧?(

  自己写了个简单的Java图像处理,主要是应对glTF里那些多通道缝合贴图,然后用Node.js的child_process调用。

  结果:能用,满足需求,就是吃内存吃的有点狠,处理速度也有点emmmmm……

  (这个版本存活了很长一段时间)

5. Node.js + fbx2gltf + three.js (+ jsdom & node-canvas) + sharp

  太过地精工程学也不是好事,一开始考虑先把图像处理至少先搞成Node.js的,调查了一段时间找到了sharp,拿来试试。

  结果:单独写贴图转换没啥问题,甚至自己找到TGA和BMP的读取库接到了sharp上,很快!

  然后整合的时候……作为浏览器模拟环境的node-canvas就和sharp打起来了……

  sharp甚至在官网安装说明里专门有一条来解释和node-canvas的冲突……

  幸好只在Windows环境下有这个问题,Linux没有,WSL走起~

6. Node.js + fbx2gltf + @gltf-transform + sharp

  但总是绕着走也不是个事……尤其是WSL下的Node.js还是比Windows版Node.js要慢,那……把three.js扔了?

  总算是找到了目标库:@gltf-transform,支持Node.js环境,glTF格式的把握也很到位。

  不过改代码的时候遇到些麻烦:three.js侧重于渲染,它的模型结构是一棵树;@gltf-transform侧重于数据处理,它的结构……和glTF格式内部结构更接近,各种资产是分类保存的。

 

不是总结的总结

能用和好用区别还是很大的,地精工程学可以不用还是别用为妙,时间充裕的时候还是多找点工具库对比下。

标签:Node,服务器端,three,js,fbx2gltf,sharp,格式,glTF
From: https://www.cnblogs.com/Rabbitism/p/16866122.html

相关文章

  • dbc文件语法格式
     messagelayout messageperiodvaluetable......
  • jquery 时间戳转化为日期时间格式,年月日 时分秒
     <scripttype="text/javascript">varstrDate='';$(function(){//获取时间戳时间戳为10位需*1000,时间戳为13位的话则不用......
  • h264格式
    H264介绍H264,同时也是MPEG-4的第十部分,是由ITU-T视频编码专家组和ISO/IEC动态图像专家组(MPEG)联合组成的联合视频组提出的高度压缩数据视频编码器标准(引用自被堵百科)。H264编......
  • 如何在 Inno Setup 中关联多种文件格式
    问题描述InnoSetup是一款十分强大的Windows安装程序制作软件,可以通过编写并编译iss脚本来创建安装包。之前都是直接将Pyinstaller生成的文件夹压缩为zip格式来......
  • js把json格式化
    1字符串转json对象2json对象转格式化的字符串<html><head></head><body><inputtype="button"οnclick="aa()"/><textarearows="13"cols="220"id="t"></textare......
  • 给力推荐,蜻蜓FM音频提取软件,一键转换音频mp3格式到本地
    前几天逛网页,发现一款的蜻蜓FM音频提取软件,经过测试,可以非常方便的提取蜻蜓FM的音频文件,并且下载后的音频格式自动转换成了mp3格式,非常方便。 下面教大家如何将蜻蜓FM音......
  • 推荐一款可以导出提取,蜻蜓fm下载mp3格式的工具
    给大家推荐一款可以导出蜻蜓fm音频mp3格式的工具。  这款蜻蜓fm音频下载器,不仅可以提取免费音频,还支持登录vip账号,进行提取vip音频和付费音频。 使用蜻蜓导出工具......
  • java8将日期格式yyyyMM转换为LocalDate
    LocalDate:parseyyyy-MM当我们希望将一个yyyyMM格式的日期转换为LocalDate的时候,不出意外会报错java.time.format.DateTimeParseException因为LocalDate是需要指定到具......
  • ajax向后台发送请求时,可以通过data提交参数,data的数据格式有三种格式
    ajax向后台发送请求时,可以通过data提交参数,data的数据格式有三种格式:1)data:{k1:v1,k2:v2,....}*劣势:只能向后台提交一个参数名对应一个参数值的数据,不能向后台提......
  • 一文读懂 YUV 的采样与格式
    YUV是一种颜色编码方法,和它等同的还有RGB颜色编码方法。RGB颜色编码RGB三个字母分别代表了红(Red)、绿(Green)、蓝(Blue),这三种颜色称为三原色,将它们以不同的比例相加,可以......