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 };
 |