111 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			111 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| import { Object3D, Sphere, Box3 } from 'three';
 | |
| import { XRHandMeshModel } from './XRHandMeshModel.js';
 | |
| 
 | |
| const TOUCH_RADIUS = 0.01;
 | |
| const POINTING_JOINT = 'index-finger-tip';
 | |
| 
 | |
| class OculusHandModel extends Object3D {
 | |
| 
 | |
| 	constructor( controller, loader = null, onLoad = null ) {
 | |
| 
 | |
| 		super();
 | |
| 
 | |
| 		this.controller = controller;
 | |
| 		this.motionController = null;
 | |
| 		this.envMap = null;
 | |
| 		this.loader = loader;
 | |
| 		this.onLoad = onLoad;
 | |
| 
 | |
| 		this.mesh = null;
 | |
| 
 | |
| 		controller.addEventListener( 'connected', ( event ) => {
 | |
| 
 | |
| 			const xrInputSource = event.data;
 | |
| 
 | |
| 			if ( xrInputSource.hand && ! this.motionController ) {
 | |
| 
 | |
| 				this.xrInputSource = xrInputSource;
 | |
| 
 | |
| 				this.motionController = new XRHandMeshModel( this, controller, this.path, xrInputSource.handedness, this.loader, this.onLoad );
 | |
| 
 | |
| 			}
 | |
| 
 | |
| 		} );
 | |
| 
 | |
| 		controller.addEventListener( 'disconnected', () => {
 | |
| 
 | |
| 			this.clear();
 | |
| 			this.motionController = null;
 | |
| 
 | |
| 		} );
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 	updateMatrixWorld( force ) {
 | |
| 
 | |
| 		super.updateMatrixWorld( force );
 | |
| 
 | |
| 		if ( this.motionController ) {
 | |
| 
 | |
| 			this.motionController.updateMesh();
 | |
| 
 | |
| 		}
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 	getPointerPosition() {
 | |
| 
 | |
| 		const indexFingerTip = this.controller.joints[ POINTING_JOINT ];
 | |
| 		if ( indexFingerTip ) {
 | |
| 
 | |
| 			return indexFingerTip.position;
 | |
| 
 | |
| 		} else {
 | |
| 
 | |
| 			return null;
 | |
| 
 | |
| 		}
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 	intersectBoxObject( boxObject ) {
 | |
| 
 | |
| 		const pointerPosition = this.getPointerPosition();
 | |
| 		if ( pointerPosition ) {
 | |
| 
 | |
| 			const indexSphere = new Sphere( pointerPosition, TOUCH_RADIUS );
 | |
| 			const box = new Box3().setFromObject( boxObject );
 | |
| 			return indexSphere.intersectsBox( box );
 | |
| 
 | |
| 		} else {
 | |
| 
 | |
| 			return false;
 | |
| 
 | |
| 		}
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 	checkButton( button ) {
 | |
| 
 | |
| 		if ( this.intersectBoxObject( button ) ) {
 | |
| 
 | |
| 			button.onPress();
 | |
| 
 | |
| 		} else {
 | |
| 
 | |
| 			button.onClear();
 | |
| 
 | |
| 		}
 | |
| 
 | |
| 		if ( button.isPressed() ) {
 | |
| 
 | |
| 			button.whilePressed();
 | |
| 
 | |
| 		}
 | |
| 
 | |
| 	}
 | |
| 
 | |
| }
 | |
| 
 | |
| export { OculusHandModel };
 |