Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/OpenDroneMap/Obj2Tiles
Converts OBJ files to OGC 3D tiles by performing splitting, decimation and conversion
https://github.com/OpenDroneMap/Obj2Tiles
3d-tiles 3dtiles cesiumjs generator mesh model
Last synced: 3 months ago
JSON representation
Converts OBJ files to OGC 3D tiles by performing splitting, decimation and conversion
- Host: GitHub
- URL: https://github.com/OpenDroneMap/Obj2Tiles
- Owner: OpenDroneMap
- License: agpl-3.0
- Created: 2022-04-26T10:47:13.000Z (almost 3 years ago)
- Default Branch: master
- Last Pushed: 2024-02-22T09:52:22.000Z (12 months ago)
- Last Synced: 2024-10-29T22:45:21.963Z (4 months ago)
- Topics: 3d-tiles, 3dtiles, cesiumjs, generator, mesh, model
- Language: C#
- Homepage:
- Size: 46.5 MB
- Stars: 221
- Watchers: 10
- Forks: 64
- Open Issues: 42
-
Metadata Files:
- Readme: README.md
- License: LICENSE.md
Awesome Lists containing this project
- awesome-3d-tiles - Obj2Tiles - Converts OBJ files to OGC 3D tiles. (Tile creation (Community))
README
# Obj2Tiles - Converts OBJ file to 3D Tiles format



[](https://github.com/OpenDroneMap/Obj2Tiles/actions/workflows/build-test.yml)
[](https://github.com/OpenDroneMap/Obj2Tiles/actions/workflows/publish.yml)Obj2Tiles is a fully fledged tool to convert OBJ files to 3D Tiles format.
It creates multiple LODs, splits the mesh and repacks the textures.## Installation
You can download precompiled binaries for Windows, Linux and macOS from https://github.com/OpenDroneMap/Obj2Tiles/releases.
## Command line parameters
```
Input (pos. 0) Required. Input OBJ file.
Output (pos. 1) Required. Output folder.
-s, --stage (Default: Tiling) Stage to stop at (Decimation, Splitting, Tiling)
-l, --lods (Default: 3) How many levels of details-d, --divisions (Default: 2) How many tiles divisions
-z, --zsplit (Default: false) Splits along z-axis too
-k, --keeptextures (Default: false) Keeps original textures
--lat Latitude of the mesh
--lon Longitude of the mesh
--alt (Default: 0) Altitude of the mesh (meters)
-e, --error (Default: 100), baseError value for root node
--scale (Default: 1), scale for data if using units other than meters ( 1200.0/3937.0 for survey ft)
--y-up-to-z-up (Default: false) Converts Y-up to Z-up
--use-system-temp (Default: false) Uses the system temp folder
--keep-intermediate (Default: false) Keeps the intermediate files (do not cleanup)
--help Display this help screen.
--version Display version information.
```The pipeline is composed of the following steps:
### Decimation
The source obj is decimated using the `Fast Quadric Mesh Simplification` algorithm (by [Mattias Edlund](https://github.com/Whinarn)).
The algorithm was ported from .NET Framework 3.5 to .NET Core 6.0. The original repo is [here](https://github.com/Whinarn/MeshDecimator).You can specify how many LODs (levels of detail) you want to generate using the `--lods` parameter. The decimation levels are generated using this formula:
`quality[i] = 1 - ((i + 1) / lods)`
For example: with 5 LODs the program will use the following quality levels: 80%, 60%, 40%, 20%.
If you specify 1 LOD, the decimation will be skipped.### Splitting
For every decimated mesh, the program splits it recursively along x, y and z axis (optional using the `--zsplit` flag).
Every split is a new mesh with repacked textures (to save space), the [bin pack](https://github.com/juj/RectangleBinPack/) algorithm is by [Jukka Jylänki](https://github.com/juj).
If you want to preserve the original textures, use the `--keeptextures` flag (not recommended)You can control how many times the split is performed by using the `--divisions` flag. The model will be split into `divisions^2` meshes (or `divisions^3` if `--zsplit` is used).
### 3D Tiles conversion
Each split mesh is converted to B3DM format using [ObjConvert](https://github.com/SilentWave/ObjConvert).
Then the `tileset.json` is generated using the resulting files. You can specify the `--lat` and `--lon` and `--alt` parameters to set the location of the model.
See the [Remarks](#Remarks) section to find out how to rotate the model.## Running
Obj2Tiles is built using [.NET Core 8.0](https://dotnet.microsoft.com/en-us/download/dotnet/8.0). Releases are available on [GitHub](https://github.com/OpenDroneMap/Obj2Tiles/releases) for a multitude of platforms (win / linux / mac).
You can download the [latest release](https://github.com/OpenDroneMap/Obj2Tiles/releases/latest) or compile it yourself using the following commands:```
git clone https://github.com/OpenDroneMap/Obj2Tiles.git
cd Obj2Tiles
dotnet build -c Release
```------------
## Examples
You can download the test obj file [here](https://github.com/DroneDB/test_data/raw/master/brighton/odm_texturing.zip).
The Brighton Beach textured model generated using [OpenDroneMap](https://github.com/OpenDroneMap/ODM).### Basic usage (using defaults)
It runs all the pipeline stages and generates the `tileset.json` file in the output folder.
```
Obj2Tiles model.obj ./output
```### Decimation
Stop the pipeline at the decimation stage and generate 8 LODs
```
Obj2Tiles --stage Decimation --lods 8 model.obj -o ./output
```### Splitting
Stop the pipeline at the splitting stage and generate 3 divisions per axis
```
Obj2Tiles --stage Splitting --divisions 3 model.obj ./output
```### Full pipeline
Run all the pipeline stages and generate the `tileset.json` file in the output folder.
```
Obj2Tiles --lods 8 --divisions 3 --lat 40.689434025350025 --lon -74.0444987716782 --alt 120 model.obj ./output
```## Rotating the model
After generating `tileset.json`, you can edit the file and change the 4x4 Transform matrix to account for translation, rotation and scaling. This is the matrix structure:

The tiling stage uses this matrix to place the model in the requested geo location:

But you can add scaling:

Or rotation around any of the 3 axes:



By combining these matrices, you can rotate, scale and translate the model.
You can find more details about this topic on [BrainVoyager](https://www.brainvoyager.com/bv/doc/UsersGuide/CoordsAndTransforms/SpatialTransformationMatrices.html)
## Remarks
All the pipeline stages are multi threaded to speed up the process.
You can stop the pipeline at any stage by providing the `--stage` flag.
If you need to keep the intermediate files, use the `--keep-intermediate` flag.
You can use the `--use-system-temp` flag to use the system temp folder instead of the output folder.## Gallery


