import { Raycaster, Vector2, Sprite, Math as ThreeMath } from 'three'; import {render} from './Render.js'; import Constant from './Constant.js'; import {modelManager} from './ModelManager.js'; export default class Control{ constructor(scene,camera){ this.scene = scene; this.camera = camera; this.selectModel = null; this.arrowControls = null; this.onDownPosition = null; this.onUpPosition = null; this.dragging = false; this.raycaster = new Raycaster(); this.init(); } init(){ this.bindEvents(); } bindEvents(){ document.addEventListener('pointermove', this.onPointerMove.bind(this)); document.addEventListener('pointerdown', this.onPointerDown.bind(this)); document.addEventListener('pointerup', this.onPointerUp.bind(this)); } onPointerMove( event ) { let pointer = new Vector2(); pointer.x = ( event.clientX / window.innerWidth ) * 2 - 1; pointer.y = - ( event.clientY / window.innerHeight ) * 2 + 1; this.setSelectModel(pointer); } onPointerDown( event ) { this.onDownPosition = new Vector2(); this.onDownPosition.x = ( event.clientX / window.innerWidth ) * 2 - 1; this.onDownPosition.y = - ( event.clientY / window.innerHeight ) * 2 + 1; this.dragging = true; } onPointerUp( event ) { this.onUpPosition = new Vector2(); this.onUpPosition.x = ( event.clientX / window.innerWidth ) * 2 - 1; this.onUpPosition.y = - ( event.clientY / window.innerHeight ) * 2 + 1; this.handleClick(); this.dragging = false; } setSelectModel(pointer){ // 通过摄像机和鼠标位置更新射线 this.raycaster.setFromCamera( pointer, this.camera ); // 计算物体和射线的焦点 var intersects = this.raycaster.intersectObjects( this.scene.children ); if(intersects && intersects[0]) { for(let i=0;i 0 ) { /* intersects[ 0 ] { distance: double face: Face3 faceIndex: int object: Mesh point: Vector3 uv: Vector2 __proto__: Object } */ //intersects[ 0 ].object.material.color.setHex( Math.random() * 0xffffff ); var particle = new Sprite( particleMaterial ); //vector3不能直接用"等号"赋值。只能用copy进行复制。set方法需要分别传递x,y,z三个标量 particle.position.copy( intersects[ 0 ].point ); particle.scale.x = particle.scale.y = 16; scene.add( particle ); } // Parse all the faces for ( var i in intersects ) { //这句已经无效了,因为face下面不存在material,face下存在color,但是即使改变color也改变不了面的颜色 //intersects[ i ].face.material[ 0 ].color.setHex( Math.random() * 0xffffff | 0x80000000 ); intersects[ i ].object.material.color.setHex( Math.random() * Constant.defaultColor ); } } handleClick(){ if ( this.selectModel != null && this.onDownPosition.distanceTo( this.onUpPosition ) === 0 ) { this.arrowControls.attach( this.selectModel ); this.arrowControls.setMode('translate'); //this.arrowControls.setMode('rotate'); } else if(this.selectModel == null && this.onDownPosition.distanceTo( this.onUpPosition ) === 0){ this.arrowControls.detach( ); } this.onDownPosition = new Vector2(); this.onUpPosition = new Vector2(); } }