Skip to main content

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 万面以上层级才会被分块

工作原理

  1. 解析:两遍扫描 OBJ 解析器 — 先计数,再填充预分配的 numpy 数组,支持 GB 级大文件
  2. LOD 层级数:根据模型面数对数缩放(3~25 级)。面数越多层级越多,过渡越平滑
  3. LOD 目标:从原始面数的 ~0.1% 到 ~85% 的几何级数分布
  4. 简化:顶点聚类(Vertex Clustering)— 位于同一 3D 网格单元内的顶点合并为一个
  5. 空间分块:超过 30 万面的层级按空间位置分割为 2×2×2 或 3×3×3 的瓦片网格,浏览器可并行加载
  6. 压缩:每个网格 → OBJ 临时文件 → draco_encoder.drc 文件。位置 16 位、纹理 14 位量化保证大模型精度
  7. 纹理:优先复制原始纹理,没有则自动生成程序化纹理

查看器集成

输出目录结构与 standalone Three.js 查看器的目录格式完全兼容。 lod_config.json 中包含前端所需的 tile_maplod_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)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

obj2drc-1.0.0-py3-none-any.whl (15.8 kB view details)

Uploaded Python 3

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

Hashes for obj2drc-1.0.0.tar.gz
Algorithm Hash digest
SHA256 f87b1d6ae2c4fd43799670346a40b003f849e719b3057304aa8e7fd0c58c6c60
MD5 9d08b765685cc68d1727256a2a5186ba
BLAKE2b-256 801f4c91bf569015db7e77bbf9911b8d30bb20240c12dd4c19585a3f281e45e0

See more details on using hashes here.

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

Hashes for obj2drc-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 07df3b5442bffc673afb541d5269eb95a5f1aae044e9840a4e3d8dff8627ef07
MD5 f207faedde4f2089d984e454c9968070
BLAKE2b-256 44adfc10a34516279a19e125bce6b62290f6b079e929f2d45cc19b163e4696b5

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page