# bim-convert **Repository Path**: Robnet/bim-convert ## Basic Information - **Project Name**: bim-convert - **Description**: BIM转换工具,支持主流建筑信息模型格式互转,提升设计协同效率。 - **Primary Language**: C++ - **License**: LGPL-3.0 - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-07-16 - **Last Updated**: 2026-07-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # bim-convert 把三维模型转换为 **OGC 3D Tiles**(面向 **Cesium 三维地球**,支持地理参考)或 **glTF 2.0**。 > 本仓库为 **纯 C# 实现**:无 C/C++ 工程、无 vcpkg、无自写 P/Invoke。 > - **OBJ** 由引擎直接解析(`ObjParser.cs`); > - **FBX / glTF / GLB / DAE / STL / PLY / 3DS / IFC / BLEND** 等由内置 **SharpAssimp**(Assimp 5.x 的 .NET 封装,自带原生 `assimp.dll`)解析。 > 转换逻辑实现于 `dotnet/Engine`(一个 `net48` 库,依赖 NuGet 包 `SharpAssimp` 与 `Openize.Drako`)。 > Revit 插件与 C++ 工程已移除;目前面向 **Navisworks 2020** 及通用网格模型(FBX 等)。 > > 输出格式支持:3D Tiles、GLB、glTF 分离(`model.gltf` + `model.bin`)。 ## 仓库布局 ``` dotnet/ Engine/ 纯 C# 转换引擎(net48) OBJ -> glTF 2.0 (model.glb) / 3D Tiles (tileset.json + tiles.b3dm) 内置顶点量化 + Draco 压缩(KHR_draco_mesh_compression) ui/ BimConvert.UI/ WPF 桌面界面(net8.0-windows),引用 Engine BimConvert.Verify/ 无界面端到端验证程序(net8.0),引用 Engine plugins/ NavisworksExport/ Navisworks 2020 AddIn(net48,进程内导出),引用 Engine ``` ## 管线 ``` 输入源: • FBX / glTF / GLB / DAE / STL / PLY / 3DS / IFC / BLEND -> SharpAssimp(内置原生 assimp.dll) • OBJ -> ObjParser(引擎直接解析) • Navisworks 2020 COM -> 直接产出 Scene(Mesh/Node) │ ▼ Scene(Mesh/Node/Material) —— 格式无关的中枢数据结构 │ ├─> GltfBuilder ──> GLB / 分离 glTF └─> B3dmWriter + OctreeTilesetBuilder + TilesetWriter ──> 3D Tiles (tileset.json + *.b3dm) ``` - `dotnet/Engine/ObjParser.cs` — OBJ 解析器(引擎直接解析,供命令行/验证入口使用)。 - `dotnet/Engine/FbxParser.cs` — 经 **SharpAssimp** 导入 FBX / glTF / DAE / STL / PLY / 3DS 等:世界变换**烘焙进顶点/法线**,每个源网格产出一个 engine `Mesh`+`Node`(transform 为单位矩阵),从而复用既有 glTF / 3D Tiles writer 不变;3D Tiles 的 batch table 可据此按对象区分。 - `dotnet/Engine/GeoReference.cs` — WGS84 ENU→ECEF 变换,把模型局部坐标提升到地球坐标。 - `dotnet/Engine/GltfBuilder.cs` — 手写 GLB / 分离 glTF(JSON + BIN),支持: - 顶点去重与索引共享 - 按 `Mesh.materialIndex` 输出多材质(保留 Navisworks 颜色) - 位置/法线量化(`KHR_mesh_quantization`) - **Draco 压缩**(`KHR_draco_mesh_compression`,经 Openize.Drako 纯 C# 编码) - `_BATCHID` 自适应 UINT8/UINT16/UINT32 - `dotnet/Engine/B3dmWriter.cs` — 28 字节头 + Feature Table(`BATCH_LENGTH`) + Batch Table(`id`) + 内嵌 GLB。 - `dotnet/Engine/MeshDecimator.cs` — 基于空间网格的顶点合并抽稀,用于每节点 LOD。 - `dotnet/Engine/OctreeTilesetBuilder.cs` — 八叉树空间分块,根节点/内部节点输出粗模,叶子节点输出精模,使用 `refine=REPLACE`。 - `dotnet/Engine/TilesetWriter.cs` — 输出 `tileset.json`;根瓦片带 `transform`(地理参考时为 ENU→ECEF), 每个瓦片的 `boundingVolume.box` 为模型局部 AABB。 ## 构建 无需 CMake / vcpkg,只要 .NET 8 SDK(WPF 界面与验证程序)及 Navisworks 2020(插件)。 ```bash # 引擎 + 验证程序(不依赖 Navisworks) dotnet build dotnet/ui/BimConvert.Verify/BimConvert.Verify.csproj -c Release dotnet run --project dotnet/ui/BimConvert.Verify/BimConvert.Verify.csproj -c Release # WPF 界面 dotnet build dotnet/ui/BimConvert.UI/BimConvert.UI.csproj -c Release dotnet run --project dotnet/ui/BimConvert.UI/BimConvert.UI.csproj -c Release # Navisworks 2020 插件(需 Navisworks Manage 2020 安装,DLL 在默认路径) dotnet build dotnet/plugins/NavisworksExport/NavisworksExport.csproj -c Release ` -p:NavisworksApiDir="C:\Program Files\Autodesk\Navisworks Manage 2020" ``` 端到端验证会读取 `dotnet/ui/BimConvert.Verify/samples/cube.obj`,断言产出 `model.glb`(glTF)或 `tileset.json` + 至少一个 `*.b3dm`(3D Tiles)。 ## 用法 ```bash # 本地查看器(无地理参考) dotnet run --project dotnet/ui/BimConvert.Verify -- samples/cube.obj ./output tiles dotnet run --project dotnet/ui/BimConvert.Verify -- samples/cube.obj ./output gltf dotnet run --project dotnet/ui/BimConvert.Verify -- samples/cube.obj ./output gltf_sep # Cesium 地球(地理参考) # 在 WPF 界面勾选「地理参考」并填经纬度/高程,或在 Navisworks 插件调用时设置。 ``` 在 Cesium 中加载 3D Tiles: ```js const tileset = await Cesium.Cesium3DTileset.fromUrl("./output/tileset.json"); viewer.scene.primitives.add(tileset); ``` ## Navisworks 插件(进程内导出,WPF 界面) 见 [`dotnet/plugins/README.md`](dotnet/plugins/README.md):Navisworks 2020 `AddInPlugin` 骨架, 在宿主进程内用官方 .NET API 把当前模型按对象提取为 `Scene(Mesh/Node)`,读取每个对象的可见颜色作为材质, 再调用本仓库的 C# 引擎转换为 **3D Tiles / GLB / glTF 分离**。 导出对话框已改为 WPF(`ExportDialog.xaml` / `ProgressDialog.xaml`),支持: - 三种输出格式切换 - 输出目录选择 - 3D Tiles 地理参考(经纬度/高程) - Draco 压缩开关与精度位 > 注意:Draco 与顶点量化二者只能选其一(Draco 已内置量化)。 ## 压缩选项 `ConvertOptions` 默认启用顶点量化 + Draco 压缩,可通过属性调整: ```csharp var opt = new ConvertOptions { Quantize = true, // 无 Draco 时:位置 USHORT、法线 BYTE 归一化 Draco = true, // 启用 KHR_draco_mesh_compression DracoPositionBits = 14, // 位置量化位(默认 14,BIM 通常足够) DracoNormalBits = 10, // 法线量化位(默认 10) DracoCompressionLevel = 3, // 0=不压缩, 1=快, 2=标准, 3=最优(默认) OutputFormat = (int)BimOutputFormat.Gltf, // Tiles3D / Gltf / GltfSeparate TileEdge = 50.0, // 3D Tiles 单瓦片目标边长(米) MaxDepth = 8, // 3D Tiles 八叉树最大深度 RootGeometricError = 512.0, // 3D Tiles 根瓦片 geometricError }; ``` > `Draco=true` 时会自动覆盖量化模式:Draco 解码后的 accessor 使用 `FLOAT32`,并声明 > `KHR_draco_mesh_compression` 扩展;`KHR_mesh_quantization` 不再声明。 > > Draco 编码通过 [Openize.Drako](https://www.nuget.org/packages/Openize.Drako) 完成, > 该库是 Google Draco 的纯 C# 移植,**不引入任何原生 DLL**。 ## 已知限制 / 后续扩展 - **输入格式**:已支持 **OBJ**(引擎直接解析)与 **FBX / glTF / GLB / DAE / STL / PLY / 3DS / IFC / BLEND** 等(经内置 SharpAssimp,世界变换烘焙进顶点)。如需其它格式,在 `FbxParser.Supported` 扩展名集合中追加即可,无需改动 writer。 - **LOD 抽稀算法**:当前使用基于空间网格的顶点合并,计算快但不保留尖锐特征;如需高质量 LOD,可替换为 QEM(二次误差度量)简化。 - **坐标轴约定**:地理参考假设模型局部坐标近似 ENU(X=东, Y=北, Z=上)。glTF 等为 Y-up,必要时旋转对齐。 - **3D Tiles 1.1 / glTF 直嵌**:当前用最兼容的 `b3dm`。可后续扩展为 1.1 直接内嵌 glTF + `EXT_mesh_features`。