Generate LOD resources from OBJ for Three.js viewer with Draco compression
Project description
obj2drc — OBJ 转 Draco LOD 工具
将大型 OBJ 三维模型转换为多级 LOD(Level of Detail)资源,使用 Google Draco 压缩为 .drc 文件,适用于 Three.js 网页查看器。
文件结构
obj2drc/
├── pyproject.toml # 包配置:名称、版本、依赖、命令行入口
├── requirements.txt # Python 依赖清单(numpy)
├── README.md # 本文件
├── .gitignore # 版本控制忽略规则
│
└── obj2drc/ # Python 源码包
├── __init__.py # 公开 API 入口,导出 obj2drc / process_all
├── cli.py # 命令行入口,定义 --pos-bits / --workers 等参数
├── pipeline.py # 核心流水线:解析→简化→分块→编码→输出
│
└── lodkit/ # 底层算法库
├── __init__.py # 模块导出
├── fast_parser.py # OBJ 解析器(两遍扫描,支持 GB 级文件)
└── mesh_lod.py # 网格简化 + 空间分块
文件职责
| 文件 | 职责 |
|---|---|
| pyproject.toml | pip 包元数据。定义包名 obj2drc、依赖 numpy、命令行入口 obj2drc = "obj2drc.cli:main" |
| requirements.txt | 运行时依赖(numpy>=1.20),pip install -r 用 |
| init.py | 导出版本号、核心函数 obj2drc() 和批量处理 process_all() |
| cli.py | argparse 参数解析。接收 input.obj、output_dir、--pos-bits、--workers、--levels 等,调用 pipeline.obj2drc() |
| pipeline.py | 6 步流水线:①解析 OBJ → ②计算 LOD 目标面数 → ③逐级简化网格 → ④空间分块 → ⑤纹理处理 → ⑥输出 lod_config.json |
| fast_parser.py | 两遍扫描解析器:第一遍计数顶点/面数,第二遍填充预分配 numpy 数组。解析结果以 .npy 缓存,下次秒级加载 |
| mesh_lod.py | 顶点聚类简化(Vertex Clustering)+ 空间分块(Spatial Tiling)。支持 UV 坐标传播 |
环境要求
- Python 3.8+
- numpy(通过
pip install -r requirements.txt安装) - draco_encoder 命令行工具 — Draco 压缩必需
安装 draco_encoder
macOS(Homebrew):
brew install draco
Linux:
# Ubuntu/Debian
sudo apt install draco
# Fedora/RHEL
sudo dnf install draco
# Arch Linux
sudo pacman -S draco
如果发行版源中没有
draco包,请使用下方源码编译方式安装。
Windows(vcpkg):
vcpkg 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 .
obj2drc 输入的模型.obj ./输出目录
# 方式二:通过 Python 模块运行
python -m obj2drc.cli 输入的模型.obj ./输出目录
# 指定纹理文件
obj2drc 输入的模型.obj ./输出目录 --texture 纹理.png
命令行参数
基础
| 参数 | 默认 | 说明 |
|---|---|---|
input |
必填 | 输入 OBJ 文件路径 |
output |
必填 | 输出目录 |
--texture PATH |
自动检测 | 纹理 PNG。不指定则自动在 OBJ 同目录查找 |
LOD 控制
| 参数 | 默认 | 说明 |
|---|---|---|
--levels N |
自动 | LOD 层级数(3~25,根据面数自动缩放) |
--no-tile |
关闭 | 禁用空间分块。所有层级输出为单文件 |
编码质量
| 参数 | 默认 | 说明 |
|---|---|---|
--pos-bits N |
16 | 位置量化精度 (1-31)。核心质量参数,越低文件越小 |
--compress N |
7 | Draco 压缩级别 (0-10)。越高文件越小但编码越慢 |
--skip-normals |
关闭 | 跳过法线编码。Three.js 可自动计算法线 |
--skip-uv |
关闭 | 跳过 UV 编码。无纹理时可开启 |
性能
| 参数 | 默认 | 说明 |
|---|---|---|
--workers N |
1 | 并行编码线程。0=全部 CPU,1=顺序,N=指定数 |
--no-procedural-tex |
关闭 | 无纹理时跳过,不生成程序化纹理 |
输出结构
输出目录/
├── mesh_lod/ # DRC 网格文件
│ ├── 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 # 元数据
API 用法
from obj2drc import obj2drc, process_all
# 单模型
config = obj2drc("model.obj", "./output", pos_bits=14, workers=8)
# 批量处理目录下所有 OBJ
results = process_all("models/", "data/", recursive=True, workers=4)
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.1.0.tar.gz
(20.6 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.1.0-py3-none-any.whl
(19.6 kB
view details)
File details
Details for the file obj2drc-1.1.0.tar.gz.
File metadata
- Download URL: obj2drc-1.1.0.tar.gz
- Upload date:
- Size: 20.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
56e4e490f6d2547095c75baa8d35c14a42a9f69a0f674b4de0ec3b70cc602661
|
|
| MD5 |
48fb45318c3c0c7e923eb1f6a8ad2e14
|
|
| BLAKE2b-256 |
c87d5503ce65b309158500d124a5efd56882e55d45e10a28b9aa08003cb3c269
|
File details
Details for the file obj2drc-1.1.0-py3-none-any.whl.
File metadata
- Download URL: obj2drc-1.1.0-py3-none-any.whl
- Upload date:
- Size: 19.6 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 |
22d286c06ecde24b018a655d8a313cb6b322734530fa28bdc171cfaeee31b3bd
|
|
| MD5 |
3c835754e1eafd6ee4ed692cbfc46acc
|
|
| BLAKE2b-256 |
0b794be9d2539c1a6ce0d9030e24ccf6e43867d1423e399723fa647144c2a8b8
|