我的 AR 之路
我是苹果 API 搬运工,一个专心于 iOS 渠道 AR 开发的程序员,持续多年的 ARKit 神棍。一直以来,我都在盼望着苹果 AR 眼镜的发布,但 Vision Pro 发布后,却和我的预期产生了巨大误差。 不过,调整预期后奋起直追,一口气上架了两款 App:手指运动 FingerEmoji 和植物形状生成 PlantMatrix,还顺势开源了一个手势匹配的结构:HandVector。
Apple Vision Pro 带来的冲击
2023 年 WWDC,苹果宣告了 Apple Vision Pro ,遭到万众重视。但它却和我预想的不相同,我原本以为,苹果头显虽然外形与 Quest 3 不相同,但功用上实质是 Meta Quest 3 的 AR 增强版:把手机 ARKit 上的一切功用搬到头显上去,并供给更强壮的性能和更稳定的体验。
事实却是,Vision Pro 提出了 空间核算 概念,故意走了一条既不同于 Quest 3 又不同于手机 AR 的路:它侧重于交互体验与显现作用,假如单论 AR 功用 Vision Pro 还不如手机 ARKit 支撑功用多。
这样带来的成果就是:一般的 iPhone 和 iPad 版软件,只需稍加修正,就能够在 Vision Pro 上以兼容形式运行;可是一切用到 ARKit 的软件都必须从头设计与开发,才能在 Vision Pro 上运行,有些受限于隐私甚至压根无法运行(比方手机上使用相机画面的 AR App)。这些意料之外的变化让我措手不及,感觉多年尽力被套牢在手机上,难以滑润迁移到 Vision Pro 上。
缓过神来后,我认真分析了 Vision Pro 现在的优缺点: 长处:
- 高清晰低延迟的显现作用
- 简略好用的手眼交互
- 相对完善的操作逻辑,全体感觉更挨近一台电脑
缺点:
- 价格过高
- 使用不便,特别近视用户
- FOV 小,暗光条件下透视噪点多
- 没有手柄,难以精确进行 3D 输入,对游戏不行友好
- AR 功用敞开太少,不兼容手机 AR
- 全面使用 SwiftUI 和 Async/Await 结构,从头学习有必定成本
现在的诸多争议主要仍是从用户视点看来,很不便利,有些不值。然而从开发者的视点看,Vision Pro 的长处非常显着,有些仍是跨时代性比方手眼交互。而缺点中硬件相关的能够通过产品迭代来优化改善,软件相关能够通过 App 从头设计和 OS 生态迭代来改善。
我相信未来版别的 Vision Pro 会在以下方面进行软件、硬件改善:
- 下降价格或供给廉价款
- 自带屈光度矫正功用
- 优化透视作用,特别是暗光条件下
- 敞开更多 ARKit 功用,如 Face Tracking、 Object Tracking、Object Capture、RoomPlan 等
- 优化 3D 编辑器功用,增强 Reality Composer Pro 功用
转而开发 visionOS App 与手势匹配结构 HandVector
认真思考过后,感觉苹果提出的“空间核算”更有意义,不应该持续对手机 AR 产生路径依托。我决定花费时刻学习 SwiftUI 和 Async/Await 结构,为 Vision Pro 开发使用。
因为现已有多年的手机 ARKit 开发经验,我对 Swift + ARKit + RealityKit 都比较了解,可是 SwiftUI 和 Async/Await 结构给我带来了不少波折。这儿引荐下 Jane 的 ChaoCode 系列 SwiftUI 中文教程,内容较新,讲解细致,我以为是现在中文网络上最好的 SwiftUI 视频教程系列。
简略学习 SwiftUI 之后,我使用这些年积累下来的数学常识,制作了两款 App:手指运动 FingerEmoji 和植物形状生成 PlantMatrix,还开源了 FingerEmoji 使用的手势匹配结构:HandVector。
手势匹配原理:余弦类似度
在 Vision Pro 发布之初,很多人就在想象:是不是能够用手势来触发一些作用?比方像火影相同结印,触发特效。可是,visionOS 现在并没有自带这个功用,苹果的机器学习结构 CoreML 暂时也不支撑 3D 的手势匹配,所以现在无法在 Vision Pro 上使用。其它第三方的 ML 与 AI 结构理论上能完成 3D 手势匹配功用,但需要自己训练与布置,费时费力且往往运行效率不高。
那有没有其它办法能完成类似 ML 和 AI 的作用呢?这就需要有一些数学和几何常识:实际上 ML 和 AI 判断类似度也是依托一些数学算法来完成的,比方下面这些算法。 其间比较容易想到的就是 欧几里德间隔(欧氏间隔) 和 余弦类似度。因为每个人的手大小不同,再加上手指关节多,手势杂乱,单纯的核算关节间隔并不能很好的判断手势,所以在 单手 的情况下 余弦类似度 才是更适合的手势匹配算法。而余弦类似度的核算并不杂乱,它的数学实质就是向量的点乘:点乘的大小反映了两个向量有多“平行”,一般配合归一化(normalize)使用。 所以,咱们只需要事前“录制”一个手势,接下来将手部关节方位转化为 3D 向量,与录制好的手势向量进行点乘,得到的成果就是当前手势与录制好手势之间的类似度。
模拟器调试功用
考虑到很多用户没有 Vision Pro 真机或许不便利随时随地进行调试,我便想开发一套“假手”调试功用。恰好看到 VisionOS-SimHands 现已完成了类似功用,我便将其接入进来。 VisionOS-SimHands 的基本原理是:
- 在 Mac 上使用 Google MediaPipes 结构来进行 3D 手势辨认;
- 使用苹果 bonjour 网络服务,将辨认到的 3D 手势广播到 visionOS 模拟器中;
当然,因为 Google MediaPipes 的 3D 手势辨认到的关节点位与苹果 Vision Pro 不同,缺少了部分关节点,我使用已有关节方位对缺失数据进行补全,并添加了 z 轴位移,让全体表现与 VisionOS 原生辨认到的手势信息更加类似。
注意:这儿使用 Google MediaPipes 结构的 Web 版进行手势辨认,假如在 Mac 上
START HAND TRACKING
按钮一直是灰色无法点击,请查看你的网络。
未来计划
开发过 App 之后,我以为虽然 Vision Pro 不能像 iPhone 相同在消费市场高度遍及,但仍然代表了未来核算机交互的发展方向:3D 化信息显现与交互。我对改善后的 Vision Pro 下一代表明谨慎达观,也许一般消费者现在不支撑是正常现象,但开发者有必定时机。
下一步,我将围绕 HandVector 的功用,发明更多的 App,一起也将持续完善手势匹配功用。
Vision Pro 开发,我来了!