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