VR headset object management
This commit is contained in:
+2
-1
@@ -20,7 +20,7 @@ class Hero{
|
||||
this.actionIdle = this.mixer.clipAction( this.object.animations.find(a=>a.name=='idle') );
|
||||
this.actionIdle.play();
|
||||
this.activeAction = this.actionIdle;
|
||||
this.pointerControls = new PointerControls(gameEngine.cameraPivot, this.model, gameEngine.renderer.domElement);
|
||||
this.pointerControls = new PointerControls(gameEngine.camera, this.model, gameEngine.renderer.domElement);
|
||||
gameEngine.hero = this;
|
||||
|
||||
// Character Collider
|
||||
@@ -96,6 +96,7 @@ class Hero{
|
||||
}
|
||||
|
||||
update(){
|
||||
return;
|
||||
let { inputVelocity, velocity, euler, quat, v, targetQuaternion, clock } = this;
|
||||
let pc = this.pointerControls;
|
||||
pc.update();
|
||||
|
||||
+55
-42
@@ -92,7 +92,7 @@ class GameEngine {
|
||||
this.activeObjects = new THREE.Group();
|
||||
scene.add(this.activeObjects);
|
||||
|
||||
const controls = new OrbitControls(this.camera, renderer.domElement, this.activeObjects);
|
||||
const controls = new OrbitControls(this.camera, renderer.domElement);
|
||||
if (opts.gizmo) {
|
||||
const gizmo = new ViewportGizmo(this.camera, renderer, {
|
||||
container: '.renderer-gizmo',
|
||||
@@ -181,8 +181,8 @@ class GameEngine {
|
||||
c1.userData.active = false;
|
||||
c1.addEventListener('connected', e => {
|
||||
c1.gamepad = e.data.gamepad;
|
||||
this.session = this.renderer.xr.getSession();
|
||||
this.session.addEventListener('selectstart', this.onControllerEvent.bind(this));
|
||||
// this.session = this.renderer.xr.getSession();
|
||||
// this.session.addEventListener('selectstart', this.onControllerEvent.bind(this));
|
||||
})
|
||||
this.scene.add(c1);
|
||||
|
||||
@@ -213,13 +213,15 @@ class GameEngine {
|
||||
line.name = 'line';
|
||||
line.scale.z = 5;
|
||||
|
||||
this.controllerLine = line;
|
||||
|
||||
this.xrController1 = c1
|
||||
this.xrController2 = c2
|
||||
}
|
||||
|
||||
initCameraPivot() {
|
||||
const pivot = new THREE.Object3D()
|
||||
pivot.position.set(0, 1, 10)
|
||||
pivot.position.set(0, 0, 0)
|
||||
|
||||
const yaw = new THREE.Object3D()
|
||||
const pitch = new THREE.Object3D()
|
||||
@@ -264,10 +266,10 @@ class GameEngine {
|
||||
if (gameEngine.xrController1?.gamepad) {
|
||||
let gp = gameEngine.xrController1.gamepad;
|
||||
if (gp.axes[3] != 0) {
|
||||
gameEngine.scene.position.z += gp.axes[3] * delta;
|
||||
gameEngine.activeObjects.position.z += gp.axes[3] * delta;
|
||||
}
|
||||
if (gp.axes[2] != 0) {
|
||||
gameEngine.scene.position.x += gp.axes[2] * delta;
|
||||
gameEngine.activeObjects.position.x += gp.axes[2] * delta;
|
||||
}
|
||||
}
|
||||
if (gameEngine.xrController2?.gamepad) {
|
||||
@@ -279,12 +281,12 @@ class GameEngine {
|
||||
// }
|
||||
if (gp.axes[2] != 0) {
|
||||
if (gp1.buttons[4]?.pressed) {
|
||||
gameEngine.scene.position.y += gp.axes[2] * delta;
|
||||
gameEngine.activeObjects.position.y += gp.axes[2] * delta;
|
||||
} else if (gp1.buttons[5]?.pressed) {
|
||||
let sc = gameEngine.scene.scale.x * (gp.axes[2] * delta * 0.5 + 1);
|
||||
gameEngine.scene.scale.set(sc, sc, sc);
|
||||
let sc = gameEngine.activeObjects.scale.x * (gp.axes[2] * delta * 0.5 + 1);
|
||||
gameEngine.activeObjects.scale.set(sc, sc, sc);
|
||||
} else {
|
||||
gameEngine.scene.rotation.y += gp.axes[2] * delta * 0.5;
|
||||
gameEngine.activeObjects.rotation.y += gp.axes[2] * delta * 0.5;
|
||||
}
|
||||
}
|
||||
if (gp.buttons[4]?.pressed) {
|
||||
@@ -306,45 +308,55 @@ class GameEngine {
|
||||
|
||||
onControllerEvent(event) {
|
||||
//this.handleXrAction(event, this);
|
||||
event.type !== 'move' && console.log(event)
|
||||
// const controller = event.target;
|
||||
// if (controller.userData.active === false) return;
|
||||
// this.raycaster.setFromXRController(controller);
|
||||
// switch (event.type) {
|
||||
// case 'selectstart':
|
||||
// this.transformControls.pointerDown(null);
|
||||
// break;
|
||||
// case 'selectend':
|
||||
// this.transformControls.pointerUp(null);
|
||||
// break;
|
||||
// case 'move':
|
||||
// this.transformControls.pointerHover(null);
|
||||
// this.transformControls.pointerMove(null);
|
||||
// break;
|
||||
// }
|
||||
//event.type !== 'move' && console.log(event)
|
||||
const controller = event.target;
|
||||
//console.log(event)
|
||||
if (!controller.userData) return
|
||||
if (controller.userData.active === false) return;
|
||||
this.transformControls.getRaycaster().setFromXRController(controller);
|
||||
switch (event.type) {
|
||||
case 'selectstart':
|
||||
this.transformControls.pointerDown(null);
|
||||
break;
|
||||
case 'selectend':
|
||||
this.transformControls.pointerUp(null);
|
||||
break;
|
||||
case 'move':
|
||||
this.transformControls.pointerHover(null);
|
||||
this.transformControls.pointerMove(null);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
onSelect(event) {
|
||||
// const controller = event.target;
|
||||
// this.xrController1.userData.active = false;
|
||||
// this.xrController2.userData.active = false;
|
||||
const controller = event.target;
|
||||
this.xrController1.userData.active = false;
|
||||
this.xrController2.userData.active = false;
|
||||
|
||||
// if (controller === this.xrController1) {
|
||||
// this.xrController1.userData.active = true;
|
||||
// this.xrController1.add(line);
|
||||
// }
|
||||
if (controller === this.xrController1) {
|
||||
this.xrController1.userData.active = true;
|
||||
this.xrController1.add(this.controllerLine);
|
||||
}
|
||||
|
||||
// if (controller === this.xrController2) {
|
||||
// this.xrController2.userData.active = true;
|
||||
// this.xrController2.add(line);
|
||||
// }
|
||||
if (controller === this.xrController2) {
|
||||
this.xrController2.userData.active = true;
|
||||
this.xrController2.add(this.controllerLine);
|
||||
}
|
||||
|
||||
// this.raycaster.setFromXRController(controller);
|
||||
// const intersects = this.raycaster.intersectObjects(this.activeObjects.children);
|
||||
this.raycaster.setFromXRController(controller);
|
||||
const intersects = this.raycaster.intersectObjects(this.activeObjects.children, true);
|
||||
|
||||
// if (intersects.length > 0) {
|
||||
// this.transformControls.attach(intersects[0].object);
|
||||
// }
|
||||
intersects.forEach(o => {
|
||||
while (o.object && !this.activeObjects.children.includes(o.object)) {
|
||||
o.object = o.object.parent;
|
||||
}
|
||||
})
|
||||
|
||||
if (intersects.length > 0) {
|
||||
setTimeout(() => {
|
||||
this.transformControls.attach(intersects[0].object);
|
||||
}, 100);
|
||||
}
|
||||
}
|
||||
|
||||
$ = THREE;
|
||||
@@ -430,6 +442,7 @@ class GameEngine {
|
||||
}
|
||||
})
|
||||
}
|
||||
//console.log('intersects', intersects);
|
||||
return intersects;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user