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, 云资产清单, 后端开发, 多模态安全, 数据可视化, 文件解密, 格式转换, 浏览器端, 逆向工程