|
@@ -19,12 +19,12 @@ export class WebXRControllerTeleportation {
|
|
private _tmpVector = new Vector3();
|
|
private _tmpVector = new Vector3();
|
|
|
|
|
|
/**
|
|
/**
|
|
- *
|
|
|
|
- * @param input
|
|
|
|
- * @param floorMeshes
|
|
|
|
|
|
+ * Creates a WebXRControllerTeleportation
|
|
|
|
+ * @param input input manager to add teleportation to
|
|
|
|
+ * @param floorMeshes floormeshes which can be teleported to
|
|
*/
|
|
*/
|
|
- constructor(input: WebXRInput, public floorMeshes:Array<AbstractMesh> = []){
|
|
|
|
- input.onControllerAddedObservable.add((c)=>{
|
|
|
|
|
|
+ constructor(input: WebXRInput, floorMeshes: Array<AbstractMesh> = []) {
|
|
|
|
+ input.onControllerAddedObservable.add((c) => {
|
|
let scene = c.pointer.getScene();
|
|
let scene = c.pointer.getScene();
|
|
|
|
|
|
let forwardReadyToTeleport = false;
|
|
let forwardReadyToTeleport = false;
|
|
@@ -80,103 +80,102 @@ export class WebXRControllerTeleportation {
|
|
scene.beginAnimation(torus, 0, 60, true);
|
|
scene.beginAnimation(torus, 0, 60, true);
|
|
|
|
|
|
// Handle user input on every frame
|
|
// Handle user input on every frame
|
|
- let renderObserver = scene.onBeforeRenderObservable.add(()=>{
|
|
|
|
|
|
+ let renderObserver = scene.onBeforeRenderObservable.add(() => {
|
|
// Move the teleportationTarget to where the user is targetting to teleport to
|
|
// Move the teleportationTarget to where the user is targetting to teleport to
|
|
- if(forwardReadyToTeleport){
|
|
|
|
- c.getWorldPointerRayToRef(this._tmpRay)
|
|
|
|
- let pick = scene.pickWithRay(this._tmpRay, (o)=>{
|
|
|
|
|
|
+ if (forwardReadyToTeleport) {
|
|
|
|
+ c.getWorldPointerRayToRef(this._tmpRay);
|
|
|
|
+ let pick = scene.pickWithRay(this._tmpRay, (o) => {
|
|
return floorMeshes.indexOf(o) !== -1;
|
|
return floorMeshes.indexOf(o) !== -1;
|
|
- })
|
|
|
|
- if(pick && pick.pickedPoint){
|
|
|
|
|
|
+ });
|
|
|
|
+ if (pick && pick.pickedPoint) {
|
|
// To avoid z-fighting
|
|
// To avoid z-fighting
|
|
teleportationTarget.position.copyFrom(pick.pickedPoint);
|
|
teleportationTarget.position.copyFrom(pick.pickedPoint);
|
|
teleportationTarget.position.y += 0.002;
|
|
teleportationTarget.position.y += 0.002;
|
|
}
|
|
}
|
|
teleportationTarget.isVisible = true;
|
|
teleportationTarget.isVisible = true;
|
|
(<Mesh>teleportationTarget.getChildren()[0]).isVisible = true;
|
|
(<Mesh>teleportationTarget.getChildren()[0]).isVisible = true;
|
|
- }else{
|
|
|
|
|
|
+ }else {
|
|
teleportationTarget.isVisible = false;
|
|
teleportationTarget.isVisible = false;
|
|
(<Mesh>teleportationTarget.getChildren()[0]).isVisible = false;
|
|
(<Mesh>teleportationTarget.getChildren()[0]).isVisible = false;
|
|
}
|
|
}
|
|
|
|
|
|
- if(c.inputSource.gamepad){
|
|
|
|
- if(c.inputSource.gamepad.axes[1]){
|
|
|
|
|
|
+ if (c.inputSource.gamepad) {
|
|
|
|
+ if (c.inputSource.gamepad.axes[1]) {
|
|
// Forward teleportation
|
|
// Forward teleportation
|
|
- if(c.inputSource.gamepad.axes[1] < -0.7){
|
|
|
|
- forwardReadyToTeleport = true
|
|
|
|
- }else{
|
|
|
|
- if(forwardReadyToTeleport){
|
|
|
|
|
|
+ if (c.inputSource.gamepad.axes[1] < -0.7) {
|
|
|
|
+ forwardReadyToTeleport = true;
|
|
|
|
+ }else {
|
|
|
|
+ if (forwardReadyToTeleport) {
|
|
// Teleport the users feet to where they targetted
|
|
// Teleport the users feet to where they targetted
|
|
- this._tmpVector.copyFrom(teleportationTarget.position)
|
|
|
|
- this._tmpVector.y += input.xrExperienceHelper.camera.position.y;
|
|
|
|
- input.xrExperienceHelper.setPositionOfCameraUsingContainer(this._tmpVector)
|
|
|
|
|
|
+ this._tmpVector.copyFrom(teleportationTarget.position);
|
|
|
|
+ this._tmpVector.y += input.baseExperience.camera.position.y;
|
|
|
|
+ input.baseExperience.setPositionOfCameraUsingContainer(this._tmpVector);
|
|
}
|
|
}
|
|
- forwardReadyToTeleport = false
|
|
|
|
|
|
+ forwardReadyToTeleport = false;
|
|
}
|
|
}
|
|
|
|
|
|
// Backward teleportation
|
|
// Backward teleportation
|
|
- if(c.inputSource.gamepad.axes[1] > 0.7){
|
|
|
|
- backwardReadyToTeleport = true
|
|
|
|
- }else{
|
|
|
|
- if(backwardReadyToTeleport){
|
|
|
|
|
|
+ if (c.inputSource.gamepad.axes[1] > 0.7) {
|
|
|
|
+ backwardReadyToTeleport = true;
|
|
|
|
+ }else {
|
|
|
|
+ if (backwardReadyToTeleport) {
|
|
// Cast a ray down from behind the user
|
|
// Cast a ray down from behind the user
|
|
- let camMat = input.xrExperienceHelper.camera.computeWorldMatrix();
|
|
|
|
- let q = new Quaternion()
|
|
|
|
- camMat.decompose(undefined, q, this._tmpRay.origin)
|
|
|
|
- this._tmpVector.set(0,0,-1);
|
|
|
|
- this._tmpVector.rotateByQuaternionToRef(q, this._tmpVector)
|
|
|
|
|
|
+ let camMat = input.baseExperience.camera.computeWorldMatrix();
|
|
|
|
+ let q = new Quaternion();
|
|
|
|
+ camMat.decompose(undefined, q, this._tmpRay.origin);
|
|
|
|
+ this._tmpVector.set(0, 0, -1);
|
|
|
|
+ this._tmpVector.rotateByQuaternionToRef(q, this._tmpVector);
|
|
this._tmpVector.y = 0;
|
|
this._tmpVector.y = 0;
|
|
- this._tmpVector.normalize()
|
|
|
|
|
|
+ this._tmpVector.normalize();
|
|
this._tmpVector.y = -1.5;
|
|
this._tmpVector.y = -1.5;
|
|
- this._tmpVector.normalize()
|
|
|
|
- this._tmpRay.direction.copyFrom(this._tmpVector)
|
|
|
|
- let pick = scene.pickWithRay(this._tmpRay, (o)=>{
|
|
|
|
|
|
+ this._tmpVector.normalize();
|
|
|
|
+ this._tmpRay.direction.copyFrom(this._tmpVector);
|
|
|
|
+ let pick = scene.pickWithRay(this._tmpRay, (o) => {
|
|
return floorMeshes.indexOf(o) !== -1;
|
|
return floorMeshes.indexOf(o) !== -1;
|
|
- })
|
|
|
|
|
|
+ });
|
|
|
|
|
|
- if(pick && pick.pickedPoint){
|
|
|
|
|
|
+ if (pick && pick.pickedPoint) {
|
|
// Teleport the users feet to where they targetted
|
|
// Teleport the users feet to where they targetted
|
|
- this._tmpVector.copyFrom(pick.pickedPoint)
|
|
|
|
- this._tmpVector.y += input.xrExperienceHelper.camera.position.y;
|
|
|
|
- input.xrExperienceHelper.setPositionOfCameraUsingContainer(this._tmpVector)
|
|
|
|
|
|
+ this._tmpVector.copyFrom(pick.pickedPoint);
|
|
|
|
+ this._tmpVector.y += input.baseExperience.camera.position.y;
|
|
|
|
+ input.baseExperience.setPositionOfCameraUsingContainer(this._tmpVector);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- backwardReadyToTeleport = false
|
|
|
|
|
|
+ backwardReadyToTeleport = false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- if(c.inputSource.gamepad.axes[0]){
|
|
|
|
- if(c.inputSource.gamepad.axes[0] < -0.7){
|
|
|
|
- leftReadyToTeleport = true
|
|
|
|
- }else{
|
|
|
|
- if(leftReadyToTeleport){
|
|
|
|
- input.xrExperienceHelper.rotateCameraByQuaternionUsingContainer(Quaternion.FromEulerAngles(0, -Math.PI/4, 0))
|
|
|
|
|
|
+ if (c.inputSource.gamepad.axes[0]) {
|
|
|
|
+ if (c.inputSource.gamepad.axes[0] < -0.7) {
|
|
|
|
+ leftReadyToTeleport = true;
|
|
|
|
+ }else {
|
|
|
|
+ if (leftReadyToTeleport) {
|
|
|
|
+ input.baseExperience.rotateCameraByQuaternionUsingContainer(Quaternion.FromEulerAngles(0, -Math.PI / 4, 0));
|
|
}
|
|
}
|
|
- leftReadyToTeleport = false
|
|
|
|
|
|
+ leftReadyToTeleport = false;
|
|
}
|
|
}
|
|
- if(c.inputSource.gamepad.axes[0] > 0.7){
|
|
|
|
- rightReadyToTeleport = true
|
|
|
|
- }else{
|
|
|
|
- if(rightReadyToTeleport){
|
|
|
|
- input.xrExperienceHelper.rotateCameraByQuaternionUsingContainer(Quaternion.FromEulerAngles(0, Math.PI/4, 0))
|
|
|
|
|
|
+ if (c.inputSource.gamepad.axes[0] > 0.7) {
|
|
|
|
+ rightReadyToTeleport = true;
|
|
|
|
+ }else {
|
|
|
|
+ if (rightReadyToTeleport) {
|
|
|
|
+ input.baseExperience.rotateCameraByQuaternionUsingContainer(Quaternion.FromEulerAngles(0, Math.PI / 4, 0));
|
|
}
|
|
}
|
|
- rightReadyToTeleport = false
|
|
|
|
|
|
+ rightReadyToTeleport = false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
}
|
|
}
|
|
- })
|
|
|
|
|
|
+ });
|
|
|
|
|
|
- c.onDisposeObservable.addOnce(()=>{
|
|
|
|
- teleportationTarget.dispose()
|
|
|
|
- dynamicTexture.dispose()
|
|
|
|
- teleportationCircleMaterial.dispose()
|
|
|
|
- torus.dispose()
|
|
|
|
|
|
+ c.onDisposeObservable.addOnce(() => {
|
|
|
|
+ teleportationTarget.dispose();
|
|
|
|
+ dynamicTexture.dispose();
|
|
|
|
+ teleportationCircleMaterial.dispose();
|
|
|
|
+ torus.dispose();
|
|
|
|
|
|
scene.onBeforeRenderObservable.remove(renderObserver);
|
|
scene.onBeforeRenderObservable.remove(renderObserver);
|
|
- })
|
|
|
|
- })
|
|
|
|
|
|
+ });
|
|
|
|
+ });
|
|
}
|
|
}
|
|
|
|
|
|
-
|
|
|
|
}
|
|
}
|