XRHandMeshModel constructor

XRHandMeshModel(
  1. XRHandModel handModel,
  2. WebXRController controller,
  3. String? path,
  4. dynamic handedness, [
  5. GLTFLoader? loader,
  6. Function? onLoad,
])

Constructs a new XR hand mesh model.

@param {XRHandModel} handModel - The hand model. @param {Group} controller - The WebXR controller. @param {?string} path - The model path. @param {XRHandedness} handedness - The handedness of the XR input source. @param {?Loader} loader=null - The loader. If not provided, an instance of GLTFLoader will be used to load models. @param {?Function} onLoad=null - A callback that is executed when a controller model has been loaded.

Implementation

XRHandMeshModel(this.handModel, this.controller, this.path, handedness, [this.loader, this.onLoad]){
	if ( loader == null ) {
		loader = GLTFLoader();
		loader?.setPath( path ?? DEFAULT_HAND_PROFILE_PATH );
	}

	loader!.unknown('$handedness.glb').then((gltf){
		final object = gltf!.scene.children[ 0 ];
		handModel.add( object );

		final 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){
			final bone = object.getObjectByName( jointName );

			if ( bone != null ) {
				bone.userData['jointName'] = jointName;
			}
        else {
				console.warning('Couldn\'t find $jointName in $handedness hand mesh');
			}

			bones?.add( bone );
		});

		onLoad?.call( object );
	});
}