功能与设置¶
检查MegaTracker是否可用¶
开发者可调用插件提供的easyarPlugin.isMegaTrackerSupported()方法判断MegaTracker在当前运行环境下(机型,操作系统)是否可用。
返回 true:可用
返回 false:不可用,此时请参考微信 VK 适配机型列表: VK平面接口支持设备列表
一般来说,需要支持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时支持传入参数决定是否由外部控制传感器的生命周期
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,
});
});