# objTo3d-tiles
**Repository Path**: cesium_processing/objTo3d-tiles
## Basic Information
- **Project Name**: objTo3d-tiles
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 5
- **Forks**: 0
- **Created**: 2022-02-14
- **Last Updated**: 2024-08-20
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# objTo3d-tiles
将 obj 模型转换为 3D Tiles 的 Node 命令行工具以及 Node 模块, 基于[obj2gltf](https://github.com/AnalyticalGraphicsInc/obj2gltf)。
[在线示例](https://princessgod.github.io/plc/batchedTileset.html)
>注意: 目前只支持 `.b3dm` 和 `.i3dm` !
>
>请使用 Cesium v1.37 或以后版本, 因为这里的 3D Tiles 使用 glTF2.0 。
## 开始使用
确保已经安装 [Node](https://nodejs.org/en/) , 然后
```
npm install -g obj23dtiles
```
### 基本用法
* 转换 `.obj` 为 `.gltf`
```
obj23dtiles -i ./bin/barrel/barrel.obj
// 在模型目录导出 barrel.gltf
```
* 转换 `.obj` 为 `.glb`
```
obj23dtiles -i ./bin/barrel/barrel.obj -b
// 在模型目录导出 barrel.glb
```
>注意: 更多 `.gltf` 和 `.glb` 的转换信息可以在 [obj2gltf](https://github.com/AnalyticalGraphicsInc/obj2gltf) 查看。
>注意: 如果你的模型中包含透明纹理,请添加 `--checkTransparency` 参数。
>注意: 如果的模型使用 blinn-phong 材质, 当转换为PBR材质时使用遮蔽贴图会使模型看起来变暗。
>所以 `useOcclusion` (使用遮蔽贴图) 默认为 `false`, 如果你的模型本身就准备使用PBR材质,请加 `--useOcclusion` 参数,这里有一些对比图。

* 转换 `.obj` 为 `.b3dm` 同时带有基础的[属性表](https://github.com/AnalyticalGraphicsInc/3d-tiles/blob/master/TileFormats/BatchTable/README.md), 包含 `batchId` 和 `name` 属性, `name` 就是模型建模时的名字。
```
obj23dtiles -i ./bin/barrel/barrel.obj --b3dm
// 在模型目录导出 barrel.b3dm
```
* 转换 `.obj` 为 `.b3dm`,同时导出默认的[属性表](https://github.com/AnalyticalGraphicsInc/3d-tiles/blob/master/TileFormats/BatchTable/README.md) (一个 JSON 文件)。可以从这个表中获取相关信息以便制作自定义属性表。
```
obj23dtiles -i ./bin/barrel/barrel.obj --b3dm --outputBatchTable
// 在模型目录导出 barrel.b3dm 和 barrel_batchTable.json
```
* 转换 `.obj` 为 `.b3dm`,使用自定义[属性表](https://github.com/AnalyticalGraphicsInc/3d-tiles/blob/master/TileFormats/BatchTable/README.md)。属性和模型对应关系靠 `batchId` 进行连接。
```
obj23dtiles -i ./bin/barrel/barrel.obj -c ./bin/barrel/customBatchTable.json --b3dm
// 在模型目录导出 barrel.b3dm
```
* 转换 `.obj` 为 `.i3dm`,使用自定义[要素表](https://github.com/AnalyticalGraphicsInc/3d-tiles/blob/master/TileFormats/Instanced3DModel/README.md#feature-table)。
```
obj23dtiles -i ./bin/barrel/barrel.obj -f ./bin/barrel/customFeatureTable.json --i3dm
// 在模型目录导出 barrel.i3dm
```
* 转换 `.obj` 为 `.i3dm`,使用自定义[要素表](https://github.com/AnalyticalGraphicsInc/3d-tiles/blob/master/TileFormats/Instanced3DModel/README.md#feature-table)和[属性表](https://github.com/AnalyticalGraphicsInc/3d-tiles/blob/master/TileFormats/Instanced3DModel/README.md#batch-table)。
```
obj23dtiles -i ./bin/barrel/barrel.obj -f ./bin/barrel/customFeatureTable.json
-c ./bin/barrel/customI3dmBatchTable.json --i3dm
// 在模型目录导出 barrel.i3dm
```
要素表目前可以使用以下属性控制模型 : `position`(位置),`orientation`(旋转),`scale`(缩放)。
### 创建单个瓦片
* 创建一个 `.b3dm` 瓦片。
```
obj23dtiles -i ./bin/barrel/barrel.obj --tileset
// 在模型目录导出 Batchedbarrel 文件夹
```
* 创建一个 `.b3dm` 瓦片,并自定义瓦片参数和属性表。
```
obj23dtiles -i ./bin/barrel/barrel.obj --tileset
-p ./bin/barrel/customTilesetOptions.json -c ./bin/barrel/customBatchTable.json
// 在模型目录导出 Batchedbarrel 文件夹
```
* 创建一个 `.i3dm` 瓦片。
```
obj23dtiles -i ./bin/barrel/barrel.obj --tileset --i3dm
-f ./bin/barrel/customFeatureTable.json
// 在模型目录导出 Instancedbarrel 文件夹
```
* 创建一个 `.i3dm` 瓦片,并自定义瓦片参数和属性表。
```
obj23dtiles -i ./bin/barrel/barrel.obj --tileset --i3dm
-f ./bin/barrel/customFeatureTable.json -p ./bin/barrel/customTilesetOptions.json
-c ./bin/barrel/customI3dmBatchTable.json
// 在模型目录导出 Instancedbarrel 文件夹
```
`customTilesetOptions.json` 配置文件可以包含以下信息, 这些都是虚拟值,请在文件中包含自己想修改的属性,没有出现的属性会根据模型自动计算。
```
{
"longitude": -1.31968, // 瓦片原点(模型原点 (0,0,0)) 经度的弧度值。
"latitude": 0.698874, // 瓦片原点维度的弧度值。
"transHeight": 0.0, // 瓦片原点所在高度,单位为米。
"region": true, // 使用 region 作为外包体。
"box": false, // 使用 box 作为外包体。
"sphere": false // 使用 sphere 作为外包体。
}
```
>注意: 如果你没有指明 `transHeight` 属性,你的模型会被放置在高度为0的地表,无论你模型最低点是什么值。比如你有一个飞机模型,它在1000单位高度,那就会被放置在地面上,同样的道理如果你有一个潜艇,都在原点以下,也会被抬升到地面上。所以如果你想保留原始模型的相对高度,可以设置 `transHeight = 0.0`。
这是不用的外包体示意图。

### 捆绑瓦片
你可以将多个瓦片捆绑为一个瓦片,每个瓦片作为外置瓦片集合到一个 `tileset.json` 中。
```
obj23dtiles combine -i ./bin/barrel/output/
```
## 作为 Node 模块使用
如果你想调试此工具或者在node中使用,可以看看[如何作为Node模块使用](NODEUSAGE.md)。
## 测试
导航到项目文件夹下,运行
```
npm run test
```
## 问题定位
首先,确保你的 `.obj` 文件是完整的,通常情况下包含 `.obj`, `.mtl` 和纹理文件比如 `.jpg` 或 `.png`。
如果你使用的 Win10, 可以使用自带的模型浏览工具 “Mixed Reality Viewer” 浏览你的 `.obj` 文件,
或者使用这个[在线浏览工具](https://3dviewer.net/)。
其次,使用此工具导出 `.glb` 然后查看是否现实正常,你可以使用[Cesium](https://www.virtualgis.io/gltfviewer/) 或者 [Three.js](https://gltf-viewer.donmccurdy.com/) gltf 浏览器。
最后,直接导出 `.b3dm` 或瓦片然后在 Cesium 中加载。
## 样例数据
示例代码中的样例数据在 `.bin\barrel\` 文件夹下。
```
barrel\
|
- barrel.blend --
| |- Blender 工程文件和纹理
- barrel.png --
|
- barrel.obj --
| |- Obj 模型文件
- barrel.mtl --
|
- customBatchTable.json ---- b3dm 使用的属性表例子
|
- customTilesetOptions.json ---- 自定义瓦片配置文件
|
- customFeatureTable.json ---- i3dm 使用的要素表例子
|
- customI3dmBatchTable.json ---- i3dm 使用的属性表例子
|
- output\ ---- 导出的数据
|
- barrel.glb
|
- barrel.gltf
|
- barrel_batchTable.json ---- 默认属性表
|
- Batchedbarrel\ ---- 使用 b3dm 的瓦片
| |
| - tileset.json
| |
| - barrel.b3dm
|
- Instancedbarrel\ ---- 使用 i3dm 的瓦片
| |
| - tileset.json
| |
| - barrel.i3dm
|
- BatchedTilesets\ ---- 自定义配置文件的瓦片
|
- tileset.json
|
- barrel_withDefaultBatchTable.b3dm
|
- barrel_withCustonBatchTable.b3dm
```
## 相关资源
* 在线 glTF 浏览工具。 [Cesium](https://www.virtualgis.io/gltfviewer/), [Three.js](https://gltf-viewer.donmccurdy.com/)。
* [Cesium](https://github.com/AnalyticalGraphicsInc/cesium)
* [3D Tiles](https://github.com/AnalyticalGraphicsInc/3d-tiles)
* [glTF](https://github.com/KhronosGroup/glTF)