监听鼠标挪动,几何体变大变小
监听鼠标点击,弹出信息
应用办法:Raycaster
import * as THREE from 'three'import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'import Stats from 'three/examples/jsm/libs/stats.module'let container, statslet camera, scene, raycaster, rendererlet INTERSECTEDconst pointer = new THREE.Vector2()let clickPosX = 0, clickPosY = 0function onPointerMove(event) { pointer.x = (event.clientX / window.innerWidth) * 2 - 1 pointer.y = -(event.clientY / window.innerHeight) * 2 + 1 if (INTERSECTED) { INTERSECTED.scale.set(3, 3, 3) } render()}function onPointerClick(event) { pointer.x = (event.clientX / window.innerWidth) * 2 - 1 pointer.y = -(event.clientY / window.innerHeight) * 2 + 1 if (INTERSECTED) { alert('点击了' + INTERSECTED.name) } render()}function calcMousePosition(event, x, y) { // 决定信息弹窗的定位 var event = event || window.event if (event.pageX || event.pageY) { x = event.pageX y = event.pageY } else if (event.clientX || event.clientY) { x = event.clientX + document.documentElement.scrollLeft + document.body.scrollLeft y = event.clientY + document.documentElement.scrollTop + document.body.scrollTop } return { x: x, y: y }}function createDom() { const geometry = new THREE.BoxBufferGeometry(10, 10, 10) const material = new THREE.MeshBasicMaterial({ color: 0x00fa9a }) const mesh = new THREE.Mesh(geometry, material) mesh.name = '几何体1' scene.add(mesh) mesh.position.set(0, -5, 0) const geometry1 = new THREE.BoxBufferGeometry(10, 10, 10) const mesh1 = new THREE.Mesh(geometry1, material) mesh1.name = '几何体2' scene.add(mesh1) mesh1.position.set(0, 20, 0) const ambient = new THREE.AmbientLight(0xffffff, 1) scene.add(ambient) // var axesHelper = new THREE.AxesHelper(250) // scene.add(axesHelper)}function init() { scene = new THREE.Scene() scene.background = new THREE.Color(0xffffff) camera = new THREE.PerspectiveCamera( 35, window.innerWidth / window.innerHeight, 0.1, 1000 ) camera.position.set(18, 20, 100) renderer = new THREE.WebGLRenderer() renderer.setPixelRatio(window.devicePixelRatio) renderer.setSize(window.innerWidth, window.innerHeight) document.body.appendChild(renderer.domElement) controls = new OrbitControls(camera, renderer.domElement) controls.addEventListener('change', render) window.addEventListener('resize', onWindowResize) document.addEventListener('mousemove', onPointerMove) document.addEventListener('click', onPointerClick) stats = new Stats() document.body.appendChild(stats.dom) raycaster = new THREE.Raycaster() createDom()}function onWindowResize() { camera.aspect = window.innerWidth / window.innerHeight camera.updateProjectionMatrix() renderer.setSize(window.innerWidth, window.innerHeight)}function render() { stats.update() camera.updateMatrixWorld() raycaster.setFromCamera(pointer, camera) const intersects = raycaster.intersectObjects(scene.children, false) if (intersects.length > 0) { if (INTERSECTED != intersects[0].object) { if (INTERSECTED) { INTERSECTED.scale.set(1, 1, 1) INTERSECTED = null } INTERSECTED = intersects[0].object } } else { if (INTERSECTED) { INTERSECTED.scale.set(1, 1, 1) INTERSECTED = null } } renderer.render(scene, camera)}init()render()