123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- 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));
- }
- },
- }
- })
|