Dies ist das Repository meines kleinen Portfolios.
Im Hintergrund läuft eine Planetensimulation, geschrieben in JavaScript und Three.js.
Die zu sehenden Texturen stammen von:
https://www.solarsystemscope.com/textures/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
108 lines
1.7 KiB
108 lines
1.7 KiB
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 ) { |
|
|
|
super(); |
|
|
|
this.controller = controller; |
|
this.motionController = null; |
|
this.envMap = null; |
|
|
|
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 ); |
|
|
|
} |
|
|
|
} ); |
|
|
|
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 };
|
|
|