三维模型:单体小模型转为glTF格式

6/8/2023

glTF是用于小场景的三维模型。 Cesium支持包含关键帧(key-frame)动画、骨骼(skinning)动画 的glTF格式的三维模型,并且支持模型节点(node)的拾取。 glTF是 Khronos Group 定义的一个基于web上的新兴三维模型格式行业标准。Khronos Group是WebGL和 COLLADA的背后财团。

# 1. 三维模型源数据的设计要求

# 1.1 建模设计要求

无论是通过什么工具来设计建模,最终obj等格式即可。设计时需要主要的地方,有以下几点:

  1. 模型单位:三维模型采用米(m)作为单位,模型大小与物体的真实大小要接近,比如车辆的长度在几米到十几米长,不要生产成100米、1000米的大小。

  2. 模型方向:车辆等具备方向的模型时,车头朝向南

  3. 模型中心点:模型需要将视角效果的中心放在X=0,Y=0,Z=0的原点位置,XY轴方向居中,Z轴方向都放0上面(如下图所示)。 image

  4. 材质要求: 使用 Standard 标准材质,材质类型使用 Blinn。程序纹理尽量只使用位图,有些程序纹理FBX导出时会报错出问题导致灰色材质(并不是全部的程序纹理)(例:Color Correction),纹理图片不能再Max中进行裁剪,FBX不支持。 image

# 纹理图片

  • 纹理图片必须是jpg,png等web兼容格式,图片名称不要有中文。
  • 能够完整反映模型的外观,精度控制合理,在保证三维模型视觉效果的前提下,减少模型点面数和材质数量,贴图尽量烘焙整合减少贴图数量,贴图分辨率最大不超2048×2048(能小则小,能压缩就压缩,PNG图片可以尝试用Photoshop导出8位色彩的),做到数据量的精简。
  • 所有的纹理使用同一个顶点数据。可以使用多重纹理把uv的作用最大化,但是所有纹理只能分享同一个纹理坐标。
  • 尽量使用纹理合并集( texture atlases 多个小纹理和到一张大纹理上)而不是很多独立纹理。这样会使文件下载次数最小化,并且使引擎批量渲染,会提升不少性能。
  • 使用mipmaping。这个会提升显示效果和渲染性能,尤其是对大的纹理合并集 ,否则会产生很多内存碎片( poor memory coherence)。
  • 如果贴图在cesium里不透明,有可能是blend属性没有开启造成的,修改模型的属性。

# 几何体

  • 不要包含任何比不需要的顶点元素。虽然导出Collada dae会增大一点点,但是对glTF确增大了很多。因为glTF不支持顶点属性的索引( per-attribute indices),所有的顶点属性都是和顶点个数一致。
  • 尽量减少节点(node)和 三角网(mesh)的个数。通常一个大的三角网渲染效率要比很多个小的三角网效率高。
  • 尽量把模型身上的修改器塌陷掉,特别是UVW展开与自动展开UVs,如不塌陷掉在后期转换中处理后预览时可能会看到双重模型。

# 1.1 交付物数据及格式要求

# 如果交付提供max原始文件【建议】

如果是max文件,注意同时发送所有贴图材质。可以在max里重新指定贴图路径,选中所有的贴图后,把路径更改为当前机器上的贴图所在位置路径。 image

# 如果交付物是提供obj格式文件

按下面参数设置步骤操作导出数据即可,同样注意别丢失材质贴图文件。 image

# 2. 单体小模型转为glTF格式

转换工具: obj转gltf (opens new window) fbx转glTF (opens new window) dae转gltf (opens new window) gltf转glb (opens new window) max导出gltf插件 (opens new window)

下面介绍其中2种比较常用的工具:

# 2.1 使用obj2gltf工具

请确认处理机器安装有Node环境,如果没有请下载安装 Node下载地址 (opens new window)

obj2gltf工具 (opens new window)主要是将obj数据转换成gltf2.0格式数据,如果您是其它格式数据可以通过3dmax软件另存导出obj格式数据。

  1. Github上下载或clone仓库,打开本地的obj2gltf-master文件夹
git clone https://github.com/CesiumGS/obj2gltf.git
1
  1. 在obj2gltf-master目录下,输入命令:npm installcnpm install 安装依赖包
npm install
1
  1. 执行数据转换,命令行如下:
node bin/obj2gltf.js -i data/test.obj -b
1

image

# 命令行支持的参数:

参数 说明 必选项 默认值
-h, --help 显示帮助
-i, --input obj文件的路径。 ✅ 必须
-o, --output 转换后的glTF或glb文件的路径。
-b, --binary 保存为二进制glTF (.glb)。 false
-s, --separate 写出单独的缓冲区和纹理,而不是将它们嵌入到glTF文件中。 false
-t, --separateTextures 只写出单独的纹理。 false
--checkTransparency 通过查看每个像素的alpha通道来做一个更详尽的纹理透明度检查。默认情况下,纹理是不透明的。 false
--secure 防止转换器读取输入obj目录之外的纹理或mtl文件。 false
--packOcclusion 在金属粗糙纹理的红色通道中填充遮挡纹理。 false
--metallicRoughness mtl文件中的值已经是金属粗糙度PBR值,不应该应用转换步骤。金属存储在Ks和map_Ks槽中,粗糙度存储在Ns和map_Ns槽中。 false
--specularGlossiness Tmtl文件中的值已经是镜面光泽度PBR值,不应该应用转换步骤。镜面光泽度存储在k和map_Ks槽中,光泽度存储在n和map_Ns槽中。glTF将被保存为khr_materials_pbrspeculargloss扩展名。 false
--unlit glTF将以KHR_materials_unlit扩展名保存。 false
--metallicRoughnessOcclusionTexture 到金属粗糙遮挡纹理的路径,它应该覆盖.mtl文件中的纹理,其中遮挡存储在红色通道中,粗糙存储在绿色通道中,金属存储在蓝色通道中。模型将保存为pbrMetallicRoughness材质。在.mtl不存在或没有设置为使用PBR材料的工作流中,这通常是很方便的。适用于单一材料的模型。
--specularGlossinessTexture 高光光泽度纹理的路径应该覆盖。mtl文件中的纹理,高光颜色存储在红色、绿色和蓝色通道中,高光光泽度存储在alpha通道中。使用khr_materials_pbrspeculargloss扩展,模型将和材质一起保存。
--occlusionTexture 遮挡纹理的路径,它应该覆盖.mtl文件中的纹理。
--normalTexture 普通纹理的路径,它应该覆盖.mtl文件中的纹理。
--baseColorTexture baseColor/diffuse纹理的路径,它应该覆盖.mtl文件中的纹理。
--emissiveTexture 应该覆盖.mtl文件中的纹理的发射纹理的路径。
--alphaTexture alpha纹理的路径,应该覆盖。mtl文件中的纹理。

# 2.2 dae转gltf转换工具

  1. 需要在3dmax中安装OpenCOLLADA插件 (opens new window) , 将下载好的COLLADAMaxNew.dle文件复制粘贴到3dsMax的安装目录的plugins文件夹中;打开软件,选择 自定义->插件管理器 ,在空白处点击右键,选择 加载新插件 在找到插件位置即可 ,添加完成后,在插件管理器中会出现添加进的插件

image

  1. 打开3dsMax;选择导出,将模型导出为OpenCOLLADA(*.dae)格式

image

  1. 下载COLLADA2GLTF工具 (opens new window)下载最新工具包。

  2. 进入下载包的目录,启动命令行工具,输入命令: COLLADA2GLTF [.exe] [-i输入] [ -o输出] [选项]

.\COLLADA2GLTF-bin.exe  -i  F:\COLLADA2GLTF\data\weilan.DAE
1

image

# 命令行支持的参数:

参数 默认值 必选项 说明
-i, --input 必须 ✅ 输入COLLADA文件的路径
-o, --output output/${input}.gltf 输出glTF文件的路径
--basepath 输入路径的父路径 使用此作为引用路径解析外部uri
-s, --separate false 输出单独的二进制缓冲区,着色器和纹理
-t, --separateTextures false 分别输出纹理
-b, --binary false 输出二进制glTF(.glb)
-m, --materialsCommon false 使用KHR_materials_common扩展名输出材料
-v, --version 输出glTF版本(例如:“1.0”、“2.0”)
-d, --dracoCompression false Output meshes using Draco compression extension
--qp Quantization bits used for position attributes in Draco compression extension
--qn Quantization bits used for normal attributes in Draco compression extension
--qt Quantization bits used for texcoord attributes in Draco compression extension
--qc Quantization bits used for color attributes in Draco compression extension
--qj Quantization bits used for joint indice and weight attributes in Draco compression extension
--metallicRoughnessTextures Paths to images to use as the PBR metallicRoughness textures
--specularGlossiness false output PBR materials with the KHR_materials_pbrSpecularGlossiness extension
--lockOcclusionMetallicRoughness false Set metallicRoughnessTexture to be the same as the occlusionTexture in materials where an ambient texture is defined
--doubleSided false Force all materials to be double sided. When this value is true, back-face culling is disabled and double sided lighting is enabled
--preserveUnusedSemantics false Don't optimize out primitive semantics and their data, even if they aren't used.

# 3. 处理操作流程完整示例

# 3.1 导出obj格式

下面是以3ds Max软件为例,导出为obj格式;

# 3.1.1 打开模型并确认模型位置

确认或调整模型中心点位置,如图中所指,需要将模型处于两线交叉口,绘制时处于中心位置;

偏移量会导致模型绘制之后出现偏差;

image

# 3.1.2 导出obj文件

通过3dmax导出文件,根据下图所指引进行导出; image

转换后的模型最好放在obj2gltf工具目录的data文件夹下

# 3.2 obj格式转换gltf

下面是以obj2gltf工具为例,转换为gltf文件,转换前确保已经按上面步骤安装好obj2gltf;

    1. 打开本地的obj2gltf-master文件夹,
    1. 执行数据转换,命令行如下图:
node bin/obj2gltf.js -i data/test.obj -b
1
    1. 转换成功后的gltf文件如下:

image

转换成功之后将.gltf文件放在项目中,

或者放在独立站点服务,可以参考发布三维数据服务

# 6.3 在平台中加载gltf

可以在Gltf模型编辑页面 (opens new window) 进行验证,是否成功转换,加载成功效果如下图:

image

最后更新: 9/8/2023, 5:23:49 PM