添加关照、全局等高线、修改图层问题
This commit is contained in:
		
							
								
								
									
										103
									
								
								static/sdk/three/jsm/webxr/XRHandPrimitiveModel.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										103
									
								
								static/sdk/three/jsm/webxr/XRHandPrimitiveModel.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,103 @@ | ||||
| import { | ||||
| 	DynamicDrawUsage, | ||||
| 	SphereGeometry, | ||||
| 	BoxGeometry, | ||||
| 	MeshStandardMaterial, | ||||
| 	InstancedMesh, | ||||
| 	Matrix4, | ||||
| 	Vector3 | ||||
| } from 'three'; | ||||
|  | ||||
| const _matrix = new Matrix4(); | ||||
| const _vector = new Vector3(); | ||||
|  | ||||
| class XRHandPrimitiveModel { | ||||
|  | ||||
| 	constructor( handModel, controller, path, handedness, options ) { | ||||
|  | ||||
| 		this.controller = controller; | ||||
| 		this.handModel = handModel; | ||||
| 		this.envMap = null; | ||||
|  | ||||
| 		let geometry; | ||||
|  | ||||
| 		if ( ! options || ! options.primitive || options.primitive === 'sphere' ) { | ||||
|  | ||||
| 			geometry = new SphereGeometry( 1, 10, 10 ); | ||||
|  | ||||
| 		} else if ( options.primitive === 'box' ) { | ||||
|  | ||||
| 			geometry = new BoxGeometry( 1, 1, 1 ); | ||||
|  | ||||
| 		} | ||||
|  | ||||
| 		const material = new MeshStandardMaterial(); | ||||
|  | ||||
| 		this.handMesh = new InstancedMesh( geometry, material, 30 ); | ||||
| 		this.handMesh.frustumCulled = false; | ||||
| 		this.handMesh.instanceMatrix.setUsage( DynamicDrawUsage ); // will be updated every frame | ||||
| 		this.handMesh.castShadow = true; | ||||
| 		this.handMesh.receiveShadow = true; | ||||
| 		this.handModel.add( this.handMesh ); | ||||
|  | ||||
| 		this.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' | ||||
| 		]; | ||||
|  | ||||
| 	} | ||||
|  | ||||
| 	updateMesh() { | ||||
|  | ||||
| 		const defaultRadius = 0.008; | ||||
| 		const joints = this.controller.joints; | ||||
|  | ||||
| 		let count = 0; | ||||
|  | ||||
| 		for ( let i = 0; i < this.joints.length; i ++ ) { | ||||
|  | ||||
| 			const joint = joints[ this.joints[ i ] ]; | ||||
|  | ||||
| 			if ( joint.visible ) { | ||||
|  | ||||
| 				_vector.setScalar( joint.jointRadius || defaultRadius ); | ||||
| 				_matrix.compose( joint.position, joint.quaternion, _vector ); | ||||
| 				this.handMesh.setMatrixAt( i, _matrix ); | ||||
|  | ||||
| 				count ++; | ||||
|  | ||||
| 			} | ||||
|  | ||||
| 		} | ||||
|  | ||||
| 		this.handMesh.count = count; | ||||
| 		this.handMesh.instanceMatrix.needsUpdate = true; | ||||
|  | ||||
| 	} | ||||
|  | ||||
| } | ||||
|  | ||||
| export { XRHandPrimitiveModel }; | ||||
		Reference in New Issue
	
	Block a user