Generate LOD resources from OBJ for Three.js viewer with Draco compression
Project description
OBJ → DRC LOD 生成器
将大型 OBJ 三维模型转换为多级 LOD(Level of Detail)资源,使用 Draco 压缩网格文件(.drc),适用于 Three.js 网页查看器。
目录结构
obj2drc/
├── pyproject.toml # 包元数据与依赖
├── obj2drc/ # Python 包
│ ├── __init__.py # 公开 API: generate_lods
│ ├── cli.py # 命令行入口 (obj2drc 命令)
│ ├── pipeline.py # 核心逻辑
│ └── lodkit/ # 核心库
│ ├── fast_parser.py # 高效 OBJ 解析器(支持多 GB 大文件)
│ └── mesh_lod.py # 网格简化与空间分块
├── requirements.txt # Python 依赖
└── README.md # 本文件
环境要求
- Python 3.8+
- numpy(通过
pip install -r requirements.txt安装) - draco_encoder 命令行工具 — Draco 压缩必需
安装 draco_encoder
macOS(Homebrew):
brew install draco
Ubuntu/Debian:
sudo apt install draco
从源码编译:
git clone https://github.com/google/draco.git
cd draco
mkdir build && cd build
cmake .. && make
sudo make install
快速开始
# 安装 Python 依赖
pip install -r requirements.txt
# 方式一:直接通过 obj2drc 命令运行(推荐,需先 pip install)
pip install .
obj2drc 输入的模型.obj ./输出目录
# 方式二:通过 Python 模块运行
python -m obj2drc.cli 输入的模型.obj ./输出目录
# 指定纹理文件
obj2drc 输入的模型.obj ./输出目录 --texture 纹理.png
输出结构
输出目录/
├── mesh_lod/
│ ├── lod_0.drc # 最粗糙层级(面数最少)
│ ├── lod_1.drc
│ ├── ...
│ ├── lod_N.drc # 分块前最细的单文件层级
│ ├── lod_{N+1}/ # 分块层级从这里开始(30 万面以上自动分块)
│ │ ├── tile_0_0_0.drc
│ │ ├── tile_0_0_1.drc
│ │ └── ...
│ └── ...
├── three_lod/
│ └── 模型名_texture.png # 纹理(复制或程序生成)
└── lod_config.json # 供前端使用的元数据
选项说明
| 参数 | 默认值 | 说明 |
|---|---|---|
--texture PATH |
自动检测 | 纹理 PNG 路径。不指定则自动在 OBJ 目录查找 |
--compress N |
7 | Draco 编码压缩级别 (0=最快编码/文件较大, 10=最慢编码/文件最小)。不影响网格质量,质量由固定量化精度(位置 16 位、纹理 14 位)保证 |
--levels N |
自动 | LOD 层级数量。自动根据面数对数缩放(3~25 级)。1000 面→3 级,50 万面→15 级,1000 万面→22 级 |
--no-tile |
关闭 | 禁用空间分块(所有层级都是单文件)。仅 30 万面以上层级才会被分块 |
工作原理
- 解析:两遍扫描 OBJ 解析器 — 先计数,再填充预分配的 numpy 数组,支持 GB 级大文件
- LOD 层级数:根据模型面数对数缩放(3~25 级)。面数越多层级越多,过渡越平滑
- LOD 目标:从原始面数的 ~0.1% 到 ~85% 的几何级数分布
- 简化:顶点聚类(Vertex Clustering)— 位于同一 3D 网格单元内的顶点合并为一个
- 空间分块:超过 30 万面的层级按空间位置分割为 2×2×2 或 3×3×3 的瓦片网格,浏览器可并行加载
- 压缩:每个网格 → OBJ 临时文件 →
draco_encoder→.drc文件。位置 16 位、纹理 14 位量化保证大模型精度 - 纹理:优先复制原始纹理,没有则自动生成程序化纹理
查看器集成
输出目录结构与 standalone Three.js 查看器的目录格式完全兼容。
lod_config.json 中包含前端所需的 tile_map 和 lod_thresholds 数组。
许可
MIT
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
obj2drc-1.0.0.tar.gz
(16.3 kB
view details)
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
obj2drc-1.0.0-py3-none-any.whl
(15.8 kB
view details)
File details
Details for the file obj2drc-1.0.0.tar.gz.
File metadata
- Download URL: obj2drc-1.0.0.tar.gz
- Upload date:
- Size: 16.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f87b1d6ae2c4fd43799670346a40b003f849e719b3057304aa8e7fd0c58c6c60
|
|
| MD5 |
9d08b765685cc68d1727256a2a5186ba
|
|
| BLAKE2b-256 |
801f4c91bf569015db7e77bbf9911b8d30bb20240c12dd4c19585a3f281e45e0
|
File details
Details for the file obj2drc-1.0.0-py3-none-any.whl.
File metadata
- Download URL: obj2drc-1.0.0-py3-none-any.whl
- Upload date:
- Size: 15.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
07df3b5442bffc673afb541d5269eb95a5f1aae044e9840a4e3d8dff8627ef07
|
|
| MD5 |
f207faedde4f2089d984e454c9968070
|
|
| BLAKE2b-256 |
44adfc10a34516279a19e125bce6b62290f6b079e929f2d45cc19b163e4696b5
|