OSG中GLB转IVE之路

最近在使用OSG 3.4的过程中,需要将一个GLB格式的3D模型文件,转换成IVE格式,以便osgDB::readNodeFile函数加载。具体方法是通过Blender建模软件进行3D文件格式转换。这个过程中遇到很多问题,记录一下。

常用的3D文件格式

.obj

OBJ文件是Alias | Wavefront公司为它的一套基于工作站的3D建模和动画软件“AdvancedVisualizer”开发的一种标准3D模型文件格式。

应用OBJ文件一般包括三个子文件,分别是.obj、.mtl、.jpg,除了模型文件,还需要.jpg纹理文件。OBJ可以是传统模型,也可以是倾斜模型。

特点OBJ格式适合用于3D软件模型之间的互导。比如Smart3D里面生成的模型需要修饰,就可以输出OBJ格式,然后导入到3dsMax进行处理;如果你想把在3dsMax中建的模型调到Maya里面渲染或制作动画,导出OBJ文件就是一种很好的选择。

目前几乎所有知名的3D软件都支持OBJ文件的读写,不过其中很多需要通过插件才能实现。另外,OBJ文件还是一种文本文件,可以直接用写字板打开进行查看和编辑修改。值得一提的是,老子云平台能够支持OBJ格式数据的上传和OBJ格式与其它格式间的互转。

其特点如下:

  • OBJ文件是一种3D模型文件。不包含动画、材质特性、贴图路径、动力学、粒子等信息。

  • OBJ文件主要支持多边形(Polygons)模型。虽然也支持曲线(Curves)、表面(Surfaces)、点组材质(Point Group Materials),但Maya导出的OBJ文件并不包括这些信息。

  • OBJ文件支持法线和贴图坐标。OBJ只能保存贴图坐标信息,贴图需要手动重新指认,但不需要再调整贴图坐标。

.dae

COLLADA ( COLLA borative Design A ctivity ) 是一种用于交互式3D应用程序的交换文件格式。它由非营利性技术联盟Khronos Group管理,并已被 ISO 采用为公开可用的规范 ISO/PAS 17506。[1]

COLLADA 定义了一个开放的标准 XML 模式,用于在各种图形软件应用程序之间交换数字资产,否则这些应用程序可能会将其资产存储在不兼容的文件格式中。描述数字资产的 COLLADA 文档是 XML 文件,通常以.dae(数字资产交换)文件扩展名标识。

.fbx

FBX是FilmBoX软件中所使用的格式,后来这一软件改名为Motionbuilder。

应用因为Motionbuilder扮演的是动作制作平台,所以FBX格式最大的用途是在3dsMax、Maya、softimage等软件间进行模型、材质、动作和摄影机信息的互导,这样就可以发挥max和maya等各个软件的优势。可以说,FBX方案是最好的互导方案。

其优点如下:

  • FBX格式是一种3D通用模型文件。包含动画、材质特性、贴图、骨骼动画、灯光、摄像机等信息。

  • FBX格式支持多边形(Polygons)游戏模型、曲线(Curves)、表面(Surfaces)、点组材质(Point Group Materials)。

  • FBX格式支持法线和贴图坐标。贴图以及坐标信息都可以存入FBX文件中,文件导入后不需要手动指认贴图以及调整贴图坐标。

.gltf 和 .glb

glTF( Graphics Language Transmission Format或GL Transmission Format的衍生简称)是三维场景和模型的标准文件格式。glTF 文件使用两种可能的文件扩展名之一,.gltf ( JSON / ASCII ) 或 .glb ( binary )。.gltf 文件可以是自包含的,也可以引用外部二进制和纹理资源,而 .glb 文件是完全自包含的。Khronos Group开发和维护的开放标准,支持3D 模型几何、外观、场景图层次结构和动画。它旨在成为一种简化的、可互操作的格式,用于交付 3D 资产,同时最大限度地减少文件大小和应用程序的运行时处理。因此,其创建者将其描述为“ 3D JPEG ”。

应用GlTF是一种可以减少3D格式中与渲染无关的冗余数据并且在更加适合OpenGL簇加载的一种3D文件格式。GlTF的提出是源自于3D工业和媒体发展的过程中,对3D格式统一化的急迫需求。如果用一句话来描述:GlTF 就是三维文件的 JPEG ,三维格式的 MP3。在没有GlTF的时候,大家都要花很长的的时间来处理模型的载入。尽管一些3D Web框架支持特定于平台的模型格式,如FBX和OBJ,但几乎每个框架都支持GLTF。如果有人要为你提供3D模型,你可以请求他们提供GLTF格式的版本。

特点GLTF是一种输出格式,这意味着我们无法直接修改它们。但我们可以修改其位置和大小,并对其进行旋转操作。

另外,GLTF文件不是单个文件,而是包含JSON文档、图片、几何图形、纹理、凹凸贴图等的文件夹。

.OSGB

OSGB的全称是Open Scene Gragh Binary。这里的Binary是二进制的意思。

应用目前市面上生产的倾斜模型,尤其是Smart3D处理的倾斜摄影三维模型的数据组织方式一般是二进制存贮的、带有嵌入式链接纹理数据(.jpg)的OSGB格式。

特点此类数据文件碎、数量多、高级别金字塔文件大。因而难以形成高效、标准的网络发布方案,无法实现不同地域、不同部门之间的数据共享。

.ive

ive是由OpenSceneGraph(OSG)创建的三维模型文件,OSG是用于建模和动画处理的开源3D图形工具包; 包含使用该软件创建的3D场景; 用于可视化,仿真,游戏,虚拟现实和其他建模方案。IVE文件以二进制格式存储,有助于查看和渲染场景时提高性能。

OSG实用工具

osgconv

osgconv是一种非常有用的的工具来读取标准的3D格式,如OpenFlight,3DS,Alias Wavefront(OBJ) etc,并且可以将它们转换为一种OSG所支持的格式,如OSG中的ASCII格式的.osg,二进制格式的.ive。

在程序运行的默认情况下,优化导入的场景图,将形成的这样结果:场景图读取的数据量将会更少且速度会更快。尤其值得指出的是,.ive格式的的文件,快速装载数据的能力使它非常适合数据页和大型的数据库。

osgconv常用方式为:

1
2
3
4
# 将cow.obj转成ive
osgconv cow.obj cow.ive
# 沿Z轴逆时针旋转90度
osgconv -o -90-0,0,1 cow.obj cow.ive

osgviewer

osgviewer 是随 OpenSceneGraph 一起分发的基本场景图查看器。它的主要目的是一个如何编写简单查看器的示例,但它的功能也足以用作基本的 3D 图形查看器。使用方法如下:

1
osgviewer cow.ive

osg插件

OpenSceneGraph 核心发行版中有 45 个插件,它们提供了对原生和 3rd 方文件格式的读写支持。OpenSceneGraph 数据库插件库 osgDB 自动按需加载插件,使用正在加载/保存的文件的扩展名来确定要加载哪个插件。osgDB 加载必要的插件是透明的,实际上你不应该做任何特殊的事情来加载某种文件类型。唯一需要记住的因素是 OSG 需要支持文件格式(由文件的扩展名决定)并且您应该已经编译了必要的插件。

转换方法

将glb文件转换成ive文件的流程如下:

  1. 使用blender 2.92 导入 glb 文件。
  2. 使用blender 2.92 将 glb 文件导出成 dae 文件。注意导出时选择导出纹理图像。该步骤的主要目的是为了获取glb文件的纹理图像。
  3. 使用blender 2.92 将 glb 文件导出成 obj 文件。 注意导出时选择导出纹理图像。该步骤将生成.obj、.mtl、.jpg三种文件,其中.jpg是纹理图像。如果纹理图像导出失败,可使用 dae 文件的纹理图像,同时注意修改.mtl文件中纹理图像的路径。.obj、.mtl均是文本文件,可直接打开。
  4. 使用命令 osgconv -o -90-0,0,1 cow.obj cow.ive 将obj文件转换成ive文件。-o选择将模型朝向沿着坐标轴进行旋转。

转换需要注意的问题

3D文件格式转换需要注意的问题主要有:

  • blender打开glb文件渲染时出现透明区域,显示背面区域的问题。

因为对blender建模软件不够熟悉,刚开始以为是纹理贴图的问题,后面才发现是面朝向的问题。法线朝外的面是正面,朝里的面是背面。透明区域的面法线朝里,我们看到的是背面。由于blender着色器默认使用背面剔除功能,导致本应不透明的面被删除,导致出现透明区域现象。

检测方面很简单,在blender中选择“视图叠加层”->“面朝向”打勾,模型正面将显示蓝色,背面显示红色。显示红色的区域就是透明区域。

解决方法很简单,在blender中选择红色区域三角面,选择“网格”->“法线”->“翻转”, 将背面变为正面,即可解决模型显示透明区域问题。

  • blender将glb转换成obj丢失纹理问题。解决方法在转换流程中已有介绍,在此不再详述。

  • 模型朝向问题。解决方法在转换流程中已有介绍,在此不再详述。

参考链接

  1. 三维文件格式知多少 | abc、glTF、fbx、obj、dae、stl、3ds..,by 饼干教育.
  2. 超实用:一篇文章带你了解市面上主流通用的3D模型格式,by qq.
  3. COLLADA,by wikipedia.
  4. glTF,by wikipedia.
  5. osgconv使用指南(转),by 3D入魔.
  6. osgconv,by osgchina.
  7. 背面剔除,正面剔除是什么能干嘛,从Blender和Unity解读,来2个效果你就懂了,by 拉克哈尼.
  8. osgPlugins,by openscenegraph.
  9. 科普:FBX格式和OBJ格式异同,by Tech fan.