UNPKG

meta-client

Version:
359 lines (218 loc) 7.98 kB
import {Vector3, Matrix4, CubeGeometry, MeshBasicMaterial, SphereGeometry, Mesh, Raycaster, Sphere, Box3} from 'three'; import {log} from '../Utilities'; import {VREffect} from './lib/VREffect'; import {VRControls} from './lib/VRControls'; import {ViveController} from './lib/ViveController'; import {Matter} from '../World'; class Reality { constructor(WORLD, HUMAN){ let that = this; this.name = 'VirtualRealityDevice'; log(this.name); this.raycaster = new Raycaster(); //TODO WORLD.CONTROLS = or so... CONTROLS = new VRControls( CAMERA ); //TODO WORLD.EFFECT = or so... global.EFFECT = new VREffect( renderer ); EFFECT.setSize( window.innerWidth, window.innerHeight ); addEventListener('dblclick', () => { log(that.name, `fullscreen`) EFFECT.requestPresent(); }) function onTriggerDown0(){ console.log('onTriggerDown0') //HUMAN.go('swipedown'); } function onTriggerUp0(){ return; var data = {} data.position = new Vector3().setFromMatrixPosition(that.controller1.matrixWorld); HUMAN.go('touch', data); } function onThumbpadDown0(){ console.log('onThumbpadDown0') //HUMAN.go('touch'); } function onThumbpadUp0(){ HUMAN.go('release'); console.log('onThumbpadUp0') /* let mesh = new Mesh(new CubeGeometry(.1,.1,.1), new MeshBasicMaterial({color:0x0000ff})); mesh.position.setFromMatrixPosition(that.controller1.matrixWorld); WORLD.add(mesh); console.log(data.position) console.log(mesh.position) */ } function onMenuDown0(){ console.log('onMenuDown0') } function onMenuUp0(){ console.log('onMenuUp0') HUMAN.go('escape'); } function onGripsDown0(){ console.log('onGripsDown0') } function onGripsUp0(){ console.log('onGripsUp0') //HUMAN.go('esc'); } // function onTriggerDown1(){ console.log('onTriggerDown1') //HUMAN.go('swipeleft'); } function onTriggerUp1(){ console.log('onTriggerUp1') //HUMAN.go('swiperight'); } function onThumbpadDown1(){ console.log('onThumbpadDown1') } function onThumbpadUp1(){ console.log('onThumbpadUp1') //HUMAN.go('release'); } function onMenuDown1(){ console.log('onMenuDown1') } function onMenuUp1(){ console.log('onMenuUp1'); HUMAN.go('escape'); } function onGripsDown1(){ console.log('onGripsDown1') } function onGripsUp1(){ console.log('onGripsUp1') //HUMAN.go('esc'); } var tempMatrix = new Matrix4(); function getIntersections( controller, v ) { tempMatrix.identity().extractRotation( controller.matrixWorld ); that.raycaster.ray.origin.setFromMatrixPosition( controller.matrixWorld ); that.raycaster.ray.direction.set( v.x, v.y, v.z ).applyMatrix4( tempMatrix ); return that.raycaster.intersectObjects( WORLD.children ); } let oldIntersection = false; function intersectObjects( controller, v) { var intersections = getIntersections( controller, v ); //console.log(intersections.length); if ( intersections.length > 0 ) { var intersection = intersections[ 0 ]; //are we close? if(intersection.distance>=.01) return; //not the old one? if(oldIntersection != intersection) { HUMAN.go('touch', oldIntersection); oldIntersection = intersection; } }else{ if(oldIntersection) oldIntersection=false; } } /*HALLELUJA let oldIntersection = false; let direction = false; function intersectObjects( controller, v) { var intersections = getIntersections( controller, v ); //console.log(intersections.length); if ( intersections.length > 0 ) { var intersection = intersections[ 0 ]; if(oldIntersection == intersection) { if(intersection.distance<=oldIntersection.distance){ direction=true; }else{ direction=false; } }else{ oldIntersection = intersection; } }else{ if(direction) HUMAN.go('touch', oldIntersection) direction=false; } } */ //Vive controlers this.controller1 = new ViveController( 0 ); this.controller1.standingMatrix = CONTROLS.getStandingMatrix(); this.controller1.addEventListener( 'triggerdown', onTriggerDown0 ); this.controller1.addEventListener( 'triggerup', () => { console.log('onTriggerUp0') //that.controllerObject1.position.setFromMatrixPosition(that.controller1.matrixWorld); }); this.controller1.addEventListener( 'thumbpaddown', onThumbpadDown0 ); this.controller1.addEventListener( 'thumbpadup', onThumbpadUp0 ); this.controller1.addEventListener( 'menudown', onMenuDown0 ); this.controller1.addEventListener( 'menuup', onMenuUp0 ); this.controller1.addEventListener( 'gripsdown', onGripsDown0 ); this.controller1.addEventListener( 'gripsup', onGripsUp0 ); WORLD.add(that.controller1); this.controllerObject1 = new Mesh(new SphereGeometry(.01,16,16), new MeshBasicMaterial({color:0xff0000})); this.controller1.add(that.controllerObject1); this.controllerObject1Sphere = new Sphere(that.controllerObject1.position, that.controllerObject1.geometry.radius); this.controller2 = new ViveController( 1 ); this.controller2.standingMatrix = CONTROLS.getStandingMatrix(); this.controller2.addEventListener( 'triggerdown', onTriggerDown1 ); this.controller2.addEventListener( 'triggerup', onTriggerUp1 ); this.controller2.addEventListener( 'thumbpaddown', onThumbpadDown1 ); this.controller2.addEventListener( 'thumbpadup', onThumbpadUp1 ); this.controller2.addEventListener( 'menudown', onMenuDown1 ); this.controller2.addEventListener( 'menuup', onMenuUp1 ); this.controller2.addEventListener( 'gripsdown', onGripsDown1 ); this.controller2.addEventListener( 'gripsup', onGripsUp1 ); WORLD.add(that.controller2); this.controllerObject2 = new Mesh(new SphereGeometry(.01,16,16), new MeshBasicMaterial({color:0x0000ff})); this.controller2.add(that.controllerObject2); let oldObject = false; let before = false; function bounding(){ WORLD.traverse((object) => { if(object instanceof Matter === false) return; //if(object.name!='cube') return; var box = new Box3(new Vector3(), new Vector3()); box.setFromObject(object); if(box.containsPoint (new Vector3().setFromMatrixPosition(that.controller1.matrixWorld))){ if(!object.userData.touched){ HUMAN.go('touch', {object:object}); object.material.wireframe = false; object.userData.touched = true; } //no intersections }else { if(object.userData.touched){ HUMAN.go('release', {object:object}); object.material.wireframe = true; object.userData.touched = false; } } }); } WORLD.live(()=>{ that.controller1.update(); that.controller2.update(); bounding(); /* intersectObjects( that.controller1, {x:0,y:0,z:1} ); intersectObjects( that.controller1, {x:0,y:0,z:-1} ); intersectObjects( that.controller1, {x:1,y:0,z:0} ); intersectObjects( that.controller1, {x:-1,y:0,z:0} ); intersectObjects( that.controller1, {x:0,y:0,z:-1} ); intersectObjects( that.controller1, {x:-0,y:0,z:-1} ); */ }) } } export default Reality;