为什么要挖这个坑?一言难尽!就开发而言这对我是一个新的领域,一切自然源于今年WWDC的One more thing。有人疯狂吹捧,有人一顿猛踩。
没错,那就是祭出“空间计算”大旗的Vision Pro,那么空间计算是否是未来呢?我不知道,AR、VR、元宇宙的概念也不是今天才有的,子弹都快飞不动了。苹果作为软硬件一体的科技引领者发布了这样一个硬件,对市场显然是一注强心剂,它让大家看到了大宗消费市场的可能性以及软硬件趋向于成熟的预期。
visionOS已放出一月有余(当前需下载Xcode 15 beta),全球有6个实验室开放申请协助开发者调试基于 visionOS 的软件,中国的上海是其中之一(10月中又新增了纽约和悉尼)。同时在7月底苹果向全球开放了开发者套件的申请,对于申请到的公司保密要求不是一般的高。
显然这些都无法预示其成功。区块链、人工智能、虚拟/增强/混合现实等概念层出不穷,有人说是新瓶装旧酒,但开发者们能更深刻地理解机遇与挑战并存。那句“这是最好的时代,也是最坏的时代”似乎永远有效。
苹果于2017年发布ARKit,一路走来可以看出其布局不可谓不早,生态链十分完整。很多苹果开发者甚至连ARKit是什么都不知道,这也完全不影响他们的日常的工作。那么还有必要为一个可能是泡沫的东西投入时间吗?每个人有自己的答案。
笔者不是苹果开发者,Swift也是前几天看官方文档囫囵吞枣地学了一下,本来在未来个人项目APP开发的技术选型上我计划的也是Flutter,但我还是上车了…
visionOS空间计算实战开发教程
Vision Pro的发布日期预计在2024年年初,2023年6月开发者大会首次对外展示visionOS,后开放下载。这期间有热度,但受限于苹果的保密机制、技术生态的不完善以及有实力公司希望有的先发优势,市面上的教程凤毛麟角。目前热度最高的一位名叫Hattori Satoshi的日本人。所以我们先基于他的代码探索原生开发Vision Pro应用,读者可持续关注Awesome visionOS获取更多相关信息。
- Day 1:环境安装和编写第一个程序
- Day 2 使用RealityKit显示3D素材
- Day 4 初识ImmersiveSpace
- Day 5 纹理和材质
- Day 6 拖拽和点击
- Day 8 附属视图和动画
- Day 9 打造“任意门”
- Day 10 照片墙
- Day 11 标题动画
- Day 12 2D 地图
GitHub仓库:visionOS 30 days
visionOS 开发的技术框架
Accessibility辅助功能(高亮部分在visionOS中进行了增强)
Hand Tracking
Gestures
SwiftUI
对于非原生iOS 而言,在学习的过程中还是觉得欠缺了点原生开发的知识。众所周知iOS 可通过 ObjectiveC或Swift 进行开发。就 AR 领域而言,RealityKit 仅支持 SwiftUI,而新的头显设备 Vision Pro同样推荐使用 SwiftUI,市面上的书很多,Alan 选择了下面这本《SwiftUI for Masterminds》第4版(iOS 17):
- 第1章 – App开发
- 第2章 – Swift简介
- 第3章 – Swift范式
- 第4章 – 框架简介
- 第5章 – SwiftUI框架
- 第6章 – 声明式用户界面
- 第7章 – 列表
- 第8章 – 导航
- 第9章 – 异步和并发任务
- 第10章 – 存储
- 第11章 – 图像和动画
- 第12章 – 手势
- 第13章 – 地图视图
- 第14章 – 通知中心
- 第15章 – iCloud
- 第16章 – 框架集成
- 第17章 – Web
- 第18章 – 媒体
- 第19章 – 多平台应用
- 第20章 – 国际化
- 第21章 – App Store
相关文章
原计划
就技术路线而言,ARKit和ARCore是苹果和安卓两大阵营为增强现实而推出的框架,当然也不能不提到华为的AR Engine,这是原生路线。此外 Unity 和 Unreal 也针对原生也自己的封装,比如 Unity的 AR Foundation。虽然普遍认为Unreal Engine在炫酷层面优于Unity,但这次苹果新品是选择了 Unity 进行合作(坊间传闻是因为和 Unreal 之前存在诉讼所致,不排除这种可能,但Unity 似乎很早就与苹果生态就有着深度的合作),也就是尚处于内测阶段的PolySpatial。
不管怎样笔者也是处于初学阶段,第一本书是来自汪祥春的《ARKit原生开发入门精粹——RealityKit + Swift + SwiftUI》,当然也会适时地结合官方文档和其它英文资料。汪祥春的履历我不甚了解,他的书有一个系列,在这个领域当是有研究深度的,不过里面有些代码已经过时,我尽量在GitHub仓库里作出调整:https://github.com/alanhou/ARDemo。这里稍稍吐槽一下清华大学出版社,配套代码还要单独购买,就只有一个压缩包,又不做升级、勘误,不如很多人放到GitHub上来得有格局。
visionOS 常见问题
- Objective-C
仅支持 Shared Space下的窗口界面开发,无法实现3D体验的开发。 - 运动和身体的识别
Travel Mode支持在交通工具上的锚定,沉浸模式运动幅度超过1米会淡出,超过1米5的会自动转换为穿透效果,系统提供的手势之外需要 ARKit 去自行进行识别,也就是说这个只能在 Vision Pro真机上调试了。 - Roomplan和Object Capture
暂不支持 - 空间视频
格式要求:HEVC、MV-HEVC - ARKit
在VisionOS 与 iOS上是完全两套实现,但有一些共同的平面检测等API。 visionOS 中ARKit 的数据仅能在 ImmersiveSpace 是才能获取到。
常见问题
- ‘baseColor’ was deprecated in iOS 15.0: use
color
property instead‘tintColor’ was deprecated in iOS 15.0: use
color
property instead1234planeMaterial.baseColor = try .texture(.load(named: "Surface_DIFFUSE"))planeMaterial.tintColor = UIColor.yellow.withAlphaComponent(0.9999)# 修改为planeMaterial.color = try .init(tint: UIColor.yellow.withAlphaComponent(0.9999), texture: .init(.load(named: "Surface_DIFFUSE"))) - ‘Scene’ is ambiguous for type lookup in this context
123func addCollisions(scene: Scene) {# 修改为func addCollisions(scene: RealityKit.Scene) {
- Value of type ‘ARGeoTrackingStatus.StateReason’ has no member ‘description’
1geoTrackingStatus.stateReason.rawValue.description
- Failed to prepare device for development
检查 Xcode 与 iOS系统是否兼容,参见https://developer.apple.com/support/xcode/中的Minimum requirements and supported SDKs,按相应兼容版本进行调整,如下载更新或更早版本的 Xcode -
‘extent’ was deprecated in iOS 16.0
123planeAnchor.extent.x# 修改为planeAnchor.planeExtent.width -
‘hitTest(_:types:)’ was deprecated in iOS 14.0: Use [ARSCNView raycastQueryFromPoint:allowingTarget:alignment]
123456let hitTestResults = sceneView.hitTest(tapLocation, types: .existingPlaneUsingExtent)# 修改为guard let query = sceneView.raycastQuery(from: tapLocation, allowing: .existingPlaneInfinite, alignment: .any) else {return}let hitTestResults = sceneView.session.raycast(query) - Value of type ‘simd_float4x4’ has no member ‘translation’
123456extension float4x4 {var translation: SIMD3<Float>{let translation = columns.3return SIMD3(translation.x, translation.y, translation.z)}}
- Thread 1: Fatal error: UnsafeRawBufferPointer with negative count
检查NSPersistentContainer(name: “xxx”)中xxx的名称与所创建Core Data的名称是否相符 - macOS Visual Studio花括号换行问题
Preferences -> Source Code (in left menu) -> Code Formatting -> C# source code -> C# Format,点击Edit,下拉菜单中选择New Lines,取消New line options for braces下的所有勾选
LiDAR 支持机型:第4代iPad Pro和iPhone 12及以上高端机型
人脸识别支持机型:iPad Pro和iPhone X及以上