XR 基地是一个专心于凝集 XR 的发明者社区,咱们的目标是 让 XR 开发变得更简略!
本文 首发于 XR 基地官网 和 XR 基地公众号。
作者:东坡肘子,XR 基地成员,iOS 开发者,技能博主
AR,一种让科技与实际国际融为一体的美妙魔法,正在悄然改变咱们与国际互动的办法。它让虚拟国际跃入实在日子,让数字信息与物理国际无缝衔接。
AR 带来全新的体会,激发人们的想象力,重塑人与环境信息交互办法,开拓人类与国际新的维度。作为拓宽人类实际体会极限的产品,AR 跟着科技发展正在与人们日常日子深度交融,人们得以在 AR 的加持下探究实际与虚拟之间的新的或许。
本文将带领读者探究苹果的 AR 生态与东西,开始了解怎么运用苹果 AR 东西构建 AR 体会。咱们将一睹 AR 在苹果生态中的强壮体现。
在最近举行的 WWDC 2023 大会上,苹果发布了全新头显产品 Apple Vision Pro,并大大进步了开发者在该设备上开发增强实际运用的体会。虽然咱们现在还无法依据 Apple Vision Pro 的实在设备进行开发,但关于 AR 技能和基本开发流程的中心概念并没有发生变化。阅览本文,能够让你在 iOS 平台上率先领会苹果的 AR 生态,这有益于你日后转入 Apple Vision Pro 的开发。
AR 的演变之路
增强实际(Augmented Reality,简称 AR),是指透过摄影机印象的方位及视点精算并加上图画剖析技能,让屏幕上的虚拟国际能够与实际国际场景进行结合与交互的技能 – 维基百科
同许多新式技能一样,AR 的构思也源自科幻小说。1901 年,美国作家莱曼弗兰克鲍姆在小说《The Master Key》中描绘了这样一个场景:一个叫罗伯特的小男孩偶尔触碰到了“电之万能钥匙”, 并得到三件礼物,其中一件是一副神奇的眼镜。戴上眼镜后,他看到人们额头上出现了用于表明性情的符号。这个场景与今日 AR 的界说千篇一律:辨认印象中的物体, 并在实际中叠加信息。
在 1992 年,美国波音研究员 T.P Caudell 和搭档首次提出了“Augmented Reality”这个术语。在他们的论文《Augmented Reality: An Application of Heads-Up Display Technology to Manual Manufacturing Processes》中,运用了“增强实际”一词来描绘将计算机生成的元素投射在实在国际之上的技能。这也是人类历史上第一次有人提出 AR 的概念。
该论文论述了怎么利用头戴显现设备将增强实际技能运用于制造业中的手工流程。这使得操作员能够得到计算机生成的附加信息,然后进步作业效率与质量。
1997 年,美国北卡罗莱纳大学的 Ronald Azuma 教授宣布了篇论文《A Survey of Augmented Reality,第一次给出了人们公认的 AR 技能界说。这个界说提出了 AR 的三大特征:虚拟国际和实际国际的结合、实时互动、依据三维定位。这个界说不只清晰地描绘出 AR 技能的发展蓝图,也为 AR 技能长时间稳定发展奠定了根底。
不过,因为种种约束,AR 技能当时还远远称不上干流,普通人不只碰都没碰过,名字都或许没听说过。1999 年,奈良先端科学技能大学院大学的加藤博一开发的 AR Toolkit 项目让 AR 技能总算出了实验室的囚笼,给普通人第一次亲自体会 AR 运用的时机。
AR Toolkit 项目利用二维符号完结虚拟物体与实际物体的实时盯梢和叠加。AR Toolkit 项目的出现为 AR 技能翻开了大门,让 AR 理论变成实际。它让 AR 技能得以快速提速,极大推广了 AR 理念,为 AR 技能终究进入人们日子,打下根底。
但是,真正让大多数人了解和知道 AR 技能的,是由任天堂公司授权、Niantic Labs 公司开发和运营的 AR 手游《Pokmon GO》,于 2016 年面世。该游戏让全球用户领会了 AR 技能所带来的共同魅力。
《Pokmon GO》是一款让玩家在实际国际中探究、捕捉、战役和交流宝可梦的游戏。玩家能够经过智能手机在实际国际中发现精灵,进行抓捕和战役。玩家抓到的精灵越多,就会变得越强壮,更有时机抓到更强壮、更稀有的精灵。该游戏一经发布,就成为了风景无限的现象级 AR 手游。商场研究公司 App Annie 发布的数据显现,《Pokmon GO》仅在 63 天内就经过 iOS 和 Google Play 运用商铺在全球赚取了 5 亿美元,成为史上赚钱速度最快的手游之一。或许是受了《Pokmon GO》成功的影响,次年,苹果正式迈入了 AR 领域。
2017 年能够说是 Apple AR 的“元年”。在这一年的 WWDC 上,Apple 发布了 ARKit 结构,以协助开发者在 Apple 生态下进行 AR 运用的开发。发布之初,ARKit 供给了能够辨认平面以及盯梢设备移动状况的才干。这两项才干是依据计算机视觉结构 Vision 对摄像头数据和 iOS 设备的陀螺仪传感器完结的。虽然根底,但这两个功用现已为 AR 运用的开发打了坚实的根底。
此外,iPhone X 搭载的原深感摄像头为人脸辨认技能供给了硬件支撑。依据此,ARKit 能够准确辨认面部表情,不只能够辨认用户的面容,还能够将用户的表情精密地对应到面部三维模型上。
2018 年,Apple 在原有 QuickLook 的根底上推出了 AR QuickLook。用户现在能够经过体系内置的文件运用程序以 AR 的办法预览三维模型。此外,ARKit 也得到了进一步地增强,增加了追寻辨认实际国际中的图片和三维物体的功用。用户乃至能够在扫描实际国际时对其进行“截图”,然后在具有反射作用的三维物体上反映出来。
2019 年,Apple 发布了专门用于 AR 场景的烘托引擎 RealityKit,以及与之配套的发明东西 Reality Composer。经过运用 Reality Composer,即便你不明白开发,也能轻松地构建一个比较完好的 AR 场景。不管你运用 Mac、iPad 仍是 iPhone,都能够运用 Reality Composer 来完结场景的构建作业。
在 2020 年之前,开发者假如想将三维模型转换成 RealityKit 或许 SceneKit 支撑的 USDZ 格局,只能运用一个命令行东西——USDZ Converter。但是,在某些需求对模型进行精密调整的场景下,这种办法并不太方便。因而,Apple 在 2020 年推出了 Reality Converter,填补了在发明者东西方面的一个空白。
2021 年,Apple 在 RealityKit 中供给了 Object Capture 的 API,使开发者能够经过摄影物体直接生成高质量的三维模型。
2022 年,Apple 推出了 RoomPlan 结构。该结构答应开发者运用装备了 LiDAR 的设备对房子进行建模。
经过不断的尽力和投入,加之具有大量的硬件设备数量优势,苹果现已成为了当今 AR 领域的领导者。
究竟是以什么样的技能原理作为支撑,才干完结 AR 的神奇作用呢?
AR 是怎么作业的呢?
从作业原理来讲,AR 大致分为两类。
第一类是经过计算机视觉技能扫描和理解周围环境的 AR,这种专业点叫 Vision Based AR。它经过摄像头和传感器来扫描你周围的环境。
Vision Based AR 分为依据符号的 AR(Marker-based AR) 和无符号的 AR(Marker-less AR) 两种。Marker-based AR 完结简略,实际感稍微差点,显现内容也受那些小符号的约束。比如之前展示的那个初音未来的视频,它便是依据 Marker-based AR 的原理完结的。另一种 Marker-less AR 需求计算机视觉和机器学习技能的支撑,它会建立一个超级详细的三维环境模型,然后依据这个模型进行定位、盯梢和显现内容。比较而言,Marker-less AR 能够到达更高的实际感,显现内容也愈加精密。
第二类 AR 是依据方位服务的 AR(Location Based Service Based AR),简称 LBS Based AR。它经过 GPS 和攻略针获取你的方位和方向,得以完结定位、盯梢和显现内容。LBS Based AR 不需求环境模型或符号,直接依据设备方位显现内容,开发难度最小,但实际感也最差,显现的内容不能与实在环境高度匹配。像现象级手游《Pokmon GO》便是 LBS Based AR 的代表。
近年来,跟着一些大公司不断丰富街景数据,现在在某些地区仅依靠方位信息便能够准确地将虚拟物体与周围环境相匹配,这种技能被称作 VPS(Virtual Position System),例如 Google Maps Platform 中的 Geospatial 相关技能。
比较而言,Vision Based AR 完结更精密,能够到达更高的实际感,但开发难度也更大。而 LBS Based AR 更简略,实际感略差,但开发难度更小。这两种 AR 办法各有优势,也可相互交融,发挥各自的长处。比如用 LBS Based AR 确定大致方位和方向,再用 Vision Based AR 准确扫描环境并显现内容,如此可扬长避短,完结高性能的 AR 体系。
不管选用哪种原理的 AR 办法,苹果都为开发者供给了简略而成熟的解决计划。开发者只需求专心于 AR 的运用构思,挑选适当的 AR 办法及东西,便可轻松将 AR 体会带给终究用户,而无需忧虑杂乱的底层技能完结。苹果让 AR 开发变得如此简略,使得开发者能够自如地发明 AR 运用。
5 分钟快速体会 AR 的魅力
在之前的内容中,咱们经过文字、图片和印象向你介绍了 AR。但只要当你亲自体会 AR 的法力后,才会真正感触到 AR 的魅力,其震慑远超过任何言语所能描绘。让咱们一起来看看 AR QuickLook 这个技能结构,怎么为咱们带来 AR 的震慑体会。
QuickLook 是一个结构,可用于 iOS、macOS 和 iPadOS。任何集成了这个结构的运用程序都能够快速检查许多常见的文件类型,比如 PDF、TXT、Pages 等。许多 Apple 的第一方运用程序,例如邮件、备忘录、文件和信息,都内置了 QuickLook。这意味着假如某个文件格局得到 QuickLook 的支撑,便能够在很多的苹果设备上被快速预览。
2018 年,苹果为 QuickLook 增加了对 USDZ、Reality 等 AR 文件类型的支撑。只需有一台 iOS 12+ 的苹果设备,就能够马上体会 AR 的魅力。
如今,QuickLook 不再仅仅是一个浏览文档或图片的东西。它现现已历了一次蜕变。支撑 AR 内容的 QuickLook 迈进了一个全新的维度,因而咱们将其称为“AR QuickLook”。经过 AR QuickLook,咱们能够在实际环境中天然地检查和体会各种 AR 场景和作用,这是体会 AR 的最佳途径。
在身边找一台符合要求的设备( iPhone、iPad ),用 Safari 拜访这个网址 :developer.apple.com/augmented-r…
你会看到有许多在右上角有一个小立方体标识的 3D 模型,挑选其中的一个( 完好的演示作用可看下方视频 )。
假如在 macOS 上拜访该网址,3D 模型的右上方不会有小立方体的标识( 表明无法启用 AR QuikckLook ),点击后只能获得该模型的 3D 文件( USDZ 格局 )。
点击任何 3D 模型,Safari 浏览器会发动 AR QuickLook 并加载该模型。一旦体系检测到适合的平面,AR QuickLook 会主动将 3D 模型放置在对应平面上。这种无缝体会令人满意,3D 模型在实在环境中也显得十分天然,几乎太神奇了!
现在,咱们将注意力转移到 AR QuickLook 的交互界面。在界面中心有一个切换按钮,上面别离写着“AR”和“目标”, 它们别离代表什么呢?
实际上,AR QuickLook 供给了两种办法来展示 3D 模型。 “AR 办法” 将虚拟物品放置在实在环境中,让用户直观地感触虚拟物品在实在国际中的作用。 “目标办法” 更侧重于 3D 模型本身,方便用户检查模型细节。这种切换机制答运用户灵活地在两种办法间转换,以满意不同的浏览与体会需求,一起也增强了 AR QuickLook 的易用性和趣味性。
不管是哪种办法,运用者都能够轻松地进行一些基本操作。下面是一些常见的操作:
-
定位:经过点击(tap)、按住(hold)和拖动(drag)的手势,咱们能够轻松定位 3D 模型的方位,然后将模型放在咱们想要展示的地方。而且 AR QuickLook 能够辨认出水平面和笔直面,这也让模型的摆放愈加天然。
-
缩放:用捏合(pinch-in)或拉伸(pinch-out)手势将 3D 模型放大或缩小。另外一个与缩放相关的操作是双击,经过双击 3D 模型会将其比例重置为 100%。
-
旋转:经过将两根手指放在屏幕上,并以圆周运动的办法移动它们来旋转 3D 模型。相同,双击手势将重置旋转。
-
悬浮:用两根手指向上拖动 3D 模型,你会惊讶地发现,它似乎摆脱了地心引力的束缚!
-
摄影/录像:快速点击屏幕上的快门按钮能够进行摄影,而长按快门按钮会触发录像功用(一旦松手,录像将会中止)。
现在你现已掌握了 AR QuickLook 的基本操作,那就多花点时间仔细地把玩一下网页里的不同模型吧!
不要沉迷于其中,记住过会儿回来继续阅览哦!
不知道你在方才的把玩中是否注意到如下细节:
-
3D 模型在起居室这样的日常环境中摆放,与周围的寻常家具别无二致,能够天然融入。
-
3D 模型能够呈现出天然的阴影,好像实在物体一般。
-
若有人从模型的前方或后方经过,会生成准确的遮挡作用,让人感觉与 3D 模型真的共处于同一个空间。
一切这些,都需求依靠精巧的算法以及软硬件之间完美的合作才干完结,好在苹果已帮咱们做好了一切。AR QuickLook 让咱们得以亲眼目睹虚拟国际与实际国际的完美交融,这正是 AR 的魅力所在。假如方才没有注意到上述细节,能够再体会一次,信任一定会有全新的领会。
假如你有自己的 3D 模型需求经过 AR QuickLook 检查,能够运用苹果供给的 Reality Converter 东西将 3D 模型转换成 USDZ 格局。这样,AR QuickLook 就能够直接辨认和显现你的模型了。
AR QuickLook 让咱们体会到 AR 的无限或许。但假如想构建属于自己的 AR 场景或作用,又该从何处着手呢?别忧虑,苹果也在此方面也为咱们供给了解决计划。经过 Reality Composer,你能够轻松创立自界说的 AR 场景与作用,而无需编写任何代码。
无需编程,你也能创立 AR 场景
直到几年前,发明沉浸式的 AR 体会仍是一项相当困难的使命。AR 开发人员需求大量的技能,以及对各种技能的广泛了解,才干使一个小立方体出现在 AR 中。当苹果公司发布 Reality Composer 时,一切都改变了。
Reality Composer 是 Apple 在 2019 年 WWDC 上发布的一款可视化修改东西,能够协助人们在 Mac、iPhone 和 iPad 上创立、测试和优化 AR 体会。无需任何编程知识或 3D 开发相关的布景,就能够完结自己的 AR 发明。
你能够在 App Store 中直接下载 Reality Composer,包含 iPhone 和 iPad 版别。下图展示了 Reality Composer 在 iPad 上的运转状况。
在 macOS 上,Reality Composer 是集成在 Xcode 中的。只需你装置好 Xcode,就能够在 Spotlight 中搜索并直接翻开它。
由于短少后置摄像头,Mac 版别的 Reality Composer 短少一个 AR 办法,无法直接进入 AR 状况预览,需求将项目经过共享或转存的办法传递给 iPhone 或 iPad 才干看到终究的作用。你能够依据个人状况挑选运用哪个版别的 Reality Composer 进行学习。下图显现了 Reality Composer 在 Mac 上的运转状况。
在新建 Reality Composer 项目时,运用会要求咱们为第一个场景挑选锚定类型(Anchor)。
不同的锚定类型别离对应着不同的 AR 算法以及设备上的不同镜头,一个场景只能挑选一种锚定类型。
- 水平
水平锚定是创立新文档或场景的默认选项。通常用于要将 3D 目标放置在桌子、地板或其他平面上的场景。当你为场景挑选水平锚定时,Reality Composer 会显现一个攻略网格,以代表这便是将放置你的场景的实在国际表面。
- 笔直
用于需求将物体放置在墙面、柱子或其他竖直表面上的场景。挑选此锚定类型后,Reality Composer 会显现一个笔直网格。
咱们运用 AR QuickLook 预览 苹果 AR 网站 上的 3D 模型时,大多选用水平或笔直锚定类型。
- 图画
图画锚定能够让你把 AR 场景放置在实际国际中的二维图画上(或附近),比如海报、绘画或许照片。当你挑选这种锚定类型时,Reality Composer 会显现一个白色的方形攻略,用以表明检测到的实际国际中的图画,以便你把要放置的内容放在其附近。
你还记住之前展示的经过 AR ToolKit 生成的跳舞初音吗?那便是选用了这种锚定类型。
- 面孔
面孔类型答应你将内容放置在检测到的人脸上或附近。挑选此锚定类型时,Reality Composer 将显现一个 3D 人脸来代替 ARKit 检测到的实在国际中的人脸。
在 ARKit 中,运用面孔锚定类型需求具有 TrueDepth 前置摄像头的设备。只需你的设备支撑 Face ID,就能够运用该锚定类型。
- 目标
运用这种锚定类型,你能够将场景放置在一个物体的扫描版别上或附近。当 ARKit 在实际国际中检测到对应的实在物体后,场景中的内容将依据它们相关于代替物的方位而放置。比如,你能够运用苹果供给的 3D 扫描运用 获取某个类型车辆的扫描数据。当 AR 运用在实际国际中检测到该类型车辆时,便能够在它的周围增加各种信息。
Reality Composer 供给的几种锚定办法涵盖了大部分干流的 Vision Based AR 类型,能够满意大多数 AR 场景的开发需求。
信任许多读者都曾经看过或运用过抖音(或其他相似产品)供给的为面部增加特效的功用。接下来,咱们将运用 Reality Composer 来完结此功用,并在此过程中进一步了解 Reality Composer。
首要,在新项目中挑选“面孔”锚定类型创立一个场景,然后将项目命名为 GoldenEye。
点击上方的“场景”按钮,为场景命名为“Eyes”。
虽然从外观上看,Reality Composer 与许多三维修改软件相似,但实际上它更像是一个用于修改 AR 场景的 PowerPoint。而且在两者之间能够找到许多相似的概念。
此刻,你能够将场景视为 PowerPoint 中的一页,场景运用的锚定类型即为页面中对应的模板。接下来,咱们将为此场景增加一些想要显现的内容。
点击上方的增加( + )按钮,在列表中挑选球体。
你能够经过鼠标或手势对球体进行缩放并放置到右眼附近,或许在右侧的属性栏中为球体设置详细的方位和尺度信息。别忘了给球体命名为 “Eye_R”。
在选中球体(Eye_R)时,切换到原料栏并挑选黄金原料。
用相同的办法创立左眼对应的球体,并命名为“Eye_L”。
祝贺你!你现已运用 Reality Composer 成功创立了第一个 AR 场景。
假如你是在具有 Face ID 功用的 iPhone 或 iPad Pro 上创立的该场景,只需点击上方的 “AR” 按钮,即可立刻检查作用。假如是在 Mac 上创立的,则需求点击上方东西栏中的“发送到”按钮,将其发送至符合条件的设备上(已装置 Reality Composer),即可进行预览。
当从 Mac 发送到 iPhone 或 iPad 时,需求首要在设备上运转 Reality Composer。
出人意料的容易!是吧。
现在咱们能够为 AR 场景增加一些互动才干,让体会愈加有趣。
与 PowerPoint 中运用者能够为页面中的物体(文字、图片)增加 Action 一样,咱们也能够用相似的操作,为场景中的物体增加“行为”。
点击东西栏中的“行为”按钮,在下方的行为面板中,增加“轻点与播映声响”。
请将新增的行为命名为“Play Sound”。在“触发”栏中,点击“挑选”按钮,选中两个金色的球体。在“播映声响”栏中,点击“挑选”按钮,相同将两个球体设置为受影响的目标。终究挑选你喜爱的音频片段。
点击上方东西栏中的“播映”按钮后,挑选任意金色球体,体系立刻会播映选定的音频片段。
切换到 AR 办法( 在 iPhone、iPad 上点击 AR 按钮 )并点击“播映”按钮,你能够在设备屏幕上重复此操作,让 AR 场景具有交互性。这样,运用者就能够在实际印象中与增加的虚拟物体进行互动。
假如在 iPhone 或 iPad 上无法听到声响,很或许是因为挑选了当时尚未下载的音频资料。你能够在设备上的声响列表中点击“☁️”下载资料,或许替换成设备上现已下载的音频。
当然,Reality Composer 的功用远不止于此。咱们能够给物体增加物理行为,让不同的物体之间进行联动交互,创立多个选用不同锚定类型的场景,导入其他的 3D 模型(USDZ)。在大多数状况下,Reality Composer 都能很好地将构思转换成 AR 场景。
现在,你能够将制作好的项目文件(rcproject 文件)共享给其他具有 iPhone 或 iPad 的小伙伴,与他们共同体会 AR 的趣味,并展示你的构思。
用代码与 AR 场景交互,创立独立的运用
跟着你对 Reality Composer 的了解加深,或许会发现它供给的功用无法完全满意你不断出现的构思构思。此外,你或许还期望经过 App Store 将你精心打造的 AR 场景共享给更多人,或将 AR 功用增加到其他运用程序中。那么咱们该怎么完结这些目标呢?
咱们运用 Reality Composer 创立的项目文件,不只能够在不同的设备上经过 Reality Composer 进行预览,还能够将其集成到运用程序项目中并作为一种资源运用。
这种做法在苹果生态的开发中十分遍及,比如运用 Scene Editor 创立 3D 场景、Sprite Editor 创立 2D 游戏关卡,或许运用 Data Model Editor 界说 Core Data 数据模型等等。终究,这些文件都会被集成到运用的开发项目中。Xcode 会依据文件的内容主动生成对应的代码,这样咱们就能够在项目的其他代码中直接拜访这些资源和目标了。
在接下来的两个章节中,需求装置 Xcode 而且具有开发者账户才干完好地体会到终究的开发作用。但是即便你现在尚未具有这些条件,我也鼓舞你继续阅览。我将用十分简略的例子和言语,让你对开发流程有个了解。
首要,在 Xcode 中创立一个名为 AR_Demo 的增强实际运用程序项目。这样,Xcode 会为咱们生成相应的模板,以简化开发难度。
运用默认的项目装备,Interface 挑选 SwiftUI,Content Technology 挑选 RealityKit。
项目结构如下:
其中,ContentView 包含视图界说、AR 场景加载等代码,是咱们之后重点重视的部分。
Experience 则是模版主动为咱们生成的一个 rcproject 文件(Reality Composer 项目文件)。里面界说了一个运用平面锚定类型的场景,并放置了一个立方体。
点击右上角的 “Open in Reality Composer”,能够在 Reality Composer 中修改该场景。请注意,此刻的场景称号为 “Box”,立方体的称号也是 “Box”。
让咱们看看此刻 ContentView 中的代码中都有些什么内容。
// SwiftUI 视图
struct ContentView : View {
var body: some View {
ARViewContainer().edgesIgnoringSafeArea(.all)
}
}
// 经过 UIViewRepresentable ,创立一个能够 SwiftUI 中运用的 AR 视图( 因为 AR 视图当时是依据 UIKit 的)
struct ARViewContainer: UIViewRepresentable {
func makeUIView(context: Context) -> ARView {
// 创立 AR 视图
let arView = ARView(frame: .zero)
// 从 “Experience” Reality 文件中加载 “Box” 场景
let boxAnchor = try! Experience.loadBox()
// 将 Box 的锚定增加到场景中
arView.scene.anchors.append(boxAnchor)
return arView
}
func updateUIView(_ uiView: ARView, context: Context) {}
}
注意到了吗,Experience 和 Box 别离对应 Reality 文件的项目称号和场景称号。这意味着,咱们对项目、场景和物体的命名将会被 Xcode 主动生成为相同称号的目标代码。经过 Xcode 的界说跳转操作,咱们能够检查这些主动生成的代码内容。
接下来,咱们将为之前创立的“黄金眼”项目增加一个新的功用:让两个黄金眼球跟着嘴巴的张大而变大。 删除当时项目中的 Experience 文件,并将前一章在 Reality Composer 中创立的 GoldenEye 文件拖到当时的 Xcode 项目中( 注意挑选 Copy items if needed )。
将 makeUIView 调整成下面的代码。
import ARKit // 导入 ARKit 结构
func makeUIView(context: Context) -> ARView {
// 创立 ARView
let arView = ARView(frame: .zero)
// 创立 ARConfiguration,能够理解为设置场景的锚定类型
let arConfiguration = ARFaceTrackingConfiguration()
// 运用 Configuration,创立并发动 AR 会话
arView.session.run(arConfiguration, options: [.resetTracking, .removeExistingAnchors])
// 加载眼球场景
let arAnchor = try! GoldenEye.loadEyes()
// 将 Eyes 的锚定增加到场景中
arView.scene.anchors.append(arAnchor)
return arView
}
在这段代码中,咱们运用 ARFaceTrackingConfiguration 创立了一个与面孔锚定类型对应的 AR 装备目标,并据此创立的 AR 会话(ARSession)。在 ARKit 中,能够运用代码创立以下锚定类型:
-
AROrientationTrackingConfiguration:基本的三自由度(3DOF)盯梢。
-
ARWorldTrackingConfiguration:六自由度(6DOF)盯梢。它也能够盯梢人、已知的图画和物体。涵盖了 Reality Composer 的水平、笔直、图画、物体等多种锚定办法。
-
ARBodyTrackingConfiguration:盯梢人体。
-
ARImageTrackingConfiguration:盯梢已知的图画。对应 Reality Composer 的图片锚定。
-
ARObjectScanningConfiguration:扫描物体并创立该物体的高保真三维数据。所生成的物体数据可用于 ARWorldTrackingConfiguration 中,作为盯梢的目标目标。
-
ARFaceTrackingConfiguration:运用前置摄像头盯梢面部和面部表情。对应 Reality Composer 的面孔锚定。
-
ARPositionalTrackingConfiguration:供给六自由度(6DOF)盯梢,但和 ARWorldTrackingConfiguration 不同,这种场景下设备不会搜集和剖析来自相机的画面,仅追寻设备的移动,适合于一些相似 VR 的场景。
-
ARGeoTrackingConfiguration:利用 GPS 与地图数据完结地理定位盯梢。
相较于 Reality Composer ,运用代码,咱们能够创立更多的锚定类型,以应对愈加杂乱的 AR 场景需求。
咱们需求依据口打开的程度来控制眼球的巨细,那么怎么获取需求的信息呢?
每个 AR 会话(ARSession)在发动后,会依据其设置的 ARConfiguration 品种回来不同的数据信息。例如:ARGeoAnchor 将回来经纬度和高度信息,而 ARBodyAnchor 将回来躯干和各个关节的方位信息。关于咱们当时的场景,则需求经过 ARFaceAnchor 获取面部各个器官的运动信息。
这些信息将经过 ARSession 装备的 Delegate 回来给开发者。咱们只需求依据这些信息,对场景中的物体进行调整,便能够完结咱们的需求。
进一步调整咱们的代码,在 ARViewContainer 中增加如下的代码:
func makeCoordinator() -> Coordiantor {
Coordiantor(arViewContainer: self)
}
class Coordiantor: NSObject, ARSessionDelegate {
var arViewContainer: ARViewContainer
var face: GoldenEye.Eyes!
init(arViewContainer: ARViewContainer) {
self.arViewContainer = arViewContainer
super.init()
}
// 锚点信息发生变化时会调用
func session(_: ARSession,
didUpdate anchors: [ARAnchor])
{
guard let face else { return }
var faceAnchor: ARFaceAnchor?
for anchor in anchors {
if let a = anchor as? ARFaceAnchor {
faceAnchor = a
}
}
// 特定面部特征的标识符,用于描绘这些特征相对运动的系数
let blendShapes = faceAnchor?.blendShapes
// 下颌开口的系数,用来判别嘴的开合巨细
if let jawOpen = blendShapes?[.jawOpen]?.floatValue {
// 经过下颚的开合系数来调整眼球的尺度
face.eyeL?.scale = SIMD3<Float>(1, 1, 1) * (0.3 + jawOpen / 2)
face.eyeR?.scale = SIMD3<Float>(1, 1, 1) * (0.3 + jawOpen / 2)
}
}
// 移除锚点时会调用
func session(_: ARSession, didRemove _: [ARAnchor]) {
print("didRemove")
}
// 增加锚点时会调用
func session(_: ARSession, didAdd _: [ARAnchor]) {
print("didAdd")
}
}
在上面这段代码中,咱们创立了一个符合 ARSessionDelegate 协议的 Coordiantor 类。在 session(_: ARSession, didUpdate anchors: [ARAnchor])
办法中,咱们将依据 ARFaceAnchor 供给的 BlendShapeLocation 信息中有关下颚运动的数据来调整眼球的巨细。
BlendShapeLocation 供给了十分丰富的面部运动细节,包含眼睛、嘴巴、下巴、眉毛、脸颊、鼻子等。更多详情请参阅 官方文档。
终究,在 makeUIView 办法中为 ARSession 装备 delegate。
...
// 设置 delegate
arView.session.delegate = context.coordinator
context.coordinator.face = arAnchor
return arView
至此,咱们现已完结了一切的代码,创立了一个具有依据张嘴巨细改变眼球尺度的独立 AR 运用。
咱们保存并运用了在 Reality Composer 项目中的绝大多数信息,包含称号、球体尺度、预设方位、原料以及行为,这就使得代码十分简略。即便没有在代码中增加处理手势的代码,球体已然具有在 AR 场景中点击后播映声响的才干。
经过 Reality Composer 和代码的结合,咱们进一步开启了 AR 构思之门。原有的 Reality Composer 项目资产被最大极限地保存并发挥作用,然后大幅降低了代码的开发难度和作业量。咱们能够在此根底上发散思想,拓宽 AR 的潜在运用,并探究更广阔的发明空间。
不依靠 Reality Composer ,完结 AR 运用
读到此处,你或许会产生一个疑问:在 Apple 的 AR 开发过程中,咱们有必要运用 Reality Composer 吗?是否能够选用其他了解的引擎(如 Unity、Unreal)或完全经过代码来构建场景与交互逻辑?
定心,答案是清楚明了的,这些挑选相同敞开且可行。Reality Composer 仅仅苹果供给的一种可选计划,用于简化 AR 开发流程,降低相关技能门槛。假如你现已熟练掌握其他引擎东西或对代码开发十分了解,选用 Reality Composer 绝非必需。
在 Apple 的 AR 开发过程中,只要 ARKit 结构是不可或缺的。
ARKit 为 AR 开发翻开了大门,它是构建 AR 体会的根底与中心。开发者经过它获得场景数据与交互才干,得到将 AR 概念变为实际的东西与资料。尔后,开发者能够依据爱好与经验,挑选适宜的结构或直接编写代码,发明超卓的 AR 作用。
以 Unity 为例,下图是在 Unity 里面进行移动端 AR 运用开发的技能结构图,这儿其实能够看出 ARKit 的重要性,因为不管怎样,究竟层都需求 ARKit 供给根底的 AR 才干,例如 SLAM 等等。
而这儿,咱们也供给一段在 Unity 中运用控制 GameObject 方位与旋转的演示代码,是不是一股弄弄的 ARKit 的感觉:
// 创立 ARSession 与装备
ARSession session = ARSession.instance;
ARWorldTrackingConfiguration config = new ARWorldTrackingConfiguration();
session.runWithConfig(config);
// 获取相机图画并烘托到屏幕上
ARCameraBackground arCamera = FindObjectOfType<ARCameraBackground>();
if (arCamera != null)
arCamera.enabled = true;
// 在场景中增加 ARAnchor 对像
ARRaycastManager raycastManager = GetComponent<ARRaycastManager>();
List<ARRaycastHit> hits = new List<ARRaycastHit>();
if (raycastManager.Raycast(touches[0].position, hits, UnityARVideoFormat.kARFBCameraPosition))
{
//增加 Anchor 与 GameObject
GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
cube.transform.position = hits[0].pose.position;
cube.transform.rotation = hits[0].pose.rotation;
}
// 更新 Anchor 方位与姿态
for (int i = 0; i < anchors.Count; i++)
{
anchors[i].transform.position = anchors[i].anchor.transform.position;
anchors[i].transform.rotation = anchors[i].anchor.transform.rotation;
}
接下来,咱们将以上一节的需求为例,演示怎么仅依靠代码创立相同功用的运用,而不需求运用 Reality Composer。
考虑到篇幅,本文仅介绍其中比较重要的部分,不对一切的代码进行解释。你能够在 此处 获取完好代码。
RealityKit 是苹果在 iOS 13 中推出的新一代 AR 开发结构。它依据 ARKit 打造,并在其根底上进行了进一步的封装与优化,供给更高层级的 AR 开发体会。
比较 ARKit,RealityKit 愈加简略易用。它选用了 Entity-Component 的办法组织 AR 体会的构成元素,开发者无需过度重视底层完结细节,就能够轻松构建互动的 AR 作用。一起,RealityKit 也在视觉与交互体会上作出进步,增加了环境光、反射等作用,支撑丰富的手势交互等,使 AR 内容与实在场景愈加和谐,交互也愈加天然。
SceneKit 为 RealityKit 供给了 3D 烘托才干,Metal 则确保了 Rendering 的高性能完结。RealityKit 经过这些底层结构,在 ARKit 的数据根底上,完结了高质量的 3D 与 2D 混合烘托,为 AR 体会带来更高的实在感与体会度。
相较于选用其他结构的纯代码开发选项,RealityKit 往往是 AR 开发的最佳挑选。它供给了愈加简略和直接的开发体会,技能门槛也更低。
在 Xcode 中新建一个对增强实际运用程序项目,然后删除模板中的 Experience 文件。
请将 makeUIView
办法修改为以下代码:
func makeUIView(context: Context) -> ARView {
let arView = ARView(frame: .zero)
let arConfiguration = ARFaceTrackingConfiguration()
arView.session.run(arConfiguration, options: [.resetTracking, .removeExistingAnchors])
return arView
}
同上文中介绍的一样,咱们创立并启用了一个依据 ARFaceTrackingConfiguration 的 AR 会话。
在 ARViewContainer 中增加如下代码:
func makeEyesAnchor() throws -> AnchorEntity {
let eyesAnchor = AnchorEntity()
let eyeBallSize: Float = 0.015 // 小球的尺度
let collisionBoxSize: Float = 0.03 // 磕碰盒的尺度,用于判别点击
// 创立左眼小球并设置方位
let leftEyeBall = createEyeBall(scale: eyeBallSize)
let leftEyeOffset = SIMD3<Float>(0.03, 0.02, 0.05) // 左眼方位
leftEyeBall.name = "leftEye" // 左眼称号
leftEyeBall.position = leftEyeOffset
// 为左眼小球增加磕碰盒
let leftEyeCollision = CollisionComponent(shapes: [ShapeResource.generateBox(size: [collisionBoxSize, collisionBoxSize, collisionBoxSize])])
leftEyeBall.components.set(leftEyeCollision)
eyesAnchor.addChild(leftEyeBall)
// 创立右眼小球并设置方位
let rightEyeBall = createEyeBall(scale: eyeBallSize)
let rightEyeOffset = SIMD3<Float>(-0.03, 0.02, 0.05) // 右眼方位
rightEyeBall.name = "rightEye" // 右眼称号
rightEyeBall.position = rightEyeOffset
// 为右眼小球增加磕碰盒
let rightEyeCollision = CollisionComponent(shapes: [ShapeResource.generateBox(size: [collisionBoxSize, collisionBoxSize, collisionBoxSize])])
rightEyeBall.components.set(rightEyeCollision)
eyesAnchor.addChild(rightEyeBall)
return eyesAnchor
}
func createEyeBall(scale: Float) -> ModelEntity {
let eyeBall = ModelEntity(
mesh: .generateSphere(radius: scale),
materials: [SimpleMaterial(color: .yellow, isMetallic: true)]
)
return eyeBall
}
在这部分中,咱们经过代码完结了之前在 Reality Composer 中创立球体、摆放球体、设置原料等操作。
在 return arView
代码的上方,增加:
let arAnchor = try! makeEyesAnchor()
arView.scene.anchors.append(arAnchor)
此刻,假如咱们运转 App,球体并不会出现。这是因为咱们还没有将它们的方位与面部的锚点绑定在一起。
在 ARViewContainer 中增加如下代码:
func makeCoordinator() -> Coordinator {
Coordinator(arViewContainer: self)
}
class Coordinator: NSObject, ARSessionDelegate {
var arViewContainer: ARViewContainer
var face: AnchorEntity?
var player: AVAudioPlayer?
init(arViewContainer: ARViewContainer) {
self.arViewContainer = arViewContainer
super.init()
}
func session(_: ARSession, didUpdate anchors: [ARAnchor]) {
guard let faceAnchor = anchors.first as? ARFaceAnchor,
let face = face
else {
return
}
// 更新头部实体的方位和方向
let facePosition = simd_make_float3(faceAnchor.transform.columns.3)
let faceOrientation = simd_quatf(faceAnchor.transform)
face.position = facePosition
face.orientation = faceOrientation
// 获取头部节点的旋转值
let faceRotation = face.orientation
// 更新左眼小球的旋转
if let leftEye = face.children.first(where: { $0.name == "leftEye" }) as? ModelEntity {
let parentRotation = faceOrientation
let eyeLocalRotation = simd_mul(parentRotation.inverse, faceRotation)
leftEye.orientation = eyeLocalRotation
}
// 更新右眼小球的旋转
if let rightEye = face.children.first(where: { $0.name == "rightEye" }) as? ModelEntity {
let parentRotation = faceOrientation
let eyeLocalRotation = simd_mul(parentRotation.inverse, faceRotation)
rightEye.orientation = eyeLocalRotation
}
let maxScale: Float = 1.6 // 小球的最大缩放倍数
// 获取张嘴程度
let blendShapes = faceAnchor.blendShapes
if let jawOpen = blendShapes[.jawOpen]?.floatValue {
// 调整小球的缩放倍数
let scale = 1 + (jawOpen * maxScale)
face.children.compactMap { $0 as? ModelEntity }.forEach { eyeBall in
eyeBall.scale = SIMD3<Float>(repeating: scale)
}
}
}
}
同上节中的代码相似,在 session(_: ARSession, didUpdate anchors: [ARAnchor])
回调办法中,咱们依据面部的方位,不断的调整两个小球的方位,并依据张嘴的程度来调整小球的尺度。
在 makeUIView
中的 arView.scene.anchors.append(arAnchor)
下方增加代码,设置 delegate:
arView.session.delegate = context.coordinator
context.coordinator.face = arAnchor
此刻运转运用,两个金色的小球现已绑定在两眼的方位,而且能够跟着嘴巴的开合程度而变化巨细。
终究咱们将增加点击小球播映声响的功用。首要在 makeUIView
办法中为 AR 视图增加一个点击手势。
let tapGesture = UITapGestureRecognizer(target: context.coordinator, action: #selector(context.coordinator.handleTap(_:)))
arView.addGestureRecognizer(tapGesture)
return arView
在 Coordinator 中增加响应手势和播映音频的代码:
@objc func handleTap(_ gesture: UITapGestureRecognizer) {
guard let arView = gesture.view as? ARView else { return }
let touchLocation = gesture.location(in: arView)
if let _ = arView.entity(at: touchLocation) {
playSound()
}
}
func playSound() {
if player == nil {
// 在项目中增加任意音频文件,并替换此处的文件名
let fileName = "mixkit-classic-click.wav"
guard let url = Bundle.main.url(forResource: fileName, withExtension: nil) else {
print("Sound file '\(fileName)' not found.")
return
}
player = try! AVAudioPlayer(contentsOf: url)
player?.prepareToPlay()
}
player?.play()
}
至此,咱们没有依靠于任何 Reality Composer 资源便创立了具有相同功用的 AR 运用。当然,关于当时的需求,结合 Reality Composer 要比运用纯代码愈加高效。不过只需依照上述逻辑,你就能够运用 ARKit 与你习惯的任何东西相结合,发明出想要的作用。
总结
经过阅览这篇文章,信任你现已对 AR 技能、苹果供给的 AR 东西有了开始的了解,并体会到了 AR 带来的别致与构思。
文章中介绍的仅仅 AR 东西与技能中的小部分,在这儿,我只想表达一个观点:AR 不再是什么遥不可及的未来技能,它现已悄然融入咱们的日子,并继续改变着国际的样貌。
假如你想进一步了解 ARKit 或许开发 AR 运用,我强烈推荐你阅览 WWDC 中关于 AR 的 Session、官方供给的开发者文档以及专业书籍。此外,XR 基地也会在不久的将来推出有关苹果 AR 的教程,敬请等待。
AR 技能不只局限于游戏与娱乐。在教育、医疗、工程与出产等领域,都有着巨大的运用潜力。假如你将来有时机从事这些行业,具有 AR 技能无疑会为你带来更大的优势。
未来,将会有越来越多强壮、智能、便捷的 AR 东西和技能出现出来以协助每一个人在实际与虚幻中纵情漫游。
终究,让咱们一起等待 AR 带来的更多惊喜!玩得高兴,用地畅快!