123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- let camera;
- let player;
- let xrFrameSystem;
- let speed = 5;
- let smoothSpeed = 8;
- let up;
- let left;
- let position;
- let quaternionP;
- let quaternionPIni;
- let quaternionPRes;
- let quaternionPTemp;
- let quaternionC;
- let quaternionCIni;
- let quaternionCRes;
- 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) {
-
- 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) {
-
- 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;
-
- if (this.biasRotX == 0) {
- quaternionPIni.set(quaternionPTemp);
- quaternionPRes.set(quaternionPTemp);
- } else {
- quaternionPIni.multiply(xrFrameSystem.Quaternion.createFromAxisAngle(up, -rotX), quaternionPRes);
- }
-
- 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;
- ratio = ratio > 1 ? 1 : ratio < 0 ? 0 : ratio;
- var temp = xrFrameSystem.Vector3.createFromNumber(-x / z, 0, -y / z);
- temp = temp.scale(ratio * speed * deltaTime);
-
- temp.applyQuaternion(camera.getComponent(xrFrameSystem.Transform).worldQuaternion);
- position.set(position.add(temp));
- }
- },
- }
- })
|