功能与设置

检查MegaTracker是否可用

开发者可调用插件提供的easyarPlugin.isMegaTrackerSupported()方法判断MegaTracker在当前运行环境下(机型,操作系统)是否可用。

一般来说,需要支持VK V2平面AR接口的手机才能较好的支持Mega,只支持V1的手机效果会有大幅影响。

const easyarPlugin = requirePlugin("easyar-wechat-miniprogram") as easyar.EasyARWechatMiniprogramPlugin;
const res = easyarPlugin.isMegaTrackerSupported();

使用MegaLandmark服务

MegaTrackerConfigs中的apiType须传入MegaApiType.Landmark(默认为MegaApiType.Block)。

const mega: easyar.IMegaSystem = easyarPlugin.getMegaSystem();
const megaElement = scene.getElementById('easyar-mega');
const megaComponent = megaElement.getComponent("easyar-mega") as easyar.EasyARMegaComponent;

const apiKeyAccess = new mega.APIKeyAccessData(
    settings.MegaTrackerAppID,
    settings.MegaTrackerServerAddress,
    settings.EasyARAPIKey,
    settings.EasyARAPISecret
);
const megaTrackerConfigs: easyar.MegaTrackerConfigs = {
    access: apiKeyAccess,
    apiType: mega.MegaApiType.Landmark
};
const sessionConfigs: easyar.SessionConfigs = {
    megaTrackerConfigs: megaTrackerConfigs,
    licenseKey: settings.EasyARLicenseKey
};
session = megaComponent.createSession(sessionConfigs);

...
//当Token过期后通过landmarkFilter的updateToken更新
session.megaTracker.landmarkFilter.updateToken(newToken);

使用MegaLandmark服务前MegaTracker须使用LandmarkFilter进行筛选,支持通过SpotId或GPS两种方式筛选。

使用SpotId筛选:

async landmarkFilter() {
    const res = await session.megaTracker.landmarkFilter.filterBySpotId(settings.LandmarkSpotId);
    if (res.status != mega.MegaLandmarkFilterStatus.Found) {
        console.error(`LandmarkFilter Failed, status: ${mega.MegaLandmarkFilterStatus[res.status]}, exceptionInfo : ${res.exceptionInfo}`)
    }
}

使用GPS筛选:

async landmarkFilter() {
    const res = await session.megaTracker.landmarkFilter.filterByLocation();
    if (res.status != mega.MegaLandmarkFilterStatus.Found) {
        console.error(`LandmarkFilter Failed, status: ${mega.MegaLandmarkFilterStatus[res.status]}, exceptionInfo : ${res.exceptionInfo}`)
    }
}

备注

当filter的结果不为Found时,需要用户自行处理异常(比如Token过期须更新)。

配置GPS输入方式

现场测试

session.setGeoLocationInput("Onsite");

非现场测试

如果开发者不在现场,但希望在手机等移动设备上进行快速验证(例如与跟踪效果无关的流程开发),可以使用该方式。

提供模拟的GPS位置信息

session.setGeoLocationInput("Simulator", {longitude: 0.0, latitude: 0.0}); //更改为实际使用的GPS信息

不提供GPS位置信息

session.setGeoLocationInput("Simulator")

注意

对着视频或图片运行看到的效果与实际效果完全无关,请勿以对着视频或图片看到的效果判断定位或跟踪效果。

传感器控制选项

备注

若用户应用不会使用 GPS数据 或 加速度计数据 时则不用传该选项

EasyAR插件创建MegaTracker时支持传入参数决定是否由外部控制传感器的生命周期

MegaTrackerSensorOptions 参数说明

  • isAcceExternalControl: boolean 加速度计数据是否由外部控制,默认为false。

    传入true时,用户必须在 EasyARSession.start 前调用wx.startAccelerometer或相应开启加速度计监听接口。

    必须在 EasyARSession.stop 后才能调用wx.stopAccelerometer或相应停止加速度计监听接口。

  • isGeoExternalControl: boolean GPS数据是否由外部控制,默认为false。

    传入true时,用户必须在 EasyARSession.start 前调用wx.startLocationUpdate或相应开启GPS数据监听接口。

    必须在 EasyARSession.stop 后才能调用wx.stopLocationUpdate或相应停止GPS数据监听接口。

传入false时,用户在使用Mega服务期间都不能调用开关加速度计数据或GPS数据监听接口。

const megaElement = scene.getElementById('easyar-mega');
const megaComponent = megaElement.getComponent("easyar-mega") as easyar.EasyARMegaComponent;

const apiKeyAccess = new mega.APIKeyAccessData(
    settings.MegaTrackerAppID,
    settings.MegaTrackerServerAddress,
    settings.EasyARAPIKey,
    settings.EasyARAPISecret
);
const megaTrackerSensorOptions: easyar.MegaTrackerSensorOptions = {
    isAcceExternalControl: false,
    isGeoExternalControl: false
};
const megaTrackerConfigs: easyar.MegaTrackerConfigs = {
    access: apiKeyAccess,
    options: megaTrackerSensorOptions
};

session = megaComponent.createSession(megaTrackerConfigs);

使用旋转后的屏幕

需要在手机横屏模式下使用Mega功能时,首先需要确保微信小程序全局配置正确:

在app.json中添加window配置,具体定义见 微信小程序 响应显示区域变化

"window": {
    "pageOrientation": "landscape"
}

需要调用接口传入屏幕旋转的方向:

session.setDeviceOrientation(deviceOrientation);

DeviceOrientation的取值见 DeviceOrientation

微信小程序平面检测异常处理

在使用 VK 平面检测时,可能会出现检测结果异常或跟踪丢失的情况。

EasyAR 插件提供 setPlaneDetectionErrorBehavior 方法,用于注册异常处理回调。当检测到异常时,该回调会被触发,开发者可在其中实现自定义提示或其他处理逻辑。

session.setPlaneDetectionErrorBehavior(() => {
    wx.showToast({
        icon: 'none',
        title: `微信平面检测结果异常,请将相机对着平面来回移动以恢复跟踪`,
        duration: 2000,
    });
});