Skip to content

Commit f04a1b3

Browse files
committed
feat: addHexEffect
1 parent 343dee9 commit f04a1b3

File tree

3 files changed

+91
-13
lines changed

3 files changed

+91
-13
lines changed

.stylelintcache

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
[{"/Users/fengtianxi001/codes/可视化大屏/MF-StationMonitor/src/App.vue":"1","/Users/fengtianxi001/codes/可视化大屏/MF-StationMonitor/src/components/WidgetLabel.vue":"2","/Users/fengtianxi001/codes/可视化大屏/MF-StationMonitor/src/components/LayoutHeader.vue":"3","/Users/fengtianxi001/codes/可视化大屏/MF-StationMonitor/src/components/WidgetPanel06.vue":"4","/Users/fengtianxi001/codes/可视化大屏/MF-StationMonitor/src/components/LayoutPanel.vue":"5","/Users/fengtianxi001/codes/可视化大屏/MF-StationMonitor/src/components/WidgetPanel05.vue":"6","/Users/fengtianxi001/codes/可视化大屏/MF-StationMonitor/src/components/WidgetPanel04.vue":"7","/Users/fengtianxi001/codes/可视化大屏/MF-StationMonitor/src/components/WidgetPanel02.vue":"8","/Users/fengtianxi001/codes/可视化大屏/MF-StationMonitor/src/components/WidgetPanel03.vue":"9","/Users/fengtianxi001/codes/可视化大屏/MF-StationMonitor/src/components/WidgetPanel01.vue":"10","/Users/fengtianxi001/codes/可视化大屏/MF-StationMonitor/src/components/LayoutFooter.vue":"11","/Users/fengtianxi001/codes/可视化大屏/MF-StationMonitor/src/components/WidgetPanel07.vue":"12","/Users/fengtianxi001/codes/可视化大屏/MF-StationMonitor/src/components/LayoutLoading.vue":"13","/Users/fengtianxi001/codes/可视化大屏/MF-TurbineMonitor/src/App.vue":"14","/Users/fengtianxi001/codes/可视化大屏/MF-TurbineMonitor/src/components/WidgetLabel.vue":"15"},{"size":3071,"mtime":1735743524635,"hashOfConfig":"16"},{"size":680,"mtime":1735734674844,"hashOfConfig":"16"},{"size":3750,"mtime":1735729897407,"hashOfConfig":"16"},{"size":2401,"mtime":1735731205820,"hashOfConfig":"16"},{"size":1092,"mtime":1735730754036,"hashOfConfig":"16"},{"size":2560,"mtime":1735730128887,"hashOfConfig":"16"},{"size":3610,"mtime":1735729998372,"hashOfConfig":"16"},{"size":2955,"mtime":1735733027480,"hashOfConfig":"16"},{"size":1693,"mtime":1735546823347,"hashOfConfig":"16"},{"size":2269,"mtime":1735546828184,"hashOfConfig":"16"},{"size":2514,"mtime":1735735322942,"hashOfConfig":"16"},{"size":10288,"mtime":1735734611427,"hashOfConfig":"16"},{"size":1055,"mtime":1735743601821,"hashOfConfig":"16"},{"size":3071,"mtime":1735744747227,"hashOfConfig":"17"},{"size":680,"mtime":1735744747259,"hashOfConfig":"17"},"11i7hqk","pjw8ln"]
1+
[{"/Users/fengtianxi001/Desktop/代码仓库/可视化大屏/MF-TurbineMonitor/src/components/WidgetLabel.vue":"1"},{"size":680,"mtime":1736220176227,"hashOfConfig":"2"},"u1u13e"]

src/hooks/useThree.ts

+79-11
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import {
2-
onMounted,
32
ref,
43
shallowRef,
54
nextTick,
@@ -8,7 +7,6 @@ import {
87
createVNode,
98
render,
109
h,
11-
type DefineComponent,
1210
} from 'vue'
1311
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js'
1412
import { TransformControls } from 'three/examples/jsm/controls/TransformControls.js'
@@ -21,10 +19,8 @@ import { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader.js'
2119
import { isFunction } from 'lodash'
2220
import { EffectComposer } from 'three/addons/postprocessing/EffectComposer.js'
2321
import { RenderPass } from 'three/addons/postprocessing/RenderPass.js'
24-
import { ShaderPass } from 'three/addons/postprocessing/ShaderPass.js'
2522
import { OutlinePass } from 'three/addons/postprocessing/OutlinePass.js'
2623
import { OutputPass } from 'three/addons/postprocessing/OutputPass.js'
27-
import { FXAAShader } from 'three/addons/shaders/FXAAShader.js'
2824
// import TWEEN from '@tweenjs/tween.js'
2925
import TWEEN from 'three/examples/jsm/libs/tween.module.js'
3026
import * as THREE from 'three'
@@ -45,6 +41,7 @@ export function useThree() {
4541
const ocontrol = shallowRef<OrbitControls>() //轨道控制器
4642
const tcontrol = shallowRef<TransformControls>() //变换控制器
4743
const outlinePass = shallowRef<OutlinePass>() //outlinePass
44+
const hexPass = shallowRef()
4845
const composers = new Map() //后期处理
4946
const mixers: any = [] //动画混合器
5047
const clock = new THREE.Clock() //时钟
@@ -61,6 +58,8 @@ export function useThree() {
6158
boostrapLights()
6259
onAnimate()
6360
onWindowResize()
61+
addOutlineEffect()
62+
addHexEffect()
6463
}
6564
//Scene
6665
const boostrapScene = () => {
@@ -202,7 +201,7 @@ export function useThree() {
202201
render(instance, document.createElement('div'))
203202
return instance.el
204203
}
205-
const element = crender(component, props)
204+
const element = crender(component, props) as HTMLElement
206205
const css2dObject = new CSS2DObject(element)
207206
return css2dObject
208207
}
@@ -268,7 +267,15 @@ export function useThree() {
268267
})
269268
}
270269
//添加outline效果
271-
const addOutlineEffect = () => {
270+
const addOutlineEffect = (config?: {
271+
edgeStrength?: number
272+
edgeGlow?: number
273+
edgeThickness?: number
274+
pulsePeriod?: number
275+
usePatternTexture?: boolean
276+
visibleEdgeColor?: string | number
277+
hiddenEdgeColor?: string | number
278+
}) => {
272279
const composer = new EffectComposer(renderer.value!)
273280
const renderPass = new RenderPass(scene.value!, camera.value!)
274281
composer.addPass(renderPass)
@@ -277,17 +284,49 @@ export function useThree() {
277284
scene.value!,
278285
camera.value!
279286
)
280-
outlinePass.value.edgeStrength = 3
281-
outlinePass.value.edgeGlow = 1
282-
outlinePass.value.edgeThickness = 4
283-
outlinePass.value.visibleEdgeColor.set('#0efaa6')
284-
outlinePass.value.hiddenEdgeColor.set('#0efaa6')
287+
const deafultConfig = {
288+
edgeStrength: 3,
289+
edgeGlow: 0,
290+
edgeThickness: 1,
291+
pulsePeriod: 0,
292+
usePatternTexture: false,
293+
visibleEdgeColor: '#fff',
294+
hiddenEdgeColor: '#fff',
295+
}
296+
const op = Object.assign({}, deafultConfig, config)
297+
298+
outlinePass.value.edgeStrength = op.edgeStrength
299+
outlinePass.value.edgeGlow = op.edgeGlow
300+
outlinePass.value.edgeThickness = op.edgeThickness
301+
outlinePass.value.visibleEdgeColor.set(op.visibleEdgeColor)
302+
outlinePass.value.hiddenEdgeColor.set(op.hiddenEdgeColor)
285303
outlinePass.value.selectedObjects = []
286304
composer.addPass(outlinePass.value)
287305
const outputPass = new OutputPass()
288306
composer.addPass(outputPass)
289307
composers.set('outline', composer)
290308
}
309+
//添加outline效果
310+
const addHexEffect = (color?: number | string) => {
311+
let selected: any[] = []
312+
hexPass.value = {
313+
get selectedObjects() {
314+
return selected
315+
},
316+
set selectedObjects(val) {
317+
//先清空之前的
318+
selected.forEach((mesh) => {
319+
if (mesh.material) mesh.material.emissive.setHex(mesh.hex)
320+
})
321+
val.forEach((mesh) => {
322+
mesh.material = mesh.material.clone()
323+
mesh.hex = mesh.material.emissive.getHex()
324+
mesh.material.emissive.setHex(color ?? 0x888888)
325+
})
326+
selected = [...val]
327+
},
328+
}
329+
}
291330

292331
// 模型拾取
293332
const addModelPick = (
@@ -315,6 +354,32 @@ export function useThree() {
315354
onUnmounted(() => document.removeEventListener('click', handler))
316355
}
317356

357+
// 模型悬浮拾取
358+
const addModelHoverPick = (
359+
object: THREE.Object3D,
360+
callback: (
361+
intersects:
362+
| THREE.Intersection<THREE.Object3D<THREE.Object3DEventMap>>[]
363+
| []
364+
) => void
365+
) => {
366+
const handler = (event: MouseEvent) => {
367+
const el = container.value as HTMLElement
368+
const rect = el.getBoundingClientRect()
369+
const mouse = new THREE.Vector2(
370+
((event.clientX - rect.left) / rect.width) * 2 - 1,
371+
-((event.clientY - rect.top) / rect.height) * 2 + 1
372+
)
373+
const raycaster = new THREE.Raycaster()
374+
raycaster.setFromCamera(mouse, camera.value!)
375+
const intersects = raycaster.intersectObject(object, true)
376+
isFunction(callback) && callback(intersects)
377+
// if (intersects.length <= 0) return void 0
378+
}
379+
document.addEventListener('mousemove', handler)
380+
onUnmounted(() => document.removeEventListener('mousemove', handler))
381+
}
382+
318383
nextTick(() => {
319384
boostrap()
320385
})
@@ -331,6 +396,7 @@ export function useThree() {
331396
renderMixins,
332397
composers,
333398
outlinePass,
399+
hexPass,
334400
loadGltf,
335401
loadAnimationMixer,
336402
loadAxesHelper,
@@ -339,7 +405,9 @@ export function useThree() {
339405
transitionAnimation,
340406
planeClippingAnimation,
341407
addModelPick,
408+
addModelHoverPick,
342409
addOutlineEffect,
410+
addHexEffect,
343411
}
344412
}
345413

src/hooks/useTurbine.ts

+11-1
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,12 @@ export function useTurbine() {
6868
camera,
6969
ocontrol,
7070
outlinePass,
71+
hexPass,
7172
loadGltf,
7273
loadAnimationMixer,
7374
loadCSS2DByVue,
7475
addModelPick,
76+
addModelHoverPick,
7577
addOutlineEffect,
7678
transitionAnimation,
7779
planeClippingAnimation,
@@ -104,7 +106,7 @@ export function useTurbine() {
104106
await loadModels() // 加载风机模型
105107
loadLights() // 加载灯光
106108
await openingAnimation() // 开场动画
107-
addOutlineEffect()
109+
108110
addModelPick(models.equipment, (intersects) => {
109111
if (intersects.length > 0) {
110112
const obj = intersects[0]['object']
@@ -115,6 +117,14 @@ export function useTurbine() {
115117
outlinePass.value!.selectedObjects = []
116118
}
117119
})
120+
addModelHoverPick(models.equipment, (intersects) => {
121+
if (intersects.length > 0) {
122+
const obj = intersects[0]['object']
123+
hexPass.value!.selectedObjects = [obj]
124+
} else {
125+
hexPass.value!.selectedObjects = []
126+
}
127+
})
118128
}
119129
//加载机架和设备模型
120130
const loadModels = async () => {

0 commit comments

Comments
 (0)