面向本程序(网页 3D 查看 + 每部件独立着色)的建模与导出规范。 演示程序:
3d/(FastAPI 服务端 + Ant Design Vue 客户端), 运行python3 3d/backend/run.py,模型放3d/models/*.glb。详见3d/README.md。
网页"给某个部件上色"= 该部件在模型里是一个独立的、可识别的对象。
一句话:"一个零件 = 一个独立体 + 一个有意义的名字",导出后即可选可着色。
| 项目 | 要求 | 原因 |
|---|---|---|
| 零件结构 | 一个实体对应一个部件,不要布尔合并后导出 | 每部件才能独立选/着色 |
| 零件命名 | 有意义、稳定、推荐英文/数字 + 下划线(如 piston_01、crank_02);避免空格和特殊字符 |
名字会变成网页部件名;避免部分工具链/编码坑 |
| 隐藏/基准 | 基准面、草图、坐标系、辅助线、被抑制/隐藏的零件不要导出 | 防止出现多余对象 |
| 精度(三角面) | 圆柱/圆弧分段适中;螺纹、微小倒角、装饰纹如果让网格暴涨就简化或抑制 | 面数决定 glb 体积和浏览器流畅度 |
| 参考量级 | 单个部件几千~几万面即可;整机几十万~几百万面网页没问题(当前演示发动机 glb≈1.8MB/115 部件) | — |
| 单位 | 统一用 mm | 减少混乱(网页端会自动适配大小,单位不影响显示) |
| 朝向 | CAD 一般是 Z 轴朝上,glTF/three.js 是 Y 轴朝上,导出时绕 X 轴旋转 -90° 或由脚本处理 | 否则模型"躺着",底部网格方向不对 |
| 材质/颜色 | 不用管 CAD 外观颜色;需要默认底色时在导出脚本里给每个部件指定一个 albedo 色即可 | 网页按状态实时上色 |
| 对称/阵列/镜像 | 可导出为多个独立零件(程序会自动显示为 名称 [2]、[3]) |
每个实例可独立着色 |
| 部件数量 | 数百个部件体验良好(当前演示 115 个);上千时需优化遍历/列表 | — |
.step)
文件 → 另存为 → STL(勾选"保存为装配体结构/各实体分开"相关选项),但 STL 是单色无结构,一般不如走 STEP 路线。freecadcmd 无界面批量跑)。文件 → 导出,看格式列表里有没有 glTF/glb;若你的版本有,选"整个文档"导出即可,其它步骤全免。MeshPart.meshFromShape 的 LinearDeflection(线性偏差) 参数,毫米单位建议 0.05~0.2mm,越小越精细、文件越大;大平面用角度参数控制。目标产物:
xxx.glb(每部件一个 node + 独立材质,node 名=CAD 部件名),放3d/models/即完成接入。
管线 A(推荐,免费可脚本化)
SolidWorks/FreeCAD 装配体
│ 导出
▼
STEP (.step,含装配结构+名称)
│ freecadcmd 脚本 或 CadQuery (Python)
▼
逐实体转网格(精度参数控制) → 按部件名收集
│ trimesh / pygltflib 打包
▼
xxx.glb (每部件 = 1 节点 + 1 独立材质,白/默认色)
管线 B(有 Blender 时) FreeCAD 导出 STEP → Blender 导入(实体) → 需重建部件命名 → 导出 glb。适合手工调整,自动化不如 A。
管线 C(预算充足,最省心) CAD Exchanger SDK / Datakit CrossManager:一条命令 STEP→GLB,保留部件名,支持命令行/API 集成。
打开网页(python3 3d/backend/run.py,默认 http://127.0.0.1:5182)后逐项确认: