From 6e0e447fa37638d6c44081639b2b2726d92533aa Mon Sep 17 00:00:00 2001 From: cao_yi_min <957095781@qq.com> Date: Mon, 27 Apr 2026 11:08:55 +0800 Subject: [PATCH] =?UTF-8?q?=E6=89=93=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/ThreeViewer.vue | 68 +-- src/components/ThreeViewerDebug copy.vue | 610 +++++++++++++++++++++ src/components/ThreeViewerDebug.vue | 659 +++++++++++++---------- src/data/data.json | 21 + src/views/ModelDetail.vue | 20 +- src/views/ModelList.vue | 8 +- 6 files changed, 1062 insertions(+), 324 deletions(-) create mode 100644 src/components/ThreeViewerDebug copy.vue diff --git a/src/components/ThreeViewer.vue b/src/components/ThreeViewer.vue index a7884c5..e811130 100644 --- a/src/components/ThreeViewer.vue +++ b/src/components/ThreeViewer.vue @@ -2,6 +2,27 @@
+ +
+

调试模式

+
+

点击模型查看部件信息

+
+

部件名称: {{ selectedMeshInfo.name || '未命名' }}

+

坐标:

+
{{ JSON.stringify(selectedMeshInfo.position, null, 2) }}
+ +
+
+
+

模型部件列表:

+
    +
  • + {{ mesh.name || `未命名_${index}` }} +
  • +
+
+
@@ -79,17 +100,17 @@ export default { pmremGenerator: null, labelRenderer: null, annotationObjects: [], - selectedPart: null + selectedPart: null, }; }, mounted () { // this.onWindowResize(); // 初始化后立即调用一次 // 添加窗口大小变化监听 // window.addEventListener('resize', this.onWindowResize); - this.resizeObserver = new ResizeObserver(this.onWindowResize); + this.resizeObserver = new ResizeObserver(this.onWindowResize); this.resizeObserver.observe(this.$refs.container); - // window.addEventListener('click', this.onMouseClick, false); + window.addEventListener('click', this.onMouseClick, false); this.highlightColor = new THREE.Color(0xff0000); // 高亮颜色为红色 }, beforeDestroy() { @@ -277,10 +298,10 @@ export default { this.camera.updateProjectionMatrix(); // 创建一个父对象用于旋转 - this.parent = new THREE.Object3D(); // 创建一个新的 Object3D 作为父对象 - this.parent.add(this.model); // 将模型添加到父对象 + // this.parent = new THREE.Object3D(); // 创建一个新的 Object3D 作为父对象 + // this.parent.add(this.model); // 将模型添加到父对象 - this.scene.add(this.parent); // 将父对象添加到场景 + this.scene.add(this.model); // 将父对象添加到场景 // 让控制器聚焦到模型中心 聚焦中心 this.controls.target.copy(center); @@ -347,40 +368,7 @@ export default { // 点击射线 onMouseClick(event) { console.log('我点击了') - // const raycaster = new THREE.Raycaster(); - // const mouse = new THREE.Vector2(); - // // 计算鼠标在屏幕上的位置并转换为Normalized device coordinates (NDC) - // console.log(this.sceneDomElement.clientWidth, window.innerWidth) - // mouse.x = (event.clientX / window.innerWidth) * 2 - 1; - // mouse.y = -(event.clientY / window.innerHeight) * 2 + 1; - - // // 更新Raycaster的射线位置和方向 - // raycaster.setFromCamera(mouse, this.camera); - if(!this.sceneDomElement) return - let getBoundingClientRect = this.sceneDomElement.getBoundingClientRect() - // 屏幕坐标转标准设备坐标 - let x = ((event.clientX - getBoundingClientRect .left) / this.sceneDomElement.offsetWidth) * 2 - 1;// 标准设备横坐标 - let y = -((event.clientY - getBoundingClientRect .top) / this.sceneDomElement.offsetHeight) * 2 + 1;// 标准设备纵坐标 - let standardVector = new THREE.Vector3(x, y, 1);// 标准设备坐标 - // 标准设备坐标转世界坐标 - let worldVector = standardVector.unproject(this.camera); - // 射线投射方向单位向量(worldVector坐标减相机位置坐标) - let ray = worldVector.sub(this.camera.position).normalize(); - // 创建射线投射器对象 - let rayCaster = new THREE.Raycaster(this.camera.position, ray); - - // 计算物体和射线的交点 - const intersects = rayCaster.intersectObjects(this.model.children, true); - if (intersects.length !== 0 && intersects[0].object instanceof THREE.Mesh) { - // this.controls.target.copy(intersects[0].point); - let selectedObject = intersects[0].object; - let selectedObjects = []; - selectedObjects.push(selectedObject.parent); - this.outlineObj(selectedObjects); - } else { - console.log('没找到', this.composer) - this.composer = null - } + }, outlineObj(selectedObjects) { let outlinePass; diff --git a/src/components/ThreeViewerDebug copy.vue b/src/components/ThreeViewerDebug copy.vue new file mode 100644 index 0000000..93c2e01 --- /dev/null +++ b/src/components/ThreeViewerDebug copy.vue @@ -0,0 +1,610 @@ + + + + + diff --git a/src/components/ThreeViewerDebug.vue b/src/components/ThreeViewerDebug.vue index a1fb9fa..b170581 100644 --- a/src/components/ThreeViewerDebug.vue +++ b/src/components/ThreeViewerDebug.vue @@ -29,20 +29,23 @@ diff --git a/src/data/data.json b/src/data/data.json index cb56ae9..b291e2f 100644 --- a/src/data/data.json +++ b/src/data/data.json @@ -145,6 +145,13 @@ "content": [ "护套与芯棒之间以及伞裙与护套之间的界面应是永久性粘接", "粘接部分应牢固密实,没有气泡和缝隙,防止污秽物和水汽进入" + ], + "position": [ + { + "x": 0, + "y": 0.245, + "z": 0.015 + } ] }, { @@ -152,12 +159,26 @@ "content": [ "采用锡青铜、黄铜、奥氏体不锈钢或其他耐锈蚀性材料制作,不采用有防腐蚀表层而本身不耐锈蚀的材料,与绝缘子成套供应", "销腿末端弯曲部分尺寸严格满足标准规定,末端分开到 180° 再扳回原位无裂纹" + ], + "position": [ + { + "x": 0.019, + "y": -0.055, + "z": 0.019 + } ] }, { "name": "铭牌", "content": [ "标记制造厂名或商标、制造日期、额定电压、额定机械负荷、结构高度和产品编号" + ], + "position": [ + { + "x": 0.019, + "y": -0.055, + "z": 0.019 + } ] } ] diff --git a/src/views/ModelDetail.vue b/src/views/ModelDetail.vue index 5902202..b7a016a 100644 --- a/src/views/ModelDetail.vue +++ b/src/views/ModelDetail.vue @@ -17,21 +17,21 @@