123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- Component({
- behaviors: [require('../common/share-behavior').default],
- properties: {
- throwing: {
- type: Boolean,
- value: false,
- observer: function(newVal, oldVal) {
- if (newVal !== oldVal) {
- if (newVal) this.startThrowing();
- else this.endThrowing();
- }
- }
- }
- },
- data: {
- showTarget: false
- },
- lifetimes: {},
- methods: {
- handleReady({detail}) {
- const xrScene = this.scene = detail.value;
- this.vQueueLength = 5;
- this.vQueue = [];
- this.vQueueHead = 0;
- },
- handleAssetsProgress: function({detail}) {
- console.log('assets progress', detail.value);
- },
- handleAssetsLoaded: function({detail}) {
- console.log('assets loaded', detail.value);
- this.setData({loaded: true});
- },
- handleARTrackerState({detail}) {
- // 事件的值即为`ARTracker`实例
- const tracker = detail.value;
- // 获取当前状态和错误信息
- const {state, errorMessage} = tracker;
- if (state == 2) {
- this.handleARDetected();
- }
- },
- handleARDetected() {
- this.scene.event.addOnce('touchstart', this.placeTarget.bind(this));
- },
- placeTarget() {
- this.scene.ar.placeHere("targetTransform");
- this.setData({
- showTarget: true
- });
- this.triggerEvent("ar_detected");
- },
- startThrowing() {
- if (!this.data.showTarget) return;
- this.makeBall();
- },
- endThrowing() {
- this.releaseBall();
- },
- makeBall() {
- const xr = wx.getXrFrameSystem();
- const el = this.scene.createElement(xr.XRMesh, {
- geometry: "sphere",
- scale: "0.1 0.1 0.1",
- "sphere-shape": "autoFit: true",
- rigidbody: "disabled: true",
- "shape-interact": "collide: true; bounciness: 0.5;"
- });
- const root = this.scene.getElementById("ballRoot");
- root.addChild(el);
- this.placeBall(el.getComponent("transform"));
- this.currentBall = el;
- },
- placeBall(transform) {
- const camera = this.scene.getElementById("camera");
- const cam_trans = camera.getComponent("transform");
- transform.position.set(cam_trans.position.add(cam_trans.worldForward.scale(-1)));
- },
- handleTick: function({detail}) {
- if (this.currentBall) {
- this.placeBall(this.currentBall.getComponent("transform"));
- this.recordPosition(detail);
- }
- },
- releaseBall() {
- if (!this.currentBall) return;
- this.currentBall.getComponent("rigidbody").setData({
- disabled: false
- });
- const r1 = this.vQueue[(this.vQueueHead - 1 + this.vQueueLength) % this.vQueueLength];
- const r2 = this.vQueue[this.vQueueHead];
- if (r1 && r2) {
- const vscale = 1.3; // 初始速度调节
- const v = r1[0].sub(r2[0]).scale(vscale * 1000 / (r1[1] - r2[1]));
- this.currentBall.getComponent("rigidbody").velocity = v;
- }
- this.currentBall = undefined;
- this.vQueue = [];
- this.vQueueHead = 0;
- },
- recordPosition() {
- const transform = this.currentBall.getComponent("transform");
- this.vQueue[this.vQueueHead] = [transform.position.clone(), Date.now()];
- this.vQueueHead = (this.vQueueHead + 1) % this.vQueueLength;
- }
- }
- })
|