Table of Contents

将 Mega 插件接入您的微信小程序

本文档将带您完成 Mega 插件在 xr-frame 小程序环境下的接入。

开始之前

  • 参考 xr-frame 开发指南xr-frame 官方样例学习如何使用微信官方提供的 XR-3D 引擎,内容包括:
    • 常规微信小程序页面中引入 xr-frame 组件的方式。
    • xr-frame 组件与小程序传统组件的通信方式。
    • 如何从场景中获取或创建一个元素并修改部分属性比如 Transform
    • 加载和释放资源,例如 GLTF 模型。

全局配置

在小程序根目录下的 app.json 全局配置文件中添加对 Mega 小程序插件的依赖,并将依赖加载改为按需注入

{
  "lazyCodeLoading": "requiredComponents",
  "plugins": {
    "easyar-wechat-miniprogram": {
      "version": "2.0.2", //使用最新的插件版本
      "provider": "wx27fa3b52b5462e8f" // Mega 小程序插件固定 id
    }
  }
}

加载插件

您可以通过插件接口引入插件,直接使用插件的部分方法以验证插件是否已经被正确加载。

例如使用通过微信提供的 requirePlugin(string path) 接口拿到 EasyARWechatMiniprogramPlugin 后,使用它的 isMegaTrackerSupported 方法判断设备是否支持。

//如果已经引入了 typings 文件
//const easyarPlugin: easyar.EasyARWechatMiniprogramPlugin = requirePlugin("easyar-wechat-miniprogram") as easyar.EasyARWechatMiniprogramPlugin;
const easyarPlugin = requirePlugin("easyar-wechat-miniprogram") as any;
//调用 isMegaTrackerSupported 判断当前设备是否支持,若不支持则弹窗提示
if (!easyarPlugin.isMegaTrackerSupported()) {
    const message = `当前设备不支持 VK v1 和 v2,请参考微信官方文档:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/visionkit/plane.html`;
    wx.showModal({
        title: "设备不支持",
        content: message,
        showCancel: false,
    });
    console.error(message);
    return;
}

这个例子中首先通过微信提供的 requirePlugin(string path) 接口拿到了 easyarPlugin 即插件暴露的接口对象,之后调用了其提供的 isMegaTrackerSupported 方法判断当前运行环境下是否可用。若不可用则弹窗提示。

引入类型

建议使用 Typescript 进行开发。

样例工程中的路径:/typings/types/easyar/lib.easyar.d.ts

拷贝到工程相同目录,并在 /typings/types/index.d.ts 中以三斜杠指令引用:

/// <reference path="./easyar/lib.easyar.d.ts" />

当需要使用类型对象时,可以通过 getMegaSystem 获取 EasyAR Mega 微信小程序插件的类型系统 IMegaSystem

const mega: easyar.IMegaSystem = easyarPlugin.getMegaSystem();

之后可以使用 IMegaSystem 中暴露的类型进行类型比较,例如可以用 state 比较与 mega.SessionState.Running 是否相等判断 session 是否初始化成功:

const newState: easyar.SessionState = event.detail.value;
if (newState === mega.SessionState.Running) {
    console.log("EasyAR Session initialized succeeded. Start running.");
}

xr-frame 场景搭建(WXML)

在页面的 WXML 文件中,xr-easyar-mega 组件必须作为 xr-scene 的子节点,并正确绑定相机与追踪器的 id ,若不填写 id 则组件会使用在场景中第一个查找到的 xr-cameraxr-ar-tracker 组件。

<xr-scene id="xr-scene" ar-system="modes:Plane; planeMode: 1" bind:ready="handleReady">
    <xr-easyar-mega
        id="easyar-mega"
        camera-id="xrCamera"
        ar-tracker-id="xrARTracker"
    ></xr-easyar-mega>
    <xr-node>
        <xr-ar-tracker id="xrARTracker" mode="Plane"></xr-ar-tracker>
        <xr-camera id="xrCamera" node-id="xrCamera" clear-color="0.925 0.925 0.925 1" background="ar" is-ar-camera></xr-camera>
    </xr-node>
    <xr-shadow id="shadow-root" node-id="xrShadow"></xr-shadow>
</xr-scene>
小心

ar-systemplaneMode 必须设置为 1

注册 Mega 插件的事件回调

<xr-easyar-mega
    id="easyar-mega"
    camera-id="xrCamera"
    ar-tracker-id="xrARTracker"
    bind:sessionStateChange="onSessionStateChange"
    bind:megaLocalizationResult="onMegaLocalizationResult"
    bind:postSessionUpdate="onPostSessionUpdate"
></xr-easyar-mega> 

在 WXML 中绑定 xr-frame Element 代理分发的事件,xr-frame 的事件分发机制请参考 xr-frame 事件机制

插件分发的事件有:

事件名称 参数类型 说明
SessionStateChange SessionState Session 状态改变时立即触发。参数为 Session 新的状态,用于处理 Session 初始化开始与成功的回调。
MegaLocalizationResult MegaLocalizationResult 收到 Mega 定位结果的渲染帧完成更新后触发。事件触发时,该渲染帧内所有受 EasyAR 控制的 Transform 变化已经完成。
PostSessionUpdate 无参数 Session 在该渲染帧完成更新后立即触发。此时该帧内所有受 EasyAR 控制的 Transform 变化已经完成。

AR Session

session 的创建,启动及销毁请见 AR Session 流程控制

通过 sessionStateChange 事件回调确认初始化是否成功。当状态变为 Running 时,即可认为 ARSession 已就绪。

在 WXML 中通过 bind:sessionStateChange="onSessionStateChange" 将 xr-frame 组件中的 onSessionStateChange() 函数注册为 sessionStateChange 事件的回调:

<xr-easyar-mega
    bind:sessionStateChange="onSessionStateChange"
></xr-easyar-mega>

在 xr-frame 组件中的回调函数 onSessionStateChange() 中将 session 状态与 SessionState 的各个枚举进行比较可判断 session 当前状态。

onSessionStateChange(event) {
    const newState: easyar.SessionState = event.detail.value;
    console.log(`EasyAR Session state changed to: ${mega.SessionState[newState]}`);
    let displayInfoStr: string = "";
    if (newState === mega.SessionState.None) {
        displayInfoStr = "EasyAR Session is inactive.";
    } else if (newState === mega.SessionState.Initializing) {
        displayInfoStr = "EasyAR Session is initializing...";
    } else if (newState === mega.SessionState.Running) {
        displayInfoStr = "EasyAR Session initialized succeeded. Start running.";
    }
    this.triggerEvent("sessionDisplayInfoEvent", displayInfoStr);
}

上述代码中,初始化完成后控制台应打印 "EasyAR Session initialized succeeded. Start running."

相关主题