|
@@ -50,9 +50,23 @@ define(["module", "vwf/view"], function (module, view) {
|
|
|
this.rootSelector = options;
|
|
|
}
|
|
|
|
|
|
- this.gearvr = options.gearvr !== undefined ? options.gearvr : false;
|
|
|
- this.wmrright = options.wmrright !== undefined ? options.wmrright : false;
|
|
|
- this.wmrleft = options.wmrleft !== undefined ? options.wmrleft : false;
|
|
|
+ // this.gearvr = options.gearvr !== undefined ? options.gearvr : false;
|
|
|
+ // this.wmrright = options.wmrright !== undefined ? options.wmrright : false;
|
|
|
+ // this.wmrleft = options.wmrleft !== undefined ? options.wmrleft : false;
|
|
|
+
|
|
|
+ this.xrType = undefined;
|
|
|
+
|
|
|
+ //TODO: FIX detection in better way! (now works for Oculus Browser only)
|
|
|
+
|
|
|
+ this.hmd = false;
|
|
|
+ this.threeDoF = false;
|
|
|
+ this.sixDoF = false;
|
|
|
+
|
|
|
+ this.threeDoFMobile = AFRAME.utils.device.isMobileVR() && AFRAME.utils.device.checkHeadsetConnected() && !navigator.userAgent.includes('Quest');
|
|
|
+ this.sixDoFMobile = AFRAME.utils.device.checkHeadsetConnected() && navigator.userAgent.includes('Quest');
|
|
|
+ this.sixDoFDesktop = !AFRAME.utils.device.isMobile && !AFRAME.utils.device.isMobileVR() && AFRAME.utils.device.checkHeadsetConnected();
|
|
|
+
|
|
|
+
|
|
|
},
|
|
|
|
|
|
createdNode: function (nodeID, childID, childExtendsID, childImplementsIDs,
|
|
@@ -68,58 +82,52 @@ define(["module", "vwf/view"], function (module, view) {
|
|
|
|
|
|
if (this.state.scenes[childID]) {
|
|
|
let scene = this.state.scenes[childID];
|
|
|
-
|
|
|
+ //TODO: FIX
|
|
|
+
|
|
|
|
|
|
let prepairAvatar = new Promise((resolve, reject) => {
|
|
|
-
|
|
|
- function cb() {
|
|
|
- resolve("ok");
|
|
|
- }
|
|
|
- createAvatarControl(scene, cb);
|
|
|
+ document.body.appendChild(scene);
|
|
|
+ let createAvatarPromise = new Promise(r=> r(createAvatarControl(scene)));
|
|
|
+ return resolve(createAvatarPromise)
|
|
|
});
|
|
|
|
|
|
-
|
|
|
prepairAvatar.then(res => {
|
|
|
- // console.log(res);
|
|
|
- createAvatar.call(self, childID);
|
|
|
- postLoadAction.call(self, childID);
|
|
|
-
|
|
|
- if (this.gearvr == true) {
|
|
|
console.log("CREATE GEARVR HERE!!");
|
|
|
- if (AFRAME.utils.device.isMobileVR()) {
|
|
|
+ if (self.threeDoFMobile || _app.config.d3DoF ) {
|
|
|
+ this.xrType = 'mobileVR';
|
|
|
let nodeName = 'gearvr-' + self.kernel.moniker();
|
|
|
createGearVRControls();
|
|
|
createGearVRController.call(self, childID, nodeName);
|
|
|
}
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- if (this.wmrright == true) {
|
|
|
- console.log("CREATE WMR RIGHT HERE!!");
|
|
|
- if (!AFRAME.utils.device.isMobileVR()) {
|
|
|
- if (AFRAME.utils.device.checkHeadsetConnected()) {
|
|
|
- let nodeName = 'wmrvr-right-' + self.kernel.moniker();
|
|
|
- createWMRVRControls('right');
|
|
|
- createWMRVR.call(this, childID, nodeName);
|
|
|
+
|
|
|
+ console.log("CREATE XRController RIGHT HERE!!");
|
|
|
+ // if (!AFRAME.utils.device.isMobileVR()) {
|
|
|
+ if (self.sixDoFMobile || self.sixDoFDesktop || _app.config.d6DoF ) {
|
|
|
+
|
|
|
+ let nodeRight = 'xrcontroller-right-' + self.kernel.moniker();
|
|
|
+ createXRControls('right');
|
|
|
+ createXR.call(this, childID, nodeRight);
|
|
|
+
|
|
|
+ console.log("CREATE XRController LEFT HERE!!");
|
|
|
+ // if (!AFRAME.utils.device.isMobileVR()) {
|
|
|
+
|
|
|
+ let nodeLeft = 'xrcontroller-left-' + self.kernel.moniker();
|
|
|
+ createXRControls('left');
|
|
|
+ createXR.call(this, childID, nodeLeft);
|
|
|
}
|
|
|
- }
|
|
|
- }
|
|
|
+ // }
|
|
|
+
|
|
|
|
|
|
- if (this.wmrleft == true) {
|
|
|
- console.log("CREATE WMR LEFT HERE!!");
|
|
|
- if (!AFRAME.utils.device.isMobileVR()) {
|
|
|
- if (AFRAME.utils.device.checkHeadsetConnected()) {
|
|
|
- let nodeName = 'wmrvr-left-' + self.kernel.moniker();
|
|
|
- createWMRVRControls('left');
|
|
|
- createWMRVR.call(this, childID, nodeName);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
+ // console.log(res);
|
|
|
+ createAvatar.call(self, childID);
|
|
|
+ postLoadAction.call(self, childID);
|
|
|
|
|
|
+ }).then(res=>{
|
|
|
+ //document.body.appendChild(scene);
|
|
|
})
|
|
|
// this.state.appInitialized = true;
|
|
|
|
|
|
- document.body.appendChild(scene); //append is not working in Edge browser
|
|
|
+ //document.body.appendChild(scene); //append is not working in Edge browser
|
|
|
|
|
|
}
|
|
|
|
|
@@ -178,6 +186,12 @@ define(["module", "vwf/view"], function (module, view) {
|
|
|
}
|
|
|
|
|
|
|
|
|
+ // if (node.extendsID == "http://vwf.example.com/aframe/atext.vwf") {
|
|
|
+ // console.log("Text component initialized");
|
|
|
+ // node.aframeObj.play();
|
|
|
+
|
|
|
+ // }
|
|
|
+
|
|
|
// if (node.prototypes.includes("http://vwf.example.com/aframe/aentity.vwf")) {
|
|
|
|
|
|
// var clientThatSatProperty = self.kernel.client();
|
|
@@ -260,26 +274,6 @@ define(["module", "vwf/view"], function (module, view) {
|
|
|
receiveModelTransformChanges(nodeId, 'scale', propertyValue);
|
|
|
}
|
|
|
|
|
|
- // if (node.aframeObj.nodeName == "AUDIO" && propertyName == 'itemSrc') {
|
|
|
-
|
|
|
- // //console.log("sat new item");
|
|
|
- // let elID = '#' + node.aframeObj.getAttribute('id');
|
|
|
- // Object.entries(this.state.nodes).forEach(el => {
|
|
|
- // let src = el[1].aframeObj.getAttribute('src');
|
|
|
- // if (src){
|
|
|
- // // console.log("my: " + src);
|
|
|
- // if (src == elID)
|
|
|
- // self.kernel.callMethod(el[0], "updateSrc", [elID])
|
|
|
- // }
|
|
|
- // })
|
|
|
-
|
|
|
- // }
|
|
|
-
|
|
|
- // if ( propertyName == "position" ) {
|
|
|
- // receiveModelTransformChanges( nodeId, propertyValue );
|
|
|
- // }
|
|
|
-
|
|
|
-
|
|
|
if (node.aframeObj.nodeName == "AUDIO" && propertyName == 'itemSrc') {
|
|
|
|
|
|
//console.log("sat new item");
|
|
@@ -475,16 +469,22 @@ define(["module", "vwf/view"], function (module, view) {
|
|
|
updateAvatarPosition();
|
|
|
|
|
|
//update vr controllers
|
|
|
- if (this.gearvr == true) {
|
|
|
- updateHandControllerVR('gearvr-', '#gearvrcontrol');
|
|
|
- }
|
|
|
- if (this.wmrright == true) {
|
|
|
- updateHandControllerVR('wmrvr-right-', '#wmrvrcontrolright');
|
|
|
- }
|
|
|
- if (this.wmrleft == true) {
|
|
|
- updateHandControllerVR('wmrvr-left-', '#wmrvrcontrolleft');
|
|
|
+
|
|
|
+ if(self.hmd){
|
|
|
+ if(self.threeDoF )
|
|
|
+ updateHandControllerVR('gearvr-', '#gearvrcontrol');
|
|
|
+
|
|
|
+ if(this.sixDoF ) {
|
|
|
+ updateHandControllerVR('xrcontroller-right-', '#xrcontrollerright');
|
|
|
+ updateHandControllerVR('xrcontroller-left-', '#xrcontrollerleft');
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
//lerpTick ();
|
|
|
},
|
|
|
|
|
@@ -643,7 +643,7 @@ define(["module", "vwf/view"], function (module, view) {
|
|
|
|
|
|
function updateAvatarPosition() {
|
|
|
|
|
|
- let delta = 0.0001;
|
|
|
+ let delta = 0.001;
|
|
|
|
|
|
let avatarName = 'avatar-' + self.kernel.moniker();
|
|
|
var node = self.state.nodes[avatarName];
|
|
@@ -654,25 +654,51 @@ define(["module", "vwf/view"], function (module, view) {
|
|
|
if (el) {
|
|
|
//let position = el.object3D.getWorldPosition(); //el.getAttribute('position');
|
|
|
|
|
|
+ //var position;
|
|
|
+ // if((self.hmd && self.sixDoF) || _app.config.d6DoF){
|
|
|
+ // position = el.getAttribute('position');
|
|
|
+ // } else {
|
|
|
+ // position = new THREE.Vector3();
|
|
|
+ // el.object3D.getWorldPosition(position);
|
|
|
+ // }
|
|
|
+ //let position = el.getAttribute('position');
|
|
|
+
|
|
|
+ //let position = el.getAttribute('position');
|
|
|
+ //let position = el.object3D.position.clone();
|
|
|
let position = new THREE.Vector3();
|
|
|
- el.object3D.getWorldPosition(position);
|
|
|
+ el.object3D.localToWorld(position);
|
|
|
|
|
|
let rotation = el.getAttribute('rotation'); //getWorldRotation(el, 'YXZ');
|
|
|
|
|
|
let lastRotation = self.nodes[avatarName].selfTickRotation;
|
|
|
- let lastPosition = self.nodes[avatarName].selfTickPosition;
|
|
|
+ let lastPosition = self.nodes[avatarName].selfTickPosition ? self.nodes[avatarName].selfTickPosition: new THREE.Vector3(0, 0, 0);
|
|
|
|
|
|
// let currentPosition = node.aframeObj.getAttribute('position');
|
|
|
// let currentRotation = node.aframeObj.getAttribute('rotation');
|
|
|
|
|
|
- if (position && rotation && lastPosition && lastRotation) {
|
|
|
- if (compareCoordinates(position, lastPosition, delta) || Math.abs(rotation.y - lastRotation.y) > delta) {
|
|
|
- console.log("not equal!!")
|
|
|
- self.kernel.callMethod(avatarName, "followAvatarControl", [position, rotation]);
|
|
|
+
|
|
|
+ // compareCoordinates(position, lastPosition, delta)
|
|
|
+
|
|
|
+ if(position && lastPosition ) {
|
|
|
+ let distance = lastPosition.distanceTo(position);
|
|
|
+
|
|
|
+ if (distance > delta)
|
|
|
+ {
|
|
|
+ console.log("position not equal");
|
|
|
+ self.kernel.setProperty(avatarName, "position", position);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (rotation && lastRotation) {
|
|
|
+ let distance = Math.abs(rotation.y - lastRotation.y);
|
|
|
+ if ( distance > delta) {
|
|
|
+ console.log("rotation not equal")
|
|
|
+ self.kernel.callMethod(avatarName, "updateAvatarRotation", [rotation]);
|
|
|
}
|
|
|
}
|
|
|
self.nodes[avatarName].selfTickRotation = Object.assign({}, rotation);
|
|
|
- self.nodes[avatarName].selfTickPosition = Object.assign({}, position);
|
|
|
+ //self.nodes[avatarName].selfTickPosition = Object.assign({}, position);
|
|
|
+ self.nodes[avatarName].selfTickPosition = position.clone();
|
|
|
}
|
|
|
|
|
|
}
|
|
@@ -681,7 +707,7 @@ define(["module", "vwf/view"], function (module, view) {
|
|
|
function updateHandControllerVR(aName, aSelector) {
|
|
|
//let avatarName = 'avatar-' + self.kernel.moniker();
|
|
|
|
|
|
- let delta = 0.0001
|
|
|
+ let delta = 0.001
|
|
|
|
|
|
let avatarName = aName + self.kernel.moniker();
|
|
|
var node = self.state.nodes[avatarName];
|
|
@@ -692,30 +718,57 @@ define(["module", "vwf/view"], function (module, view) {
|
|
|
if (el) {
|
|
|
//let position = el.object3D.getWorldPosition() //el.getAttribute('position');
|
|
|
|
|
|
- let position = new THREE.Vector3();
|
|
|
- el.object3D.getWorldPosition(position);
|
|
|
+ // let position = new THREE.Vector3();
|
|
|
+ // el.object3D.getWorldPosition(position);
|
|
|
+ // let rotation = getWorldRotation(el, 'XYZ');
|
|
|
|
|
|
- let rotation = getWorldRotation(el, 'XYZ');
|
|
|
+ // let position = el.getAttribute('position');
|
|
|
+ // let rotation = el.getAttribute('rotation');
|
|
|
|
|
|
- //let rotation = el.getAttribute('rotation');
|
|
|
+ // let position = el.object3D.position;
|
|
|
+ let position = new THREE.Vector3();
|
|
|
+ el.object3D.localToWorld(position);
|
|
|
+ let rotation = el.getAttribute('rotation'); //getWorldRotation(el, 'YXZ');
|
|
|
|
|
|
let lastRotation = self.nodes[avatarName].selfTickRotation;
|
|
|
- let lastPosition = self.nodes[avatarName].selfTickPosition;
|
|
|
+ let lastPosition = self.nodes[avatarName].selfTickPosition ? self.nodes[avatarName].selfTickPosition: new THREE.Vector3(0, 0, 0);
|
|
|
|
|
|
// let currentPosition = node.aframeObj.getAttribute('position');
|
|
|
//let currentRotation = node.aframeObj.getAttribute('rotation');
|
|
|
|
|
|
- if (position && rotation && lastRotation && lastPosition) {
|
|
|
- if (compareCoordinates(position, lastPosition, delta) || compareCoordinates(rotation, lastRotation, delta)) {
|
|
|
- console.log("not equal!!");
|
|
|
- vwf_view.kernel.callMethod(avatarName, "updateVRControl", [position, rotation]);
|
|
|
+ if (position && lastPosition) {
|
|
|
+ let distance = lastPosition.distanceTo(position);
|
|
|
+
|
|
|
+ if (distance > delta)
|
|
|
+ {
|
|
|
+ console.log("position not equal");
|
|
|
+ self.kernel.setProperty(avatarName, "position", position);
|
|
|
+ self.kernel.callMethod(avatarName, "moveVRController",[]);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ if (rotation && lastRotation) {
|
|
|
+ let distance = compareCoordinates(rotation, lastRotation, delta)
|
|
|
+
|
|
|
+ if (distance)
|
|
|
+ {
|
|
|
+ console.log("rotation not equal");
|
|
|
+ self.kernel.setProperty(avatarName, "rotation", rotation);
|
|
|
+ self.kernel.callMethod(avatarName, "moveVRController",[]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // if (position && rotation && lastRotation && lastPosition) {
|
|
|
+ // if (compareCoordinates(position, lastPosition, delta) || compareCoordinates(rotation, lastRotation, delta)) {
|
|
|
+ // console.log("not equal!!");
|
|
|
+ // vwf_view.kernel.callMethod(avatarName, "updateVRControl", [position, rotation]);
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+
|
|
|
|
|
|
//vwf_view.kernel.callMethod(avatarName, "updateVRControl", [position, rotation]);
|
|
|
|
|
|
- self.nodes[avatarName].selfTickPosition = Object.assign({}, position);
|
|
|
+ self.nodes[avatarName].selfTickPosition = position.clone();
|
|
|
self.nodes[avatarName].selfTickRotation = Object.assign({}, rotation);
|
|
|
|
|
|
}
|
|
@@ -749,7 +802,7 @@ define(["module", "vwf/view"], function (module, view) {
|
|
|
//console.log(axes);
|
|
|
let el = document.querySelector('#avatarControl');
|
|
|
let position = new THREE.Vector3();
|
|
|
- el.object3D.getWorldPosition(position);
|
|
|
+ el.object3D.localToWorld(position);//getWorldPosition(position);
|
|
|
let vel = new THREE.Vector3(axes[0], 0, -axes[1]);
|
|
|
el.object3D.position.add(getMovementVector(el,vel));
|
|
|
}
|
|
@@ -772,7 +825,7 @@ define(["module", "vwf/view"], function (module, view) {
|
|
|
//el.object3D.rotation.set(val+rotation.x, rotation.y, rotation.z)
|
|
|
}
|
|
|
|
|
|
- function createAvatarControl(aScene, cb) {
|
|
|
+ async function createAvatarControl(aScene) {
|
|
|
|
|
|
let avatarName = 'avatar-' + self.kernel.moniker();
|
|
|
|
|
@@ -780,8 +833,10 @@ define(["module", "vwf/view"], function (module, view) {
|
|
|
avatarEl.setAttribute('id', 'avatarControlParent');
|
|
|
|
|
|
|
|
|
- if (AFRAME.utils.device.isMobileVR()) {
|
|
|
+ if (self.d3DoF || _app.config.d3DoF) {
|
|
|
+ //avatarEl.setAttribute('gearvr-controls', {});
|
|
|
avatarEl.setAttribute('movement-controls', {});//{'controls': 'gamepad'});
|
|
|
+ // avatarEl.setAttribute("gamepad-controls", {});
|
|
|
//avatarEl.setAttribute('position', '0 0 0');
|
|
|
}
|
|
|
|
|
@@ -791,11 +846,15 @@ define(["module", "vwf/view"], function (module, view) {
|
|
|
|
|
|
controlEl.setAttribute('id', 'avatarControl');
|
|
|
controlEl.setAttribute('wasd-controls', {acceleration:20});
|
|
|
- controlEl.setAttribute('look-controls', { pointerLockEnabled: false });
|
|
|
+ controlEl.setAttribute('look-controls', { pointerLockEnabled: false});
|
|
|
+ controlEl.setAttribute('look-controls', 'enabled', true );
|
|
|
+
|
|
|
//controlEl.setAttribute('gamepad-controls', {'controller': 0});
|
|
|
|
|
|
if (AFRAME.utils.device.isMobile()) {
|
|
|
//self.state.showMobileJoystick()
|
|
|
+
|
|
|
+ controlEl.setAttribute('look-controls', 'enabled', true );
|
|
|
controlEl.setAttribute("virtual-gamepad-controls", {});
|
|
|
controlEl.addEventListener("move", setJoystickMoveInput);
|
|
|
}
|
|
@@ -817,13 +876,14 @@ define(["module", "vwf/view"], function (module, view) {
|
|
|
cursorEl.setAttribute('raycaster', 'objects', '.clickable');
|
|
|
cursorEl.setAttribute('raycaster', 'showLine', false);
|
|
|
|
|
|
- if (AFRAME.utils.device.isMobileVR()) { }
|
|
|
-
|
|
|
// cursorEl.setAttribute('raycaster', {objects: '.intersectable', showLine: true, far: 100});
|
|
|
// cursorEl.setAttribute('raycaster', 'showLine', true);
|
|
|
controlEl.appendChild(cursorEl);
|
|
|
|
|
|
avatarEl.appendChild(controlEl);
|
|
|
+
|
|
|
+ //avatarEl.setAttribute('avatar', {});
|
|
|
+
|
|
|
aScene.appendChild(avatarEl);
|
|
|
|
|
|
controlEl.setAttribute('camera', 'active', true);
|
|
@@ -840,8 +900,8 @@ define(["module", "vwf/view"], function (module, view) {
|
|
|
// aScene.appendChild(arControl);
|
|
|
|
|
|
|
|
|
-
|
|
|
- cb();
|
|
|
+ return "OK!"
|
|
|
+ // cb();
|
|
|
|
|
|
// let gearVRControlsEl = document.createElement('a-entity');
|
|
|
// gearVRControlsEl.setAttribute('id', 'gearvr-'+avatarName);
|
|
@@ -865,12 +925,12 @@ define(["module", "vwf/view"], function (module, view) {
|
|
|
|
|
|
}
|
|
|
|
|
|
- function createWMRVR(nodeID, nodeName) {
|
|
|
+ function createXR(nodeID, nodeName) {
|
|
|
|
|
|
var newNode = {
|
|
|
"id": nodeName,
|
|
|
"uri": nodeName,
|
|
|
- "extends": "http://vwf.example.com/aframe/wmrvrcontroller.vwf",
|
|
|
+ "extends": "http://vwf.example.com/aframe/xrcontroller.vwf",
|
|
|
"properties": {
|
|
|
}
|
|
|
}
|
|
@@ -1025,35 +1085,57 @@ define(["module", "vwf/view"], function (module, view) {
|
|
|
|
|
|
function createGearVRControls() {
|
|
|
|
|
|
- let sceneEl = document.querySelector('a-scene');
|
|
|
-
|
|
|
let avatarControl = document.querySelector('#avatarControlParent');
|
|
|
|
|
|
- let gearvr = document.createElement('a-entity');
|
|
|
- gearvr.setAttribute('id', 'gearvrcontrol');
|
|
|
- gearvr.setAttribute('gearvr-controls', {
|
|
|
+ let el = document.createElement('a-entity');
|
|
|
+ el.setAttribute('id', 'gearvrcontrol');
|
|
|
+
|
|
|
+ el.setAttribute('gearvr-controls', {
|
|
|
'hand': 'right',
|
|
|
'model': true
|
|
|
});
|
|
|
+
|
|
|
// gearvr.setAttribute('gearvr-controls', 'hand', 'right');
|
|
|
|
|
|
- gearvr.setAttribute('gearvrcontrol', {});
|
|
|
- avatarControl.appendChild(gearvr);
|
|
|
+ el.setAttribute('teleport-controls', {
|
|
|
+ cameraRig: '#avatarControlParent',
|
|
|
+ teleportOrigin: '#avatarControl',
|
|
|
+ startEvents: 'teleportstart',
|
|
|
+ endEvents: 'teleportend'
|
|
|
+ });
|
|
|
+
|
|
|
+ el.setAttribute('gearvrcontrol', {});
|
|
|
+ avatarControl.appendChild(el);
|
|
|
|
|
|
}
|
|
|
|
|
|
- function createWMRVRControls(hand) {
|
|
|
-
|
|
|
- let sceneEl = document.querySelector('a-scene');
|
|
|
+ function createXRControls(hand) {
|
|
|
|
|
|
let avatarControl = document.querySelector('#avatarControlParent');
|
|
|
|
|
|
- let wmrvr = document.createElement('a-entity');
|
|
|
- wmrvr.setAttribute('id', 'wmrvrcontrol' + hand);
|
|
|
- wmrvr.setAttribute('windows-motion-controls', '');
|
|
|
- wmrvr.setAttribute('windows-motion-controls', 'hand', hand);
|
|
|
- wmrvr.setAttribute('wmrvrcontrol', { 'hand': hand });
|
|
|
- avatarControl.appendChild(wmrvr);
|
|
|
+ let el = document.createElement('a-entity');
|
|
|
+ el.setAttribute('id', 'xrcontroller' + hand);
|
|
|
+
|
|
|
+ el.setAttribute('hand-controls', {
|
|
|
+ 'hand': hand,
|
|
|
+ 'handModelStyle': 'lowPoly',
|
|
|
+ 'color': '#ffcccc'
|
|
|
+ });
|
|
|
+
|
|
|
+ // wmrvr.setAttribute('windows-motion-controls', '');
|
|
|
+ // wmrvr.setAttribute('windows-motion-controls', 'hand', hand);
|
|
|
+
|
|
|
+ el.setAttribute('xrcontroller', { 'hand': hand });
|
|
|
+
|
|
|
+ //add teleport controls
|
|
|
+ el.setAttribute('teleport-controls', {
|
|
|
+ cameraRig: '#avatarControlParent',
|
|
|
+ teleportOrigin: '#avatarControl',
|
|
|
+ startEvents: 'teleportstart',
|
|
|
+ endEvents: 'teleportend'
|
|
|
+ });
|
|
|
+
|
|
|
+ avatarControl.appendChild(el);
|
|
|
}
|
|
|
|
|
|
|