requestXRSession
从 基础库 1.10.3 开始支持。其中
'ar'
模式从 基础库 1.12.0 开始支持
百度小游戏提供了 XR 系列接口用于开发 AR 游戏,目前该接口支持平面检测模式'ar'
(基于 ARCore 和 ARKit),以及人脸模式 'du_face'
的 AR 效果。
swan.requestXRSession
用于申请创建一个指定模式的 XR 会话,一个小游戏中同时只能存在一个 Session,如果要创建新的,必须要把已有的通过 end
方法关闭。
1 | swan.requestXRSession(opts) |
参数值:
属性 | 类型 | 是否必填 | 描述 |
---|---|---|---|
opts | Object | 是 | 传入的对象参数 |
opts.mode | string | 是 | XR 的模式,支持传入 'du_face' ,'ar' ,如果传入其它模式或者不传入则会创建失败 |
opts.drawCameraBackground | boolean | 否 | 每一帧是否自动绘制相机的画面作为背景,默认为 true ,即绘制,可以选择 false 不绘制通过 getCameraVideo 获取相机对象自己管理绘制。 'ar' 模式不支持该参数 |
opts.success | function | 是 | 创建会话成功的回调,根据设置的模式传入 XRSession 或者 DuXRSessionFaceMode 对象 |
opts.fail | function | 否 | 创建会话失败的回调 |
opts.complete | function | 否 | 无论成功失败,接口调用完成的回调 |
返回值:
success
回调函数:
形如 function (xrSession) {...}
, 其中:
属性 | 类型 | 描述 | |
---|---|---|---|
xrSession | XRSession | DuXRSessionFaceMode | Session 对象 |
fail
回调函数:
形如 function (res) {...}
, 其中:
属性 | 类型 | 描述 |
---|---|---|
res | Object | 回调函数参数对象 |
res.errMsg | string | 报错信息 |
在碰到错误时,推荐通过弹窗的形式引导开发者是否重新进入 AR 模式,如果用户确定才去再次调用 reuqestXRSession.
errMsg
错误信息包括:
fail system permission denied
无系统相机权限fail app permission denied
无小游戏相机权限fail session already exists
已经存在一个运行中的 XRSessionfail network error
网络错误,网络错误在'du_face'
等需要网络下发模型的模式中可能会出现fail unknown mode
不支持的 XR 模式fail unknown error
未知错误fail device not supported
设备不支持当前指定的模式
complete
回调函数:
当接口调用成功时,其返回值与 success
回调函数的返回值相同;
当接口调用失败时,其返回值与 fail
回调函数的返回值相同。
几种模式介绍:
'ar'
当 swan.requestXRSession
中的 mode
参数设置成 'ar'
时,小游戏会使用基于 ARCore(Android) 和 ARkit(iOS)的平面检测模式的 XR 会话。该模式会调起后置摄像头,检测画面中的平面用于放置三维渲染的虚拟物体,实现虚拟融合的游戏效果。该模式下拥有的特性包括:
- 相机追踪,得到相机的视图变换(View Trasnform)矩阵和投影变换(Projection)矩阵
- 获取实时检测的特征点点云
- 相机画面中的平面检测和追踪
- 锚点创建
- 环境光强度估计
基于这些特性你可以将游戏中虚拟的三维物体和相机中的真实画面融合,让用户获得更沉浸式的游戏体验。
'du_face'
当 swan.requestXRSession
中的 mode
参数设置成 'du_face'
时,小游戏会使用人脸检测模式的 XR 会话。该模式会调起前置摄像头,并且负责每一帧前置摄像头画面中的人脸的实时检测,追踪和数据的计算。该模式下拥有的特性包括:
- 单人脸的实时追踪,人脸姿态的计算
- 人脸特征点识别
- 面部骨骼矩阵的计算
- 面部五官表情系数的计算
- 相机画面的输出
基于这些基础的特性你可以在游戏中使用诸如美颜、美妆、贴纸等效果并且拥有跟 Native 匹配的性能。也可以利用表情系数设计一些基于表情相似度,表情触发的游戏机制。
使用示例:
- 创建人脸 AR 的会话并且每一帧绘制检测到的人脸特征点。
1 | const ctx = swan.createCanvas().getContext('2d'); |
- 在创建会话的时候,需要小心处理相机的权限(包括系统的和小游戏的),下面代码演示了该怎么完备得去处理这些权限问题。
1 | swan.requestXRSession({ |