let camera; let player; let xrFrameSystem; // 位移速度 let speed = 5; // 视角旋转的速度 let smoothSpeed = 8; // 世界坐标系下的标准方位 let up; let left; // player相关 let position; let quaternionP; //player的四元数 let quaternionPIni; //player每次转动开始时的角度 let quaternionPRes; //player每次需要转动到的角度 let quaternionPTemp; //旋转四元数的临时变量 // camera相关 let quaternionC; //camera的四元数 let quaternionCIni; //camera每次转动开始时的角度 let quaternionCRes; //camera每次需要转动到的角度 // 初始化是否完成的标记 let initFinish = false; Component({ behaviors: [require('../../common/share-behavior').default], properties: { width:Number, height:Number, transferData: { type:Object, observer(newVal, oldVal){ if(newVal.biasRotX != undefined){ this.biasRotX = newVal.biasRotX; this.biasRotY = newVal.biasRotY; } if(newVal.initRotX != undefined){ this.initRotX = newVal.initRotX; this.initRotY = newVal.initRotY; } if(newVal.biasX != undefined){ this.biasX = newVal.biasX; this.biasY = newVal.biasY; } }, }, reset: { type: Number, observer(newVal, oldVal) { //监听发生变化的reset后,执行重置逻辑 position.set(xrFrameSystem.Vector3.createFromNumber(0, 1.6, 1)); quaternionC.setFromYawRollPitch(0, 0, 0); quaternionP.setFromYawRollPitch(Math.PI, 0, 0); } } }, data: { loaded: false }, lifetimes: {}, methods: { handleReady({ detail }) { const xrScene = this.scene = detail.value; console.log('xr-scene', xrScene); xrFrameSystem = wx.getXrFrameSystem(); camera = xrScene.getElementById("camera"); player = xrScene.getElementById("player"); up = xrFrameSystem.Vector3.createFromNumber(0, 1, 0); left = xrFrameSystem.Vector3.createFromNumber(1, 0, 0); quaternionC = camera.getComponent(xrFrameSystem.Transform).quaternion; quaternionP = player.getComponent(xrFrameSystem.Transform).quaternion; position = player.getComponent(xrFrameSystem.Transform).position; quaternionPIni = new xrFrameSystem.Quaternion(); quaternionPIni.set(quaternionP); quaternionPRes = new xrFrameSystem.Quaternion(); quaternionPRes.set(quaternionP); quaternionPTemp = new xrFrameSystem.Quaternion(); quaternionPTemp.setFromYawRollPitch(0, 0, 0); quaternionCIni = new xrFrameSystem.Quaternion(); quaternionCIni.set(quaternionC); quaternionCRes = new xrFrameSystem.Quaternion(); quaternionCRes.set(quaternionC); this.biasRotX = 0; this.biasRotY = 0; this.initRotX = 0; this.initRotY = 0; this.biasX = 0; this.biasY = 0; initFinish = true; }, handleAssetsProgress: function ({ detail }) { console.log('assets progress', detail.value); }, handleAssetsLoaded: function ({ detail }) { console.log('assets loaded', detail.value); this.setData({ loaded: true }); }, handleTick: function (dt) { //确保handleReady时期的初始化完成 if (!initFinish) return; var deltaTime = dt.detail.value / 1000; //------摄像头旋转逻辑------// let rotX = (this.biasRotX - this.initRotX) / this.data.width * Math.PI; let rotY = (this.biasRotY - this.initRotY) / this.data.height * Math.PI; //水平方向旋转player node if (this.biasRotX == 0) { quaternionPIni.set(quaternionPTemp); quaternionPRes.set(quaternionPTemp); } else { quaternionPIni.multiply(xrFrameSystem.Quaternion.createFromAxisAngle(up, -rotX), quaternionPRes); } //垂直方向旋转camera node if (this.biasRotY == 0) { quaternionCIni.set(quaternionCRes); quaternionCRes.set(quaternionCRes); } else { quaternionCIni.multiply(xrFrameSystem.Quaternion.createFromAxisAngle(left, rotY), quaternionCRes); } quaternionPTemp.slerp(quaternionPRes, smoothSpeed * deltaTime, quaternionPTemp); quaternionC.slerp(quaternionPTemp.multiply(quaternionCRes), smoothSpeed * deltaTime, quaternionC); //------摄像头位移逻辑------// var x = this.biasX; var y = this.biasY; if (x || y) { var z = Math.sqrt(x * x + y * y); var ratio = z / 50; //此处除以50,因为摇杆盘半径为50 ratio = ratio > 1 ? 1 : ratio < 0 ? 0 : ratio; var temp = xrFrameSystem.Vector3.createFromNumber(-x / z, 0, -y / z); temp = temp.scale(ratio * speed * deltaTime); //位移需要根据旋转角度做转化, 这里需要取得camera的世界旋转矩阵 temp.applyQuaternion(camera.getComponent(xrFrameSystem.Transform).worldQuaternion); position.set(position.add(temp)); } }, } })