123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- Component({
- behaviors: [require('../common/share-behavior').default],
- properties: {
- },
- data: {
- loaded: false,
- arReady: false,
- },
- lifetimes: {
- detached() {
- wx.setKeepScreenOn({keepScreenOn: false});
- }
- },
- methods: {
- handleReady({detail}) {
- const xrScene = this.scene = detail.value;
- this.inRealWorld = true;
- console.log('xr-scene', xrScene);
- },
- handleAssetsProgress: function ({detail}) {
- console.log('assets progress', detail.value);
- },
- handleAssetsLoaded: function ({detail}) {
- console.log('assets loaded', detail.value);
- this.setData({loaded: true});
- this.scene.event.addOnce('touchstart', this.placeNode.bind(this));
- wx.showToast({title: '点击屏幕放置'});
- },
- handleTick() {
- if (!this.placed) {
- return;
- }
- const xrSystem = wx.getXrFrameSystem();
- const mainCamEl = this.scene.getElementById('main-camera');
- const magicCamEl = this.scene.getElementById('magic-camera');
- const mainTrs = mainCamEl.getComponent(xrSystem.Transform);
- const door = this.scene.getElementById('door').getComponent(xrSystem.Transform);
- let forward = door.worldForward;
- forward = xrSystem.Vector2.createFromNumber(forward.x, forward.z);
- let diff = mainTrs.worldPosition.sub(door.worldPosition);
- diff = xrSystem.Vector2.createFromNumber(diff.x, diff.z);
- const preDiff = this.diff || diff;
- this.diff = diff;
- const dis = diff.length();
- const preDis = preDiff.length();
- const dir = forward.dot(diff);
- //@todo: 等待物理加上碰撞检测,替换
- if (preDis <= 0.2 || dis > 0.2) {
- return;
- }
- if (this.inRealWorld && dir >= 0) {
- return;
- }
- if (!this.inRealWorld && dir <= 0) {
- return;
- }
- const mainCam = mainCamEl.getComponent(xrSystem.Camera);
- const magicCam = magicCamEl.getComponent(xrSystem.Camera);
- const doorMesh = this.scene.getElementById('door-mesh').getComponent(xrSystem.Mesh);
- const sceneMesh = this.scene.getElementById('scene-mesh').getComponent(xrSystem.GLTF);
- if (!this.inRealWorld) {
- // 现实世界
- // mainCam: ar -> stencil -> scene
- // magicCam: nothing
- this.inRealWorld = true;
- mainCam.setData({background: 'ar'});
- magicCam.setData({background: 'default'});
- magicCam.setData({isClearDepth: false});
- magicCam.clearBackgroundRenderStates();
- doorMesh.material.renderQueue = 1;
- doorMesh.material.setRenderState('cullFace', 2);
- sceneMesh.meshes.forEach(mesh => mesh.material.setRenderState('stencilComp', 3));
- } else {
- // 虚拟世界
- // mainCam: scene -> stencil
- // magicCam: ar
- this.inRealWorld = false;
- mainCam.setData({background: 'default'});
- magicCam.setData({background: 'ar'});
- magicCam.setData({isClearDepth: true});
- magicCam.setBackgroundRenderStates({
- stencilComp: 3,
- stencilRef: 1,
- stencilReadMask: 1
- });
- doorMesh.material.renderQueue = 9999;
- doorMesh.material.setRenderState('cullFace', 1);
- sceneMesh.meshes.forEach(mesh => mesh.material.setRenderState('stencilComp', 0));
- }
- },
- placeNode(event) {
- const {clientX, clientY} = event.touches[0];
- const {frameWidth: width, frameHeight: height} = this.scene;
- if (clientY / height > 0.8 && clientX / width > 0.8) {
- this.scene.getNodeById('setitem').visible = false;
- this.scene.ar.resetPlane();
- this.scene.event.addOnce('touchstart', this.placeNode.bind(this));
- } else {
- this.scene.ar.placeHere('setitem', true);
- this.scene.getElementById('anchor').getComponent(wx.getXrFrameSystem().Transform).setData({visible: false});
- this.placed = true;
- wx.setKeepScreenOn({keepScreenOn: true});
- }
- },
- }
- })
|