共计 3673 个字符,预计需要花费 10 分钟才能阅读完成。
背景与痛点
在工程设计和制造领域,SolidWorks 是广泛使用的三维建模软件。然而,传统分享模型的方式存在几个明显问题:

- 文件体积庞大:原生的.SLDPRT 或.SLDASM 文件动辄几十 MB,不利于网络传输
- 平台依赖性强:接收方必须安装 SolidWorks 或专业查看器才能打开
- 协作效率低:评审反馈需要来回发送文件版本,缺乏实时性
技术方案对比
常见的 3D 模型网页展示方案主要有以下几种格式:
- STL:仅包含表面网格数据,丢失颜色和材质信息,文件体积较大
- OBJ:支持材质但缺乏场景结构,解析复杂度高
- GLTF(推荐方案):
- 专为 Web 设计的二进制格式
- 支持网格、材质、动画等完整特性
- 体积比 STL 小 60-70%
- 直接被 Three.js 等主流库支持
核心实现步骤
1. 从 SolidWorks 导出 GLTF
通过 SolidWorks API 实现自动化导出:
// C# 示例 - 使用 SolidWorks Interop 库
var swApp = new SldWorks.SldWorks();
var doc = swApp.OpenDoc6("model.sldprt", (int)swDocumentTypes_e.swDocPART, 0, "", 0, 0);
// 激活 GLTF 导出插件
doc.Extension.SelectByID2("GLTF", "EXPORT", 0, 0, 0, false, 0, null, 0);
// 设置导出参数
var exportData = (ExportPdfData)doc.Extension.GetExportFileData((int)swExportDataFormat_e.swExportGLTF);
exportData.SetTextureOption(swExportTextureOption_e.swExportTextureEmbedded);
// 执行导出
doc.Extension.SaveAs("model.gltf", (int)swSaveAsVersion_e.swSaveAsCurrentVersion,
(int)swSaveAsOptions_e.swSaveAsOptions_Silent, ref exportData);
2. Three.js 网页渲染
基础渲染代码框架:
// 初始化场景
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth/innerHeight, 0.1, 1000);
const renderer = new THREE.WebGLRenderer({antialias: true});
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
// 添加光源
const light = new THREE.AmbientLight(0x404040);
scene.add(light);
const directionalLight = new THREE.DirectionalLight(0xffffff, 1);
directionalLight.position.set(1, 1, 1);
scene.add(directionalLight);
// 加载 GLTF 模型
const loader = new THREE.GLTFLoader();
loader.load(
'model.gltf',
(gltf) => {scene.add(gltf.scene);
camera.position.z = 5;
},
(xhr) => {console.log((xhr.loaded / xhr.total * 100) + '% loaded');
},
(error) => {console.error('加载错误:', error);
}
);
// 渲染循环
function animate() {requestAnimationFrame(animate);
renderer.render(scene, camera);
}
animate();
3. 模型轻量化技巧
- 在 SolidWorks 中简化特征树(抑制不必要的细节特征)
- 使用
Tools > Simplify功能自动优化 - 导出时选择适当的精度等级(通常 0.01mm 足够)
- 压缩纹理图片到合适分辨率(建议不超过 2048×2048)
性能优化
LOD 技术实现
// 创建不同细节层级的模型
const highDetailModel = await loadModel('high.gltf');
const mediumDetailModel = await loadModel('medium.gltf');
const lowDetailModel = await loadModel('low.gltf');
// 根据距离切换模型
function updateLOD() {const distance = camera.position.distanceTo(model.position);
if (distance > 20) scene.add(lowDetailModel);
else if (distance > 10) scene.add(mediumDetailModel);
else scene.add(highDetailModel);
}
WebWorker 多线程加载
// worker.js
self.onmessage = async (e) => {const loader = new THREE.GLTFLoader();
const gltf = await loader.loadAsync(e.data.url);
self.postMessage({model: gltf.scene}, [gltf.scene]);
};
// 主线程
const worker = new Worker('worker.js');
worker.postMessage({url: 'large_model.gltf'});
worker.onmessage = (e) => {scene.add(e.data.model);
};
避坑指南
浏览器兼容性问题
- iOS Safari:需要启用
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"> - 旧版 Edge:需添加
renderer.shadowMap.enabled = false; - Firefox:大模型加载可能触发内存限制,需分块加载
材质丢失解决方案
// 确保纹理路径正确
loader.setPath('textures/');
// 手动替换材质
gltf.scene.traverse((child) => {if (child.isMesh) {
child.material = new THREE.MeshStandardMaterial({
color: 0x888888,
roughness: 0.5
});
}
});
进阶交互实现
添加控制器
const controls = new THREE.OrbitControls(camera, renderer.domElement);
controls.enableDamping = true;
controls.dampingFactor = 0.05;
function animate() {requestAnimationFrame(animate);
controls.update(); // 仅当控制器启用时需要
renderer.render(scene, camera);
}
简单动画示例
// 旋转动画
gltf.scene.traverse((child) => {if (child.isMesh) {child.userData.originalRotation = child.rotation.clone();
}
});
function animate() {gltf.scene.traverse((child) => {if (child.isMesh) {child.rotation.y = child.userData.originalRotation.y + Date.now() * 0.001;
}
});
// ... 其他动画逻辑
}
性能对比数据
| 模型名称 | 原始大小(SLDPRT) | GLTF 大小 | 加载时间(3G 网络) |
|---|---|---|---|
| 简单零件 | 4.2MB | 1.1MB (74%↓) | 1.3s |
| 中型装配体 | 28MB | 6.7MB (76%↓) | 4.8s |
| 复杂模具 | 156MB | 32MB (79%↓) | 12.4s |
开放性思考
- 如何实现模型的剖面查看功能(类似 SolidWorks 的 Section View)?
- 当模型包含数百个零件时,有哪些策略可以实现快速的选择 / 高亮交互?
通过这套方案,我们成功将工程模型的分享效率提升了 3 - 5 倍,评审周期缩短 50% 以上。最关键的是让非技术用户也能通过浏览器直接查看 3D 模型,极大降低了协作门槛。
正文完
发表至: 技术分享
近一天内
