module.exports = Behavior({ // 全局变量 session: undefined, // 全局的VKsession对象 canvas: undefined, // canvas // XRFrame相关变量 xrScene: undefined, // xr-frame 的场景 xrCamera: undefined, // xr-frame 的相机 xrFrameReady: undefined, // xr-frame初始化完毕 // WebGL相关 camera: undefined, // 主要相机 // ThreeJs 相关变量 gl: undefined, // 全局gl对象 THREE: undefined, // THREE 对象 // 全局 data data: { domWidth: 0, domHeight: 0, width: 0, // canvas大小 height: 0, // canvas大小 widthScale: 1, // canvas宽度缩放值 heightScale: 0.8, // canvas高度缩放值 cameraPosition: 0, // 相机朝向,默认后置摄像头 }, methods: { onReady() { // 获取canvas wx.createSelectorQuery() .select('#canvas') .node() .exec(res => { this.canvas = res[0].node // 运算画布大小 this.calcCanvasSize() // 页面自定义初始化 if (this.init) this.init() }) }, calcCanvasSize () { const info = wx.getSystemInfoSync() const pixelRatio = info.pixelRatio; const width = info.windowWidth * this.data.widthScale * pixelRatio; const height = info.windowHeight * this.data.heightScale * pixelRatio; // 存在 webgl Canvas的情况下,写入大小 if (this.canvas) { this.canvas.width = width; this.canvas.height = height; } console.log(`canvas size: width = ${width} , height = ${height}`) this.setData({ width: width, height: height, domWidth: info.windowWidth * this.data.widthScale, domHeight: info.windowHeight * this.data.heightScale, }); }, // 前后摄像头 switchCamera(){ if(this.session.config){ const config = this.session.config let cameraPosNext; if (this.data.cameraPosition === 0) { cameraPosNext = 1; } else { cameraPosNext = 0; } config.cameraPosition = cameraPosNext this.session.config = config this.setData({ cameraPosition: cameraPosNext }) } }, // 限帧逻辑 initLoop() { // 限制调用帧率,暂时去掉 let fps = 30 let fpsInterval = 1000 / fps let last = Date.now() const session = this.session; // 逐帧渲染 const onFrame = timestamp => { try { let now = Date.now() const mill = now - last // 经过了足够的时间 if (mill > fpsInterval) { last = now - (mill % fpsInterval); //校正当前时间 this.loop(); } } catch(e) { console.error(e); } session.requestAnimationFrame(onFrame) } session.requestAnimationFrame(onFrame) }, }, });