Amal-David/meshy2glb
GitHub: Amal-David/meshy2glb
一款基于浏览器的本地 3D 模型查看器与转换器,能将专有 .meshy 格式解密、解压并导出为多种通用 3D 文件格式。
Stars: 1 | Forks: 1
# meshy2glb
基于浏览器的 [meshy.ai](https://meshy.ai) 转换器和查看器,支持
`.meshy` 3D 模型文件和常见 3D 格式。拖入文件,
在可调节光照下预览,
然后导出为 `.glb`、`.gltf`、`.obj`、
`.stl`、`.ply` 或 `.usdz`。
**在线体验:** https://amal-david.github.io/meshy2glb/
所有操作均在客户端运行——解密、meshopt 解压缩和
渲染都在您的浏览器中进行。任何文件都不会离开您的设备。
## 工作原理
`.meshy` 文件是经过 AES-256-CTR 加密的 glTF/GLB 容器,包含
meshopt 压缩的顶点数据。解码器是通过逆向工程以净室开发(clean-room)方式构建的(包中不包含 meshy 代码或 WASM):
1. **解密** — body 的前 8 KB 使用
固定的 32 字节 ASCII 密钥和来自 header 的逐文件 nonce
进行 AES-256-CTR 加密。
随后是一个 16 字节的 GCM 认证标签。之后的所有内容均为明文。
2. **解压缩** — 解密后的 GLB 使用 `EXT_meshopt_compression`。
我们对每个压缩的 bufferView 运行 [meshoptimizer](https://github.com/zeux/meshoptimizer) 的 JS
解码器,以生成包含原始顶点/索引数据的标准 GLB。
3. **渲染 / 转换** — three.js 将模型加载到共享场景中。
查看器提供轨道控制、可调节光照、线框
模式、背景预设和自动旋转。导出器将该
场景序列化为选定的输出格式。
完整的 pipeline(解密 → 解压缩 → 渲染)对于 5 MB 的
模型大约需要 80 毫秒。
## 功能
- **拖拽或点击上传** — 接受 `.meshy`、`.glb`、
`.gltf`、`.obj`、`.stl`、`.ply`、`.dae`、`.3mf` 和 `.fbx`
- **光照控制** — 曝光、环境强度、直射
光、环境光(均为实时滑块)
- **显示选项** — 线框模式切换、自动旋转、背景
预设(深色 / 灰色 / 白色 / 黑色)、重置相机
- **多格式导出** — 下载标准的 `.glb`、`.gltf`、
`.obj`、`.stl`、`.ply` 或 `.usdz`,适用于 Blender、Unity、Unreal、
切片软件、AR 预览和其他模型工具
- **关联资源支持** — 加载 `.gltf` 文件时,需同时选择
`.bin` 和纹理文件以及主文件,以便在本地解析相对资源
引用
- 适用于任何静态主机 — GitHub Pages、Cloudflare Pages、S3、
localhost
## 本地运行
```
git clone https://github.com/Amal-David/meshy2glb
cd meshy2glb
./start.sh
```
## 测试
```
node --test tests/decrypt.test.mjs
```
测试涵盖格式检测、AES-CTR 解密、meshopt 解码
完整性(零损坏索引)以及 GLB 结构验证。
基于 fixture 的测试用例会在 `tests/fixtures/` 中的
任何 `.meshy` 文件或 `$MESHY_FIXTURES` 上运行。
## 文件格式(逆向工程)
```
Offset Contents
──────────── ────────────────────────────────────────────────
0..7 magic "MESHY.AI"
8..9 version (uint16 LE, observed: 1)
10..21 12-byte AES nonce
22..31 reserved
32..8224 AES-256-CTR ciphertext (always 8192 bytes)
8224..8240 16-byte AES-GCM authentication tag
8240..EOF plaintext (WebP textures + meshopt streams)
```
加密算法:AES-256-CTR,密钥 = `JSON{"accessors":[{"bufferView":`(字面
ASCII),计数器 = `nonce || uint32be(2)`。
加密的 8 KB 包含 GLB header、glTF JSON、BIN chunk
header 和第一个 buffer view 的起始部分。16 字节标签之后的
所有内容均以明文存储 —— 纹理 (WebP) 和 meshopt-
压缩的顶点/索引流。
完整的逆向工程说明(包括走过的弯路)请见
[NOTES.md](./NOTES.md)。
## 架构
```
src/
decrypt.js AES-256-CTR decryption via WebCrypto (~50 LOC)
decompress.js meshopt decompression → standard GLB (~100 LOC)
viewer.js three.js renderer with controls
index.html UI: upload, controls panel, top bar, import/export routing
tests/
decrypt.test.mjs node:test suite
meshopt_decoder.module.js vendored decoder for offline tests
```
## 免责声明
与 [meshy.ai](https://meshy.ai) 无关联。
## 许可证
[MIT](./LICENSE)
标签:3D模型, three.js, WebGL, 云资产清单, 后端开发, 多模态安全, 数据可视化, 文件解密, 格式转换, 浏览器端, 逆向工程