一、关于 VisionKit
1、定义
2、版本
-
- V1平面接口,适用于用户在平面场景下,例如桌面,地面,泛平面场景,放置虚拟物体,不提供真实世界距离。用户放置物体时,手机相机倾斜向下对着目标平面点击即可,具有广泛的机型支持。
-
- V2平面接口,提供真实物理距离的 AR 定位功能,提供平面识别功能,用户在平面范围点击放置虚拟物体的功能,具有有限的支持机型。
3、能力
-
-
2D Marker,仅适用于平面类物体,用户上传一张平面物体的俯视图像作为目标物体,算法运行时识别该平面物品,并渲染出相关虚拟物体。2D Marker可以理解为特殊的3D Marker。3D Marker,相比于2D Marker,能够识别3D物体,不局限于平面物体,具有更广的使用范围,算法运行前,需要手动制作3D Marker的识别目标文件(.map文件),然后算法运行时载入该文件用于识别。
-
-
-
只使用一张待检测类别的图片,就能检测到输入图像中该类别的物体。适合标志性建筑、商品包装等具有平面图案的3D物体。不适用于检测人脸、动物、汽车等3D对象。允许识别图片与3D物体有视角差异或一定程度的外形差异。
-
-
-
提供了两种方式,静态图片检测和通过摄像头实时检测。可以输出人脸位置座标、106个关键点座标以及人脸在三维座标系中的旋转角度。
-
二、使用 VisionKit
1、VKSession(VisionKit 会话对象)
-
- 创建 VKSession 的实例:
wx.createVKSession
- 创建 VKSession 的实例:
const session = wx.createVKSession({
track: {
plane: {mode: 3},
},
version: 'v2',
})
-
- 启动 VKSession 实例:
start
方法
- 启动 VKSession 实例:
session.start(err => {
if (err) return console.error('VK error: ', err)
// do something
})
2、渲染
getVKFrame
方法可以获取到帧对象,帧对象包含了需要上屏的画面,然后将其用 WebGL 渲染出来。3、WebGL & three.js
4、放置 3D 模型
-
- 将 2D 座标转成 3D 世界座标,即 (x, y) 转成 (x, y, z),原点是相机打开瞬间其所在的点
-
- 参数:相对于画布视窗的座标,取值范围为 [0, 1],0 为左/上边缘,1 为右/下边缘
-
- 返回:一个矩阵,包含 3D 世界座标的位置、旋转和放缩信息
camera
属性拿到了帧相机,把帧相机拿到的视图矩阵、投影矩阵,都传给 three.js 的相机对象,以确保 three.js 的相机位置、角度正确。5、平面检测
三、官方demo解析
1、代码结构
2、实现逻辑
behaviors
实现代码共享,其中 yuvBehavior.js 主要包含 webGL 相关方法。主要代码逻辑如下(以水平面 AR 为例):