| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 | import { GLTFLoader } from '../loaders/GLTFLoader.js';const DEFAULT_HAND_PROFILE_PATH = 'https://cdn.jsdelivr.net/npm/@webxr-input-profiles/assets@1.0/dist/profiles/generic-hand/';class XRHandMeshModel {	constructor( handModel, controller, path, handedness ) {		this.controller = controller;		this.handModel = handModel;		this.bones = [];		const loader = new GLTFLoader();		loader.setPath( path || DEFAULT_HAND_PROFILE_PATH );		loader.load( `${handedness}.glb`, gltf => {			const object = gltf.scene.children[ 0 ];			this.handModel.add( object );			const mesh = object.getObjectByProperty( 'type', 'SkinnedMesh' );			mesh.frustumCulled = false;			mesh.castShadow = true;			mesh.receiveShadow = true;			const joints = [				'wrist',				'thumb-metacarpal',				'thumb-phalanx-proximal',				'thumb-phalanx-distal',				'thumb-tip',				'index-finger-metacarpal',				'index-finger-phalanx-proximal',				'index-finger-phalanx-intermediate',				'index-finger-phalanx-distal',				'index-finger-tip',				'middle-finger-metacarpal',				'middle-finger-phalanx-proximal',				'middle-finger-phalanx-intermediate',				'middle-finger-phalanx-distal',				'middle-finger-tip',				'ring-finger-metacarpal',				'ring-finger-phalanx-proximal',				'ring-finger-phalanx-intermediate',				'ring-finger-phalanx-distal',				'ring-finger-tip',				'pinky-finger-metacarpal',				'pinky-finger-phalanx-proximal',				'pinky-finger-phalanx-intermediate',				'pinky-finger-phalanx-distal',				'pinky-finger-tip',			];			joints.forEach( jointName => {				const bone = object.getObjectByName( jointName );				if ( bone !== undefined ) {					bone.jointName = jointName;				} else {					console.warn( `Couldn't find ${jointName} in ${handedness} hand mesh` );				}				this.bones.push( bone );			} );		} );	}	updateMesh() {		// XR Joints		const XRJoints = this.controller.joints;		for ( let i = 0; i < this.bones.length; i ++ ) {			const bone = this.bones[ i ];			if ( bone ) {				const XRJoint = XRJoints[ bone.jointName ];				if ( XRJoint.visible ) {					const position = XRJoint.position;					if ( bone ) {						bone.position.copy( position );						bone.quaternion.copy( XRJoint.quaternion );						// bone.scale.setScalar( XRJoint.jointRadius || defaultRadius );					}				}			}		}	}}export { XRHandMeshModel };
 |