Tag: 增强现实

ARKit和CoreLocation:第一部分

使用线性代数(和Trig)导航 示范代码 ARKit和CoreLocation:第一部分 ARKit和CoreLocation:第二部分 ARKit和CoreLocation:第三部分 背景 自从我写了一篇新的博客文章以来已经有一段时间了,所以希望能弥补这一点。 这篇文章和下一篇文章将是我对ARKit和CoreLocation进行实验的两部分系列! 第一部分将介绍ARKit的基础知识,MapKit的指导以及矩阵转换的基础知识。 第二部分将处理计算两个位置之间的方位,以及如何获取位置数据并将其转换为ARKit场景中的位置。 介绍 提到“增强现实”,最先引起人们注意的是PokemonGO。 如果您像大多数人一样,可能曾经玩过一两次(或痴迷过)。PokemonGO证明了在设置方面,没有什么能比我们的世界更好。 就像PokemonGO一样令人敬畏,这只是对增强现实体验的深度和潜力的一瞥。 苹果文档 : 增强现实 (AR)描述了用户体验,这些体验将2D或3D元素添加到设备相机的实时视图中,从而使这些元素看起来像是居住在现实世界中。 ARKit结合了设备运动跟踪,相机场景捕获,高级场景处理和显示便利性,以简化构建AR体验的任务。 借助iOS 11,Apple已将ARKit的功能释放给iOS开发社区。 我们距离iOS 11尚有几周的上线时间,但我们已经看到的情况似乎可能会重新定义移动用户体验的可能性。 首先,一些基本原理 所以,这是魔术吧? 我不想成为这样说的人,但是不,这只是数学。 因此,如果这不是魔术,那么他们如何实现呢? 视觉惯性里程表! (快说十遍。) 定义 视觉惯性里程表(VIO) :ARKit会分析手机摄像头和运动数据,以便跟踪其周围的环境。 计算机视觉记录了环境中的显着特征,并且无论iPhone的移动如何,都能够保持其在现实世界中位置的意识。 苹果公司非常热衷于围绕会话组织代码。 会议是一个 封装包含在应用程序活动的定义时间段内的逻辑和数据的方法。 使用URLSession时,这是您的应用程序发送网络请求并回传数据时的逻辑和数据。 ARSession :在ARKit中, ARSession协调创建增强现实体验所需的逻辑和数据。 这包括相机和运动数据以及跟踪世界时所需的计算。 ARFrame : ARFrame包含视频帧数据和位置跟踪数据,这些数据会在currentFrame属性中传递给ARSession。 ARKit将该图像数据与运动跟踪数据结合起来,以计算iPhone的位置。 ARAncho r : ARAnchor是现实世界中保持的位置,无论摄像机的运动或位置(理论上)如何。 它固定在一个特定的位置,并且大部分将保留在那里。 AR配置 ARWorldTrackingConfiguration :是用于跟踪设备方向,位置并检测特征点(如相机记录的表面)的配置。 ARConfigurations将您和手机所处的物理世界与手机根据摄像头和运动数据生成的虚拟坐标空间进行连接。 worldAlignment: […]

iPhone X:使用脸部追踪功能不止使用Animojis

高级设计技术人员Virakri Jinangkul 今天发布的iPhone X正式为我们的个人设备带来了基于面部的增强现实。 AR已经展示了个人和业务用例,以证明其价值,从教育演示到购买前的产品内部预览。 在公司可以为其移动用户提供什么方面,面部控制将增强现实提升到一个新的水平。 苹果公司以有趣的​​头向我们介绍了基于面部的AR,展示了3D角色复制的面部动作。 虽然Animoji本身可能不是该技术最有用的应用程序,但它有效地展示了Apple的面部跟踪可以在我们的肌肉运动中识别出的细节水平,这可以通过简单的表情变化打开并控制其他应用内命令。 但是比Animoji和游戏更“严肃”的使用呢? 从视频中可以看到,“ Eat It!”的原型使您可以通过转动头来左右移动,并通过张开和合上嘴来向前捕捉食物特征。 这款游戏是作为概念证明而创建的,旨在展示任何数量的面部动作如何与我们选择的任何功能相关联。 随着对应用程序可访问性的需求不断增长,基于面部的AR的未来用例层出不穷。 从导航和安全性,到在连接的设备之间开发基于面部的命令,现在都可以在不触摸屏幕的情况下实现。

使用Swift的ARKit测量长度

您是否曾经历过需要测量设备的经历,但现在没有任何东西了? 不要害怕! 因为,实际上我们可以使用ARKit使用我们的iOS设备来测量从一个点到另一个点的对象。 在此应用程序中,我们将添加两个点,这些点将确定测量的开始和结束。 同样,长度为英寸的文本将显示在端点的正上方。 为了获得更好的参考,您可能还希望在此处查看整个代码库。 设定 首先,我们需要创建一个增强现实应用程序。 对于这种情况,我们将其命名为ARRuler。 选择Swift作为其语言,选择内容技术作为SceneKit 。 我们无法为此选中单元测试和UI测试 ,因为我们不会使用它。 在我们的viewDidLoad()方法中,我们也可以删除以下行,因为我们不需要它们。 sceneView.showsStatistics = true 让场景= SCNScene(名称:“ art.scnassets / ship.scn”)! sceneView.scene =场景 另外,在相同的viewDidLoad()方法中,让我们添加sceneView.debugOptions = [ARSCNDebugOptions.showFeaturePoints],以便我们可以跟踪ARKit将使用的设备位置。 添加起点和终点 现在我们的项目已经设置好,让我们使用以下代码覆盖touchesBegan(_:with) ,以检测触摸是否在视图中发生。 覆盖func touchesBegan(_ touches:Set ,事件:UIEvent?){ } 接下来,我们需要在ARSCNView中获取第一次触摸的位置。 然后使用触摸位置执行命中测试,以查看它是否对应于特征点。 由于命中测试结果返回一个数组,因此我们将使用第一个数组添加一个点。 如果让touchLocation = touches.first?.location(in:sceneView){ 让hitTestResults = sceneView.hitTest(touchLocation,类型:.featurePoint) 如果让hitResult = hitTestResults.first { addDot(at:hitResult) } } 正如您所注意到的,我们还没有创建addDot(at 🙂方法。 此方法应接受ARHitTestResult 。 […]

增强现实-简单的技术介绍

大家好,我又是安东尼奥 👋上一次我们进行互动时,我写的是关于如何使用外部传感器将iPhone变成Brythm呼吸频率监测器的信息。 但是,这次,我将向大家介绍增强现实(简称AR)的惊人世界。 突然的主题转变并非无处不在,而是来自Apple的WWDC 2018活动,在该活动中他们展示了他们正在从事的许多项目,取得了多大的成就以及还有待改进的地方。 在他们的许多主题演讲中,其中一位谈到了最新的AR尝试:ARKit2。这反过来激起了我对该主题的兴趣,并且由于我有一些空闲时间并想要一个新的宠物项目,所以……在这里😅因此,不费吹灰之力,让我们直接潜水。 增强现实到底是什么? 很多人将其误认为是虚拟现实,但我希望到本文结束时,您能够清楚地分辨出他们的区别,如夜间🌃和白天☀️🏙。 您可能已经注意到,您的身体和思想存在于被您视为“ 现实”的时空混合之中,如今,您甚至可以“存在”于计算机生成的被称为“ 虚拟现实”的时空混合之中。 但是,在这两种极端之间,可能存在其他类型的现实,其中“正常”现实和虚拟现实在不同程度上交织在一起,其中之一就是增强现实 。 正如我们所看到的, 增强现实作为一个概念意味着在现实中添加了一些虚拟现实,以增加额外的风味,但又不至于使其不堪重负,或者换句话说,重点应该放在将虚拟元素引入物理世界中而不是相反。 从概念上来说,这一切似乎都不错,但它带给我们以下问题(或任何较不深奥的版本): 增强现实体验应遵循哪些属性和规则? 事实证明,这包含三个关键组成部分: 1)它必须结合虚拟和真实信息,以真实世界为主要行动场所; 2)它必须与实时更新交互; 3)它必须在物理环境中的3D空间中注册虚拟信息。 本质上,在物理环境中移动时,用户的动作(移动/交互)会对渲染的虚拟元素产生直接影响,并且所有这些都是实时发生的。 如果密切注意,这些规则不会区分特定的输出设备或交互介质,这意味着从理论上讲,AR不仅限于显示和视觉刺激。 audio但是,音频,触觉,嗅觉和味觉AR很难实现。 既然我们知道了什么是AR,您可能会倾向于认为它已经存在很长时间了,这是错误的。 😶增强现实作为一个概念已经存在了数十年,实际例子也很多而又丰富,因此让我们快速看一下这些年来这一切已经发展到了什么程度。 我保证不会让您厌烦可怕的数学细节,我在所有这些工作中所扮演的角色是展示AR变得多么棒! 😜 以前没有使用简单的叠加层向现有任务添加信息的意图,这一切始于1965年伊凡·萨瑟兰德(Ivan Sutherland)首次提出“最终显示器”并于1968年实现。这种头戴式显示器(HMD)的绰号是“达摩克利斯之剑” ,因为它必须悬挂在天花板上并悬挂在用户的头上。 它包括头部跟踪,三维移动自由度和透明光学元件。 因此,VR和AR诞生了! 作为理论概念……技术赶上了几十年,在1990年代,AR发现了自己的现实生活中的应用程序来协助工人进行室内组装和维护。 直到1999年,AR软件和硬件仅用于学术研究和开发,或者用于非常特殊的工厂设置,但是随着ARToolKit的发布,这种情况发生了变化。 它是第一个用于AR的开源软件平台,并具有一个使用黑白基准(也称为基准标记)的3D跟踪库,可以轻松地在常规激光打印机上进行打印。 基准是什么? 等一下,让我们重新考虑一下这个想法。 如果您熟悉条形码和QR码,知道基准标记没有什么不同也不会感到震惊。 所有这些都易于生成,可唯一识别的,机器可读的数据可视表示形式; 但是,条形码和QR码通常用于存储有关放置物品的信息(ID号,来源来源,相关的URL等),而基准点则用于建立相对于它们的位置,方向和比例。 您可能已经猜到了,基准标记被认为是AR的救星。 🙌仅依靠“简单”的计算机视觉算法和最少的真实世界入侵,即可非常轻松地将虚拟元素附加到物理世界对象上。 回到历史课 到1990年代末,已经有了可靠的网络摄像头,在2000年代初,我们目睹了移动设备的激增,因此,开发出首款具有AR功能的手持设备只是时间问题。 我们现在甚至还没有在谈论智能手机! 还记得PDA吗? 男孩,很久以前… 无论如何,手持设备突然变成了头戴式显示器的可靠替代品,不足为奇的是,近年来,它们已成为开发增强现实体验的最具成本效益的方式,更重要的是,使它们可用于更广泛的领域用户群。 如今,几乎所有智能手机都可以支持AR。 它所需要的只是一台摄像机,一台显示器和足够的计算能力,以确保与渲染的虚拟元素进行“实时”交互。 检查,检查和三重检查。 ✅ 因此,正如我们所看到的,AR的起源已经走了很长一段路,如今,它已经实现了惊人的壮举,但是如果您认为是这样,那么您最好坚持自己的袜子,因为您正在兜风! 🎢让我向您展示一下增强现实已经具备的功能以及未来的期望。 […]

ARKit飞机,3D文本和命中检测

在本系列的第2部分中,我们通过提供一些交互性并更加熟悉SceneKit来构建我们的AR场景。 我们还查看了渲染相机,并使用它的位置(即用户在现实世界中的位置)在我们的球体对象中驱动动画。 在本文中,我们将开始检测水平面,并将对象附加到这些平面上。 可以在以下位置找到本教程的代码:https://github.com/AbovegroundDan/ARTutorial_Part3 检测飞机 ARKit通过didAdd / didUpdate / didRemove节点回调提供了完整的生命周期回调,以用于何时检测到平面,何时更新平面以及何时移除平面。 需要注意的一件事是,当首次检测到飞机时,它似乎跳了一点。 这是ARKit改进其所见所见的准确性,并调整锚点。 如果继续扫描地板,将继续看到特征点,但是平面不会增长或以任何方式变化以填充新发现的空间。 这是因为我们没有响应来自渲染器的didUpdate调用。 我们可以通过跟踪锚点和属于它们的平面来改善实现。 如果收到didUpdate回调,我们将查找锚点,找到飞机,并使用该锚点的新信息调整飞机。 跟踪飞机 为了跟踪飞机,我们将使用一个简单的字典将锚点映射到飞机。 这为我们提供了一种查找和修改相应平面的简便方法。 在我们的视图控制器中,我们将添加字典定义: 现在我们知道了曲面的位置,我们可以开始添加锚定到其上的项目。 而不是像第1部分和第2部分中那样使用外部3D模型,我们将使用一些3D文本。 让我们开始创建一个给定任意文本的方法,该方法将为我们提供一个具有3D文本几何形状的SCNNode。 接下来,我们将添加一个方法来将此父节点添加到另一个节点。 文字看起来不错,但是是浮动的。 这是因为文本容器的枢轴点位于实际文本所在位置的左下角。 枢轴点描述了对象的原点。 如果旋转对象,则将旋转点用作旋转对象时的中心点。 如果按比例缩放,也将从该点开始。 这可以用来创建一些有趣的效果。 现在,让我们尝试“接地”文本对象,以使它看起来像是坐在飞机上,而不是漂浮在飞机上。 在我们的createTextNode方法中,就在我们返回节点之前,添加以下代码: 现在运行代码将为我们提供假定位置的文本。 我们可以看到我们的文字在那儿投射了一些阴影,但是由于透明的网格,我们看不到它的阴影。 我们可以在SceneKit中做一些技巧来使阴影更好地显示。 我们将在此处使用这些技巧之一,并创建一个不会渲染的平面,但它将接受从其他对象投射的阴影。 在2017年WWDC SceneKit:新增功能(https://developer.apple.com/videos/play/wwdc2017/604/)会话中对此技术进行了说明。 让我们转到定向光定义并向其中添加以下几行: 仅此而已。 如果您在该GIF中注意到,我们将分散文本。 为此,让我们看一下将文本放置在我们点击的位置,而不是平面锚点的当前位置。 为此,我们将一个新参数传递给addText调用,并带有我们希望对象所在的位置。 我们将从SCNHitTestResult对象获得此位置,该对象从我们的点击命中测试返回。 修改didTapScreen调用以获取水龙头的位置,并将该信息传递给addText调用: 现在就这样。 收到了您接下来要看的内容的请求? 让我们在评论中知道! 不要忘记关注s23NYC:工程博客,其中发布了耐克的数字创新团队的很多精彩内容。 AbovegroundDan / ARTutorial_Part3 通过在GitHub上创建一个帐户来为AbovegroundDan / ARTutorial_Part3开发做出贡献。 […]

ARKit,SceneKit和如何控制世界

在本系列的第1部分中,我们经历了一个工作流程,在该工作流程中,我们处理了3D模型,使用Xcode创建了AR项目,开始了AR会话并将模型放入了增强场景。 在本文中,我们将开始使用各种SceneKit方法将模型付诸实践,并开始与我们世界中的对象进行交互。 可以在https://github.com/AbovegroundDan/ARTutorial_Part2上找到此文章的项目。 SceneKit提供了一组可应用于节点的操作。 这些动作可用于设置运动,旋转,缩放和其他节点属性的动画。 可以将它们分组以同时运行,按顺序依次运行,然后重复或颠倒。 完整列表可以在https://developer.apple.com/documentation/scenekit/scnaction中找到 我们将继续修改当前项目,并开始向我们的对象添加一些操作。 让我们从向球体添加旋转开始。 在HoverScene中的addSphere方法之后,添加以下方法: 让我们在球体上添加一些麻烦。 让我们也将其上下浮动。 我们将添加一个悬停动作,一个悬停动作,对这两个动作进行排序,然后将它们与我们现有的旋转动作组合在一起。 这是addAnimation方法的外观: 让我们为场景添加一些交互性。 让我们设定一个目标来开始场景,方法是让用户将球体放置在世界上,然后点按以激活它们。 由于我们的代码变得更加复杂,是时候开始抽象化处理场景对象的方式了。 在我们的项目中创建一个名为“对象”的新组。 在此文件夹中,我们将创建一个新的Swift文件,名为SceneObject.swift。 我们将创建一个派生自SCNNode的基类SceneObject。 我们一直在使用SceneKit做很多事情,但是仅了解ARKit可以做的一些事情。 作为快速了解更多ARKit功能的先导,让我们通过使球体“注视”相机为场景增添一点乐趣。 我们已经钩住了渲染器的updateAtTime方法,并且那里也有对相机的引用。 因此,让我们开始向Sphere类添加一个方法,以使其朝着特定方向发展。 球的“眼睛”已经面向负Z,这是对象的向前方向。 我们要做的是创建一个方法,该方法采用一个向量来标记我们的“眼睛”将要面对的空间中的一点。 请继续关注以获取更多ARKit乐趣! AbovegroundDan / ARTutorial_Part2 通过在GitHub上创建一个帐户来为ARTutorial_Part2开发做出贡献。 github.com

Foursquare API + ARKit

9月初,我们看到了iOS 11的推出,从而为数百万个启用了AR(增强现实)的设备提供了支持。 在发布之后,我们考虑了一些创新的方法,Foursquare的位置智能可以为您提供体验,以吸引用户。 在进行演示之前,我们将更深入地讨论AR和ARKit。 “增强现实是通过将另一幅图像覆盖在周围环境的实时视图上而产生的增强图像或合成图像。 “ ARKit如何工作? ARKit使用一种称为视觉惯性里程表(VIO)的技术,并具有一些2D平面检测功能。 VIO意味着该软件可以实时跟踪您在太空中的位置。 这是通过您的姿势完成的,该姿势可以通过摄像头系统以及加速度计和陀螺仪(CoreMotion)进行跟踪。 就像汽车中的里程表会跟踪汽车的行驶距离一样,VIO系统也会跟踪iPhone在6D空间中的行驶距离。 6D表示xyz运动的3D(平移),加上俯仰/偏航/横摇的3D(旋转)。 ARKit的核心功能之一是平面检测。 这是必需的,因此您可以在地面上放置内容的地方,否则看起来好像在太空中漂浮得很厉害。 这是根据光学系统检测到的特征计算得出的。 现在,我们对AR和ARKit有了更多的了解,让我们深入研究一下快速演示: 为了让您入门,我们构建了一个由ARKit驱动的应用程序,以演示位置智能的功能。 在下面详述的示例中,您将能够使用Foursquare Places API在全球范围内移动手机以查看位置及其与您的距离。 我们也鼓励您查看我们的Pilgrim SDK,您可以在其中实时了解,与用户交流和互动。 快速开始 要快速上手,您可以在手机上获取该应用,或在下面克隆以下存储库。 在建造过程中,请在开始后添加您的钥匙/秘密。 git clone git@github.com:garethpaul/foursquare-ar-camera-ios.git 克隆存储库并添加密钥后,即可在任何iOS设备上进行扩展。 我们建议使用现实生活中的电话-由于在本地测试AR的复杂性。 在我们开始之前.. 我们还要感谢Mapbox和Andrew Hart的团队在此领域的启发和提供进一步工作方面所做的早期工作。 建造ARKit + Foursquare 在较高级别的示例中,我们执行三个主要功能。 确定位置 找到一些地方 将地点添加到AR 第1步-确定位置 我们利用核心位置通过感官信息确定基本位置。 该框架使用所有可用的机载硬件,包括Wi-Fi,GPS,蓝牙,磁力计,气压计和蜂窝硬件来收集数据。 LocationManager类符合CLLocationManagerDelegate并处理从CoreLocation检索位置和方向。 在我们的示例中,我们的主ViewController符合SceneLocationViewDelegate。 委托是一种简单而强大的模式,其中,我们的ViewController与另一个对象一起起作用。 委托对象保留了另一个对象的引用。 委托的主要价值在于,它使我们能够轻松自定义一个中央对象中多个对象的AR行为。 第2步-查找热门地点 加载视图后,我们将使用Foursquare的Places API从SceneLocation的LocationManager确定位置。 为简单起见,我们已将其添加到主ViewController中,但建议为静态服务(模型和控制器)创建一个单独的类。 在函数getFoursquareLocations中,我们利用端点“ venues / […]

着色器的ARKit + SceneKit简介

之前我谈到过如何在SceneKit中创建自己的自定义几何,结果您可以使用它们进行某些操作,例如偏斜或动画。 请参阅此处的第2部分的第1部分: ARKit + SceneKit几何图形教程(第1部分) 在SceneKit中创建自己的几何形状,无需离开即可拥有各种场景和动画。 medium.com 在该系列的第二篇文章的结尾处,我展示了如何使用看起来像字符串的标志来设置标志的动画,这是在SceneKit中向几何体或材质添加着色器的一种方法。 在许多情况下,比起我所展示的其他示例,诸如我上一篇文章底部所示的着色器是使几何图形动画化的更好选择。 主要原因是这些功能由SceneKit接受,编译为Metal,然后在设备的GPU上运行,该GPU比要在其他地方运行的CPU强大得多。 这主要是因为GPU是专门为处理图形而构建的(因此,其名称为Gphphics Processing U nit),所以我们希望尽可能多地使用它! 我想在本文中提到的应用着色器的方法主要是通过使用SCNGeometry对象的shaderModifiers属性。 首先,请看这里: SCNShadable – SceneKit | Apple开发人员文档 着色器修改器是Metal着色器语言或OpenGL着色器语言(GLSL)中的源代码片段,可用于… developer.apple.com 作为一个简单的示例,请看以下小片段: 如果(_geometry.position.y> 0){ _geometry.position.x + = 0.5; } 假设我们将其应用于尺寸为SCNBox类型的几何。 _geometry代表顶点,正如我之前的文章中所述,其位置当然是其在3D空间[x, y, z] 。 在此代码段中,我们获取位置在立方体中心上方的所有顶点,并将其向x方向正方向的侧面推0.5m。 我们可以迅速使它变得更有趣,而无需考虑太多,例如: 如果(_geometry.position.y> 0){ _geometry.position.x + = 0.5 * sin(u_time); } u_time是SceneKit开始渲染此着色器以来的时间(以秒为单位)。 因此,这将在正弦缓和之后以平滑的方式将立方体的局部x轴上+0.5的这4个点动画化为-0.5。 最后,我将演示的多维数据集示例是使用单位圆方程将前四个点从沿直线移动更改为沿圆移动。 单击此处以查看Desmos的快速图表,以防万一您不确定该如何组合。 如果(_geometry.position.y> 0.0){ _geometry.position.xz + […]

ARKit Pods — SCNPath

许多ARKit开发人员正在使用SceneKit作为其入门框架,这是一个很好的选择,主要是因为它可以访问iOS开发人员用于所有其他应用程序的所有本机功能。 使用SceneKit,您可以访问许多默认的几何类型,SCNBox,SCNSphere,SCNPyramid甚至SCNShape。 这些是很好的构建基块,但是当您要构建一些稍有不同的东西时,则必须更深入地自己构建几何。 我认为这是所有ARKit开发人员至少应该意识到的事情,这就是为什么我在之前的一些Medium帖子中展示了示例的原因,从我的第一个帖子开始: ARKit + SceneKit几何图形教程(第1部分) 在SceneKit中创建自己的几何形状,无需离开即可拥有各种场景和动画。 medium.com 大多数iOS开发人员不一定都具有3D几何或图形方面的背景知识,而且我认为他们不需要为了构建出色的东西而拥有背景知识! 因此,我最新的开放源代码框架用于创建基本为三角形的路径,这些路径可以围绕点集(SCNVector3的数组),如下面的GIF所示。 SCNGeomtry.path(path: positionArray) SCNPathNode(path: positionArray) 要创建一条从世界原点(或下面的1m)开始,向前然后向右的路径,您需要做的就是创建这样的类: 让pathNode = SCNPathNode(path:[ SCNVector3(0,-1,0), SCNVector3(0,-1,-1), SCNVector3(1,-1,-1) ]) 默认情况下,该路径的宽度为0.5m,它具有可以更改的其他属性,有关所有信息,请参见GitHub存储库: maxxfrazer / ARKit-SCNPath 仅使用点代表路径的中心为增强现实环境创建路径。 … github.com 好的,让我们来制作我在推文中展示的应用程序: 接下来,我们要添加点击手势。 当且仅当正方形未初始化(附加到屏幕)时,我才选择仅使用轻击手势来获取FocusSquare的当前位置,但是如果您希望执行的话,可以执行一次hitTest,用手指代替屏幕。 这些函数在ViewController中或在其扩展中。 var hitPoints = [SCNVector3]() func setupGestures(){ let tapGesture = UITapGestureRecognizer(target: self ,action: #selector (handleTap( _ :))) tapGesture.delegate = 自 自 .view.addGestureRecognizer(tapGesture) […]

ARKit Pods — FocusNode

这是一篇非常简短的文章,解释了如何实现我创建的名为FocusNode的Pod。 实际上,这实际上与Apple在其ARKit演示中使用的类和代码完全相同,我只是拆分了该类并将其打包,以便可以轻松地在我的ARKit项目中包含和使用它,并认为其他人可能也希望这样做。 此Pod的存储库位于: maxxfrazer / ARKit-FocusNode FocusSquare`类直接取自Apple的ARKit示例,并打包为任何人都可以轻松使用。 … github.com 假设您已经设置了ARKit项目,请创建一个包含pod ‘FocusNode’ 。 整个过程应类似于以下内容: 项目“ PROJECT.xcodeproj” 平台:ios,“ 12.0” 目标“项目” use_frameworks! 吊舱 “ FocusNode” 结束 跳到ViewController.swift文件(在终端中运行pod install后创建的工作区中)并import FocusNode 。 完成之后,您应该可以访问新类FocusSquare ,这将创建一个具有基本方形UI的对象。 将其附加到场景图的rootNode,并将FocusSquare的委托设置为sceneView。 它看起来应该像这样: 让 focusNode = FocusSquare() 覆盖 func viewDidLoad(){ … … 自我 .focusNode.viewDelegate = sceneView sceneView.scene.rootNode.addChildNode( 自我 .focusNode) } 为了使其正常工作,您需要设置配置以检测水平和垂直平面。 为此,您的配置创建将看起来像这样,然后在会话上运行。 让配置= ARWorldTrackingConfiguration() configuration.planeDetection = [。 […]