本文围绕Vue+Three.js实现PCB电路板3D交互:元器件点击高亮、部件显隐、模型自动旋转实战解析展开,先梳理核心概念,再结合实践场景说明步骤、代码思路和容易忽略的细节,方便后续直接参考。
实现效果:

演示动态图效果如下:
核心功能原理讲解:
1. Raycaster 射线拾取实现元器件点击高亮:
核心流程:
[-1,1]。Raycaster从相机位置发射射线,与场景内模型做碰撞检测。2. 材质缓存机制,解决高亮无法复原:
新手最容易踩的坑:直接修改 Mesh 原始材质。
Three.js 中多个 Mesh 可以共用同一份材质对象,直接修改原始材质,会导致所有共用材质的物体同步变色,并且退出高亮后无法恢复。标准解决方案:
3. Tween 镜头缓动 + OrbitControls 自动旋转:
直接开关controls.autoRotate交互生硬,体验较差。
优化方案:
完整代码
1. template 结构:
复制代码<template> <div class="container"> <div class="btn-group"> <div class="btn" :class="{'btn-active': type=='0'}" @click="showVoid">显示主板div> <div class="btn" :class="{'btn-active': type=='1'}" @click="hideVoid">隐藏主板div> <div class="btn" v-show="!isAutoRotate" @click="startRotate">自动旋转div> <div class="btn" v-show="isAutoRotate" @click="stopRotate">停止旋转div> div> <div class="three" id="three" ref="content">div> div> template> 2. script 代码:
复制代码 3. css样式代码:
复制代码* { margin: 0; padding: 0; }.container { width: 100%; height: 100%; position: relative; }.three { width: 100%; height: 100%; position: relative; z-index: 1; }.btn-group { position: absolute; right: 0; top: 15px; z-index: 2; display: flex; justify-content: start; align-items: center; }.btn { width: 80px; height: 32px; line-height: 32px; text-align: center; border: 1px solid #dcdfe6; border-radius: 3px; margin-right: 15px; margin-left: 0; cursor: pointer; font-size: 12px; color: #606266; }.btn-active { background-color: #409eff; color: #FFF; } 模型说明: 本文演示所用的 3D 模型来源于网络,版权归原作者所有。本文仅做 Three.js 前端技术学习演示,并未对模型本身做任何修改。
实际使用时,建议结合项目规模、依赖环境和团队习惯做取舍;先保证流程清晰和结果可验证,再逐步优化细节。