Skip to content

ezxrCloudARWorld 算法插件

云定位-3DoF 算法是基于大空间云定位服务,通过相机画面识别场景并定位设备的观察位置,综合利用 3DoF(imu)算法,同步并更新渲染相机的位姿,实现手机与虚拟内容的交互的能力。

云定位-6DoF 算法是基于大空间云定位服务,通过相机画面识别场景并定位设备的观察位置,综合利用 6DoF 算法,同步并更新渲染相机的位姿,实现手机与虚拟内容的交互的能力。

插件申请和示例代码

为了快速对插件进行基础的了解和认识,请直接下载示例 Demo,使用微信小程序开发工具打开,修改 AppId 为已申请插件授权的 AppID,替换绑定了上述 AppID 的内容资源,然后在真机扫码预览效果。

  • 插件权限申请

    • 首先要在小程序管理后台的“设置-第三方服务-插件管理”中添加插件,通过 AppID** [wx5289d5cc5c5c77f9]** 查找插件并添加。
    • 或者在微信小程序开发者工具中,导入示例 Demo 以后,等开发工具提示需要插件权限时,点击『申请』
  • 内容资源替换

    • 第一步,在洞见 AR-World 小程序能力平台创建 6DoF 跟踪 - 大场景(视觉定位)内容
    • 第二步,参考接入示例接入
  • 示例 Demo

wx-ezxrcloudarworld-demo.zip

更新日志

20240625 v1.4.1
    新增定位平滑功能
20230814 v1.3.8
    优化视觉定位先验功能
20230714 v1.3.7
    增加算法启动和成功运行状态回调接口,优化 3DoF 相关
20230714 v1.3.6
    增加算法启动和成功运行状态回调接口
20230615 v1.3.5
    修复了云定位异常问题
20230612 v1.3.4
    修复一些已知问题
20230507 v1.3.2
    修复一些 bug
20230307 v1.3.0
    支持 unity 和 threejs Web 双编辑器  
    支持洞见 AR-World 小程序能力平台配置
    拍照功能

使用说明

3.1 插件申明

javascript
"plugins": {
    "ezxrARSession": {
        "version": "1.4.1",
        "provider": "wx5289d5cc5c5c77f9"
    }
},

3.2 提供方法

插件对外提供 ARSession 组件和 AREzxr 方法库。 如果需求中仅关注云定位/云识别状态,不需要相机的实时 pose,可以不处理虚拟相机 pose 数据。

【ARSession组件】

方法名称方法说明入参与返回最低支持版本
fnStart

算法启动

trackerType:跟踪类型,1-3dof,11-6dof;

locationType:定位类型,填3;

trackerOption:跟踪参数

renderer: 渲染引擎上下文

onStarted: 算法启动完成回调, >=1.3.6版

onRecogSuccess: 算法成功运行回调, >=1.3.6版本

locationOption:定位参数,有 isRecogOnce(是否只定位一次)

1.3.0

onStarted

onRecogSuccess

需要>=1.3.6版本

fnSetOnFirstLocated第一次定位成功回调返回:locType,result1.3.0
fnSetOnLocated定位回调返回:locType,result1.3.0
fnSetMotionChanged设置 motion 回调入参:function(res){}1.3.0

【AREzxr方法库】

方法名称方法说明入参与返回最低支持版本
checkARSupport查询是否支持 AR返回:arSupport, camFov1.3.0
fnGetTrackType查询当前设备使用的跟踪算法

返回:

1 : 3DoF 跟踪算法

11: 6DoF 跟踪算法 1

12: 6DoF 跟踪算法 2

1.3.0
fnWxRequestRes

获取内容平台配置

入参如下:

cid:内容平台 cid(同内容id)

key:内容平台环境,development(测试)/production(线上)

返回如下:

contentId:内容ID

contentName:内容名

contentPackageUrl:内容包资源链接

contentType:内容类别,2-6dof大场景;4-3dof大场景

algorithmType:3-3dof,4-6dof

editorType: 1-web 编辑器 2-unity 编辑器

mapInfo:{

mapResources:[

resourceType:7-geo, 10-nav

resourceUrl:对应地址

]

}

1.3.0
PoseUpdate获取 GL 坐标 pose算法更新。1.3.0

fnGetGlobalGLPose

获取 ezxrGL 坐标 pose

获取算法坐标。

返回:{ ezxrPose,pose,timestamp,spaceUncertainty,timeUncertainty}

1.3.0
fnTakephoto拍照返回:临时存储路径1.3.0

TIP

arSupport 为 false 时,该设备无法体验,应该交互上提示用户
6DoF 跟踪中,12 效果会好于 11,建议对于 11 的状态给予交互上的提示

3.3 接入示例

3.3.1 引用算法

javascript
const plugin = requirePlugin('ezxrARSession')
// 在page或component的json文件中添加
"usingComponents": {
    "ezxr-arsession": "plugin://ezxrARSession/ARSession",
}
// 在page或component的wxml文件中添加
<ezxr-arsession id="ezxr-arsession"></ezxr-arsession>

3.3.2 内容拉取和渲染引擎

插件 demo 内容渲染可选 threejs-miniprogram 或 易现自研渲染引擎(Insight) ;对应 threejs web 编辑器和 unity 编辑器。

如选择 threejs-miniprogram 渲染引擎,可在内容平台使用 Web 编辑器制作资源后发布。

如选择 Insight 渲染引擎,当前需要依赖易现内部创作工具进行资源导出,开发者可提供定制美术资源,易现进行导出后使用。

javascript
// 从洞见 AR-World 小程序能力平台拉取内容资源
this.ezxr = new plugin.AREzxr();
const response = await this.ezxr.fnWxRequestRes(7911, 'development');// 此处7911为创建内容的cid
// contentType 2-6dof大场景 4-3dof大场景
if (response.contentType === 2 || response.contentType === 4) {
    let rootPath;
    // editorType 1-web编辑器 2-unity编辑器
    if (response.editorType === 1) rootPath = '/threejs/pages/Entrance/index?';
    else if (response.editorType === 2) rootPath = '/Insight/pages/Entrance/index?';
    else return console.error('response with invalid editorType');

    wx.navigateTo({
        url: rootPath + 'contentPackageUrl=' + response.contentPackageUrl + '&algorithmType=' + response.algorithmType,
    });
} else {
    return console.error('response with invalid contentType');
}

// 跳转对应编辑器页面
onLoad: function (options) {
    this.data.isAndroid = wx.getSystemInfoSync().platform === 'android';
    // 内容资源
    if (options.contentPackageUrl) {
        this.setData({
            contentZipUrl: options.contentPackageUrl,
        });
    }
    else {
        console.error("Entrance with empty content url");
    }
    // 根据创建内容类型初始化算法类型
    if (options.algorithmType) {
        if(options.algorithmType == 3) {
            this.data.tracker = 1; // 3dof
        }  
        if(options.algorithmType == 4) {
            this.data.tracker = 11; // 6dof
        }     
    }
    else {
        console.error("Entrance with empty algorithmType");
    }
},

3.3.3 启动算法

要求先启动内容后再启动算法。

javascript
/**
 * 生命周期函数--监听页面初次渲染完成
 */
onReady: async function () {
    // 第一步:获取设备支持&获取内容配置
    this.ezxr = new plugin.AREzxr();
    const ins = await this.ezxr.checkARSupport();
    console.log('ARSupport', ins);
    if (ins.arSupport) {
        this.setData({
            camFov: ins.camFov, //需要传递给渲染引擎
        });
    } else {
        console.error('ar support is false');
        return;
    }

    // 第二步:启动内容
    this.setData({
        initContent: true, // 触发加载并渲染内容
    });
    const content = this.selectComponent('#ezxr-arcontent');
    this.arContentCpt = content;
},
/**
 * 内容加载完成回调
 */
onContentInited: async function (params) {
    // 第三步:启动算法
    this.setData({ initSession: true, });
    const session = this.selectComponent('#ezxr-arsession');
    this.arSessionCpt = session;
    console.log('arSessionCpt', plugin, this.arSessionCpt);

    //定位结果回调
    this.arSessionCpt.fnSetOnLocated(res => {
        console.log('location result: ', res);
    });
    //第一次定位成功回调
    this.arSessionCpt.fnSetOnFirstLocated(res => {
        console.log('location result first: ', res);
    });
    
    //如不需要,可不设置motion回调
    // this.arSessionCpt.fnSetMotionChanged(res => {
    //     console.log('motion changed: ', res);
    // });

    // 需要确保在渲染引擎初始化成功之后
    const renderer = this.arContentCpt.fnGetRenderer();
    // 算法启动回调, 此时背景画面渲染已开启;
    const onStarted = () => {   
        console.log("Tracker onStarted");
        this.setData({
            initLoading: false,
        });

        let tracktype = this.ezxr.fnGetTrackType();
        console.log('Entrance index current tracktype', tracktype);
    };
    // 算法初始化完成回调, 此时平面检测成功, 算法pose开始更新;
    const onRecogSuccess = () => {  
      console.log("Tracker onCompleted");
      this.setData({
          state: true
      });

      // 开启云定位
      this.ezxr.fnSetRequestLocStatus(true);  
    };

    this.trackerOption = {
        renderer: wcengine,
        onStarted: onStarted,
        onRecogSuccess: onRecogSuccess,
    };

    this.locationOption = {
        isRecogOnce: false,
    };
    
    await this.arSessionCpt.fnStart(
        this.data.tracker,    // =1或11,3dof为 1,6dof为 11。
        this.data.location,   // =3
        this.trackerOption,
        this.locationOption
    );
},

3.3.4 渲染更新

javascript
const plugin = requirePlugin('ezxrARSession');
this.arEzxr = new plugin.AREzxr();
// 更新算法pose
this.arEzxr.PoseUpdate();
const poseStatus = this.arEzxr.fnGetGlobalGLPose();//获取算法pose
if (!poseStatus) {
  console.warn("pose is null when updating cam pose");
  return;
}
this.contentCpt.fnSetCameraPose(poseStatus.ezxrPose);// unity 编辑器
this.contentCpt.fnSetCameraPose(poseStatus.pose);// web 编辑器

3.3.5 拍照

使用拍照组件 poster 组件,具体生成海报需求可自行在此组件修改,或者参考此组件实现。

组件引入和方法调用:

javascript
"ezxr-takephoto":"../../Components/poster/poster"

<ezxr-takephoto id="ezxr-takephoto" bind:takePhoto="takePhoto"></ezxr-takephoto>

takePhoto() {
    const ezxrTakePhotoCpt = this.selectComponent('#ezxr-takephoto');
    ezxrTakePhotoCpt.takePhoto(this.arContentCpt.arEzxr, this.arContentCpt);
},

生成海报大小可调:

3.4 注意事项

   使用算法插件页面不支持后台使用;如果中途跳转其他页面再次返回算法插件页面,内容显示将出现异常;