这一年我给 Vision Pro 开发了两款 App, 还开源了一个手势匹配框架

我的 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 开发,我来了!

相关推荐
Kenneth風车27 分钟前
【机器学习(五)】分类和回归任务-AdaBoost算法-Sentosa_DSML社区版
人工智能·算法·低代码·机器学习·数据分析
鸽芷咕35 分钟前
【Python报错已解决】python setup.py bdist_wheel did not run successfully.
开发语言·python·机器学习·bug
aWty_2 小时前
机器学习--卷积神经网络(包括python实现)
人工智能·机器学习·cnn
5pace2 小时前
机器学习(西瓜书)第 14 章 概率图模型
人工智能·机器学习
阿利同学3 小时前
热成像目标检测数据集
人工智能·目标检测·机器学习·目标跟踪·数据集·热成像目标检测数据集·机器学习 深度学习
AI完全体5 小时前
AI小项目4-用Pytorch从头实现Transformer(详细注解)
人工智能·pytorch·深度学习·机器学习·语言模型·transformer·注意力机制
Alluxio官方5 小时前
Alluxio Enterprise AI on K8s 部署教程
人工智能·机器学习·kubernetes
Alluxio官方5 小时前
Alluxio Enterprise AI on K8s FIO 测试教程
人工智能·机器学习
AI大模型知识分享5 小时前
Prompt最佳实践|指定输出的长度
人工智能·gpt·机器学习·语言模型·chatgpt·prompt·gpt-3
标贝科技6 小时前
ChatGPT对话训练数据采集渠道有哪些
数据库·人工智能·机器学习·chatgpt