本文基于开源项目 MF-TurbineMonitor(作者 fengtianxi001)的拆解。完整代码与在线体验:GitHub | 在线演示
MF-TurbineMonitor 是一个风力发电机数据大屏案例,采用 Vue3 + TS + Vite + Three.js + ECharts + TWEEN + mockjs + autofit.js 技术栈,无后端、数据全部为 mock。它把 3D 设备、实时数据面板和拆解动画整合到同一个大屏里,且代码可维护、可复用、性能可控。本文适合正在做或即将做 3D 可视化大屏的前端开发,以及想了解 Three.js 在工业场景下如何落地的读者。
一、整体架构:三个 hooks 分层解耦
项目把 Three.js 场景、设备业务与图表封装拆成三个 hooks,用 provide/inject 串事件:
useThree.ts—— Three.js 场景、渲染器、模型加载与渲染循环useTurbine.ts—— 风机设备的业务逻辑(交互、动画、状态管理)useEcharts.ts—— ECharts 图表的按需引入与数据驱动
改造成其他设备时只需改动 useTurbine,useThree 不用碰。这种分层思路是整个项目最值得借鉴的地方,而不是某个炫酷效果本身。
二、3D 场景的渲染器配置
渲染器需要开启 alpha 与 localClippingEnabled,这是后续削切动画的前提条件。很多做"切开外壳"效果失败的案例,往往就是漏掉了这一行配置。
模型方面,项目使用 3 个 Draco 压缩的 GLB 文件:
equipment(9 个零件)skeleton(拆出颜色/线框两个外壳)plane(地面)
通过 getObjectByName 按建模命名取对象,避免硬编码对象引用。渲染循环使用 renderMixins Map 挂载自定义函数,实现可插拔的渲染扩展。
三、交互实现:双层高亮与状态机收敛
交互上分为点击与悬浮两种场景,技术路线不同但对外暴露统一接口:
点击交互:通过 Raycaster 拾取目标对象,再用 OutlinePass 描边高亮。
悬浮交互:使用自定义 hexPass 修改 material.emissive 实现自发光效果。
两种技术路线对外统一为 selectedObjects 接口。作者认为,把状态切换收敛为 selectedObjects 的 setter(即状态机)是组件化交互最优雅的写法——调用方无需关心内部实现,只需设置选中对象即可。
四、动画编排:TWEEN chain 串序列
平面削切动画:给 THREE.Plane 挂载 clippingPlanes,通过 TWEEN 动画化 constant 实现"切开外壳"的效果。
拆解动画:零件坐标集中配置,从 COMPOSE 状态插值到 DECOMPOSE 状态,使用 TWEEN 的 chain() 方法串联序列,而不是用 setTimeout。这样做可控、可取消,便于在组件卸载时清理动画。
五、3D 标签:Vue 组件渲染为 3D 对象
3D 标签通过 loadCSS2DByVue 把 Vue 组件渲染成 DOM,再包装成 CSS2DObject 挂载到场景中。这样可以复用 Vue 模板、样式与事件处理,避免在 Three.js 里手写 DOM 操作。
六、数据与图表
- 动态数据用 mockjs 生成,静态统计硬编码
- ECharts 按需引入并封装
useEcharts,7 个面板不重复造轮子 - 详情面板用
computed(() => CONFIG[props.name])实现数据驱动切换
七、性能与部署
- 使用 autofit.js 做 1920×1080 等比缩放
- 字体分包、imagemin 压缩、manualChunks 依赖分包,全指向首屏速度
- 产物输出到
docs/目录,通过base:'./'配置实现 GitHub Pages 零成本托管
八、三个关键的工程细节
- 动画用 chain 不用 setTimeout:可控、可取消,避免动画堆积与内存泄漏
- 组件卸载时调用
geometry/material.dispose():不释放 GPU 内存会越跑越卡 selectedObjectssetter 即状态机:调用方不用管内部实现,降低组件间耦合
九、验证与二次开发
如果你想基于这个项目做二次开发,建议按以下顺序验证:
- 先跑通 GitHub Pages 在线体验,确认整体视觉效果与交互流畅度
- 本地克隆项目,确认开发环境(Vue3 + TS + Vite + Three.js)能正常构建
- 按
useThree→useTurbine→useEcharts的顺序阅读源码,理解分层边界 - 尝试把
useTurbine替换为其他设备的业务逻辑,验证架构的可复用性 - 在生产构建前检查
manualChunks配置,确保依赖分包策略合理
注意事项:
- 项目数据全部为 mock,接入真实数据时需要自行替换 mockjs 部分
- 模型文件使用 Draco 压缩,需确保 Three.js 的 DRACOLoader 配置正确
- GitHub Pages 托管受限于仓库公开性,生产环境部署需额外配置