Sceneform ARCore fbx gltf obj 3D转换成sfb格式,如何保证包围盒不变、不自动缩放
sceneform arcore convert fbx gltf obj to sfb,without box norecenter and keep scale 1, by command line.
更多问题讨论,可以联系:
微信(wechat) le3d618
QQ: 371691096
Email: zhixu_07@163.com
arcore sceneform filament从入门到精通QQ群: 413157612
在用sceneform开发AR过程中,需要把fbx, gltf, obj等3D格式,转换成ARCore特有格式,即sfb格式,在android studio里怎么使用sceneform plugin,官网有详细说明,链接参见附录。
官方插件自动转换方式,简单易用,很适合新手入门,然而,在实际项目中,暴露的缺点非常多。比如会自动重新计算包围盒,自动计算缩放比例等,在一个多模型应用场景里,需要精准摆放多个fbx模型文件时,会让开发者痛不欲生!
通过多方查找资料,深入研究sceneform的工作原理,笔者找到通过命令行方式完成模型转换,命令行方式提供了很多参数,方便开发者根据需要灵活使用。具体如下:
到官网下载sceneform-android-sdk,链接参见附录,用studio导入一个samples工程,如solarsystem,编译运行成功,然后在
solarsystem/app/build/sceneform_sdk
即可找到命令行工具,支持mac linux windows三种平台。
sceneform_sdk/default_materils/{fbx_material.sfm gltf_material.sfm obj_material.sfm}
/linux/{converter matc build_materials}
/mac
/windows
其中converter是命名行工具,default_materils提供了fbx gltf obj默认材质配置,当然你可以根据需要,自定义材质等。
$ ./converter
Usage: ./converter [OPTIONS...] input_path
--output Output name (w/o extension)
--outdir Location (path) to save file
--mat Comma separated list of material paths for use in material translation. If not enough are provided, we re-use the last path as needed.
--matc Path to matc for use in material compilation
--anims Include animations from a comma-delimited list of source assets
--scale_override Sets the uniform scaling of a newly imported asset to the specified value, or overrides the sfa scale for assets with an existing sfa. When unset, the default is to set the scale for newly imported assets such that the bounds of the model are clamped between 5cm and 1m, and to use the scale value in the sfa for assets with an existing sfa
--norecenter Explicitly disables the default behavior of recentering the asset; position values are unmodified.
./sceneform_sdk/mac/converter -a -d
--mat ./sceneform_sdk/default_materials/fbx_material.sfm
--outdir ./sceneform_sdk/demo_output/ ./sceneform_sdk/demo_output/demo.fbx
--norecenter --scale_override 1
其中--norecenter保证包围盒中心不被重新计算,--scale_override保证不自动缩放模型
按理说,converter可以自动识别透明和非透明模型,然而在实践中,在fbx里贴上透明贴图,或者设置透明材质,转换后的模型仍然是非透明的,通过分析fbx_materials.sfm,这句配置很关键:
local propUseOpacityMap = sfm.sourceProperty("use_opacity_map", 0.0),
脚本识别的是use_opacity_map字段,通过修改fbx_material.sfm默认配置,如下(0.0 --> 1.0):
local propUseOpacityMap = sfm.sourceProperty("use_opacity_map", 1.0),
再配合一张png贴图,则转换后的模型带有透明效果。
sceneform功能尚未完善,脚本工具比较初级,在深入开发中还会遇到很多问题,如一个fbx包含多个子模型,如何单独控制,如何控制材质透明变化,控制UV动画等,后续文章会逐步研究和分析这些问题。
更多问题讨论,可以联系:
sceneform模型转换插件使用文档 https://developers.google.com/ar/develop/java/sceneform/import-assets
sceneform-android-sdk官方下载 https://github.com/google-ar/sceneform-android-sdk/releases
sceneform arcore fbx convert sfb norecenter scale by command default_materials transparent