3D解剖模型数据管线全解:Human Atlas如何把OBJ变成33MB压缩几何
【免费下载链接】human-atlasOpen-source 3D anatomy explorer: 2,234 selectable BodyParts3D meshes, system layers, search, and exploded views.项目地址: https://gitcode.com/gh_mirrors/hu/human-atlas
Human Atlas是一个开源的 3D 解剖模型浏览器,基于 BodyParts3D 4.0 数据集,把成年男性参考解剖拆分成2,234 个可独立点选的 3D 网格,覆盖 15 个人体系统、3,432 个命名解剖概念。它最精巧的部分,是一条把原始 OBJ 模型加工成仅约 33MB 压缩几何的数据管线:坐标单位换算 → 二进制打包 → 网格简化 → gzip 压缩,四步走完全程。本文将完整拆解这条管线,告诉你它为什么能在浏览器里流畅旋转整副人体骨骼与器官。
🗂️ 管线总览:三步脚本,一条流水线
整个数据管线由仓库中 scripts/ 目录下的三个脚本串联完成,处理产物全部落在 public/models/:
| 步骤 | 脚本 | 作用 | 产出 |
|---|---|---|---|
| ① 转换打包 | convert-anatomy.py | 解析 OBJ,坐标换算,二进制分块 | atlas.json+ 二进制块 |
| ② 网格简化 | optimize-anatomy.mjs | meshoptimizer 二次型简化 | body-0.bin~body-14.bin |
| ③ 压缩下载包 | compress-models.mjs | gzip 9 级压缩 | body-*.bin.gz |
最终,浏览器端只负责按 atlas.json 这张"目录清单"按需下载对应分块。
📐 第一步:把 OBJ 读进二进制分块
convert-anatomy.py 是管线的起点,它逐个读取 BodyParts3D 官方 OBJ 文件,做四件关键的事:
- 坐标换算:BodyParts3D 原始数据是"毫米 + Z 轴朝上",脚本把它换算成 Web 图形通用的"米 + Y 轴朝上",并整体平移到展示台上——人体模型因此能被直接放进 Three.js 场景;
- 法线量化:法向量从 32 位浮点压缩为有符号 16 位整数(乘以 32767 后取整),精度损失肉眼不可见,体积却砍半;
- 二进制打包:每个网格的顶点、法线、索引依次写入内存中的字节流,数据写满约 7MB 就切一个新块;
- 生成清单:public/models/atlas.json 记录每个 part 的名称、所属系统(骨骼、肌肉、心血管等 15 类)、所在分块及数据偏移量。
这一步不改任何拓扑结构,只是把"文本格式 + 冗余坐标"变成"紧凑二进制 + 偏移索引"。
✂️ 第二步:0.2% 误差内的网格简化
原始数据共有6,681,030 个三角形,直接全量下发显然偏大。optimize-anatomy.mjs 引入 meshoptimizer 库做二次型网格简化,核心策略是:
- 以每个解剖结构自身尺寸为基准,限制相对误差 0.2%——大器官允许减得多,细小血管和牙齿则被"保底"(最少保留 96 个三角形);
- 2,234 个命名网格一个不少,简化只发生在网格内部,不合并不同结构;
- 简化后的块按约 4MB 重新切分,写出
body-0.bin到body-14.bin共 15 个文件(约 59.5MB)。
结果:三角形从 668 万降到2,288,268 个,缩减约三分之二,而视觉上每块骨骼、每颗牙齿依然完整可点选。清单中的optimized字段完整记录了简化方法与最大误差,方便审计。
📦 第三步:gzip 压到 33MB
compress-models.mjs 对每个二进制块执行gzip 9 级(最高)压缩,生成同名的.gz文件并更新清单。顶点坐标这类连续数值对 gzip 极其友好,压缩率接近 52%:
15 个
.bin原始文件约59.5MB→ 15 个.gz文件合计约33MB,加上 1.3MB 的atlas.json,这就是 README 中"约 33MB 压缩几何"的由来。
🌐 浏览器端:3 路并发 + 流式解压
下载侧同样讲究细节(见 app/scene.tsx 与 app/model-download.ts):
- 3 路并发拉取 15 个分块,按"已加载分块数 / 总分块数"显示进度条;
- 静态服务器可能把
.gz当压缩响应、也可能当普通文件,客户端通过检查字节头的1F 8B魔数避免二次解压,再用浏览器原生DecompressionStream流式解压; - 解压后校验字节长度,不完整直接报错提示刷新,杜绝"半个人体"出现在页面上。
📊 关键数字一览
| 指标 | 数值 |
|---|---|
| 源数据 | BodyParts3D 4.0,CC BY 4.0 |
| 网格数量 | 2,234 个(全部保留) |
| 三角形 | 6,681,030 → 2,288,268 |
| 未压缩几何 | 约 59.5MB(15 块) |
| 压缩后下载 | 约 33MB(15 块 .gz + 1.3MB 清单) |
| 简化误差上限 | 每结构 0.2% 相对误差 |
🚀 想自己重建几何?
仓库已内置浏览器可用的几何数据,重建纯属可选。按 README 描述:先取得官方 BodyParts3D OBJ 压缩包与英文元数据表,准备概念合并与系统映射,然后依次执行:
python3 scripts/convert-anatomy.py <OBJ目录> <概念表> <系统表> node scripts/optimize-anatomy.mjs node scripts/compress-models.mjs跑完你会得到与线上完全一致的 15 块二进制模型和更新后的清单。
⚖️ 数据来源与许可
解剖数据基于BodyParts3D 4.0(The Database Center for Life Science,CC BY 4.0 许可),完整出处、论文引用与二次加工细节记录在 public/ATTRIBUTION.md 中。应用代码本身遵循 MIT 许可。需要提醒:这是一个教育用途的探索器,并非临床诊断或手术工具。
小结:Human Atlas 用"坐标换算 + 16 位法线量化 + 0.2% 误差网格简化 + gzip 最高压缩"四板斧,把一个 668 万三角形的人体模型压进 33MB,还能在浏览器里做到 2,234 个结构全部可交互——这正是它值得细读的工程价值。
【免费下载链接】human-atlasOpen-source 3D anatomy explorer: 2,234 selectable BodyParts3D meshes, system layers, search, and exploded views.项目地址: https://gitcode.com/gh_mirrors/hu/human-atlas
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考