glTF是用于小场景的三维模型。 Cesium支持包含关键帧(key-frame)动画、骨骼(skinning)动画 的glTF格式的三维模型,并且支持模型节点(node)的拾取。 glTF是 Khronos Group 定义的一个基于web上的新兴三维模型格式行业标准。Khronos Group是WebGL和 COLLADA的背后财团。
# 1. 三维模型源数据的设计要求
# 1.1 建模设计要求
无论是通过什么工具来设计建模,最终obj等格式即可。设计时需要主要的地方,有以下几点:
模型单位:三维模型采用米(m)作为单位,模型大小与物体的真实大小要接近,比如车辆的长度在几米到十几米长,不要生产成100米、1000米的大小。
模型方向:车辆等具备方向的模型时,车头朝向南
模型中心点:模型需要将视角效果的中心放在X=0,Y=0,Z=0的原点位置,XY轴方向居中,Z轴方向都放0上面(如下图所示)。
材质要求: 使用 Standard 标准材质,材质类型使用 Blinn。程序纹理尽量只使用位图,有些程序纹理FBX导出时会报错出问题导致灰色材质(并不是全部的程序纹理)(例:Color Correction),纹理图片不能再Max中进行裁剪,FBX不支持。
# 纹理图片
- 纹理图片必须是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里重新指定贴图路径,选中所有的贴图后,把路径更改为当前机器上的贴图所在位置路径。
# 如果交付物是提供obj格式文件
按下面参数设置步骤操作导出数据即可,同样注意别丢失材质贴图文件。
# 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格式数据。
- Github上下载或clone仓库,打开本地的obj2gltf-master文件夹
git clone https://github.com/CesiumGS/obj2gltf.git
- 在obj2gltf-master目录下,输入命令:
npm install
或cnpm install
安装依赖包
npm install
- 执行数据转换,命令行如下:
node bin/obj2gltf.js -i data/test.obj -b
# 命令行支持的参数:
参数 | 说明 | 必选项 | 默认值 |
---|---|---|---|
-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转换工具
- 需要在3dmax中安装OpenCOLLADA插件 (opens new window) , 将下载好的COLLADAMaxNew.dle文件复制粘贴到3dsMax的安装目录的plugins文件夹中;打开软件,选择 自定义->插件管理器 ,在空白处点击右键,选择 加载新插件 在找到插件位置即可 ,添加完成后,在插件管理器中会出现添加进的插件
- 打开3dsMax;选择导出,将模型导出为OpenCOLLADA(*.dae)格式
下载COLLADA2GLTF工具 (opens new window)下载最新工具包。
进入下载包的目录,启动命令行工具,输入命令:
COLLADA2GLTF [.exe] [-i输入] [ -o输出] [选项]
.\COLLADA2GLTF-bin.exe -i F:\COLLADA2GLTF\data\weilan.DAE
# 命令行支持的参数:
参数 | 默认值 | 必选项 | 说明 |
---|---|---|---|
-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 打开模型并确认模型位置
确认或调整模型中心点位置,如图中所指,需要将模型处于两线交叉口,绘制时处于中心位置;
偏移量会导致模型绘制之后出现偏差;
# 3.1.2 导出obj文件
通过3dmax导出文件,根据下图所指引进行导出;
转换后的模型最好放在obj2gltf工具目录的data文件夹下
# 3.2 obj格式转换gltf
下面是以obj2gltf工具为例,转换为gltf文件,转换前确保已经按上面步骤安装好obj2gltf;
- 打开本地的obj2gltf-master文件夹,
- 执行数据转换,命令行如下图:
node bin/obj2gltf.js -i data/test.obj -b
- 转换成功后的gltf文件如下:
转换成功之后将.gltf文件放在项目中,
或者放在独立站点服务,可以参考发布三维数据服务。
# 6.3 在平台中加载gltf
可以在Gltf模型编辑页面 (opens new window) 进行验证,是否成功转换,加载成功效果如下图: