Tag: Nomtek

ARKit 1.5 —墙上的另一块砖头♪(什么墙?)

故事作者: nomtek的 iOS开发人员 Przemek Olszacki 具有iOS 11.3的Apple正在更新其AR平台-ARKit。 正如我们可以在他们的网站上阅读的那样,它添加了一项重要的新功能-垂直表面检测。 “除了桌子和椅子之类的水平表面之外,ARKit现在还可以识别虚拟物体并将其放置在垂直表面上,例如墙壁和门(…)” 苹果 如果这个新功能与检测水平表面一样好,那可能真是太好了! 想象一下所有允许您在不绘制墙壁轮廓的情况下装饰墙壁的应用程序。 想知道该挑选哪个壁纸? 没问题,会有一个应用程序可以向您显示墙壁的外观。 它还可以改善现有AR应用程序中的用户体验。 让我们举一个例子,如我们在上一篇文章中所描述的应用程序-Room Scanner。 目前,您必须四处走动才能获得准确的测量结果。 如果ARKit能够检测到墙壁,则进行测量就如同将设备指向墙壁的方向一样简单。 让我们对其进行测试! 为了测试新功能,我编写了应用程序,使我能够查看检测到的平面(水平和垂直)。 对于每个检测到的平面,它都会绘制一个网格,大致显示ARKit如何看到该表面。 足够的理论。 这是我制作的视频,因此您可以亲眼看到它的运行状况: 失望了吗 我也是… 期望与(增强)现实 在苹果公司的网站上阅读该笔记时,我们大多数人期望垂直表面的检测至少与水平表面一样好。 不幸的是,事实并非如此。 经过测试,我得出的结论是,它仅适用于具有明显特征的表面(例如,悬挂照片,文字或艺术品)。 如果表面是平整的(如单色的墙壁)或只有很少的小特征,则不会检测到。 这意味着大多数墙对于ARKit都是不可见的。 伤心。 您如何看待ARKit更新? 对你起作用吗? 在评论中分享您的经验! 伙计们,让我们保持联系!

将DuckHunt与ARKit结合使用? —第1课:欢迎来到组件世界

故事作者: nomtek的 iOS开发人员 Wojciech Trzasko 在WWDC 2017上,苹果迈出了将增强现实技术带入我们生活的第一步。 通过展示他自己的称为ARKit的框架,它大规模地引发了一个小现象。 互联网迅速被许多视频和演示所淹没,这些视频和演示提出了AR中疯狂的想法,从娱乐的想法(例如现实生活中的Street Fighter游戏)开始,以更实用的结尾,例如用于测量房间的简单解决方案。 得益于对流行工具的广泛支持,AR应用程序开发如此迅速的进展成为可能。 从最初的公告开始,苹果就发布了两个非常成熟的3D游戏引擎的插件:Unity和Unreal Engine。 两者都有庞大的社区,渴望测试新技术。 因此,如果您打算在增强现实中创建游戏或沉浸式体验,那么选择其中之一可能是您的最佳起点。 但是,当您要将应用程序制作成AR是默认用户体验的唯一不错的增强时,该怎么办? 您将步入一个需要将基于UIKit的经典应用程序与ARKit框架连接的地方。 在需要插入技术的地方,处理图像数据并基于结果将实时信息提供到UIKit表示的基于事件的基础结构中。 以正确的方式连接这两个不同的世界可能有些棘手,但并非不可能。 为了找出方便的方法,让我们从定义应用程序的体系结构开始。 最受欢迎的方法之一是使用VIPER ,它是适用于iOS世界的简洁架构的概念。 简而言之,它将单个模块分为五个部分: 视图 -仅负责显示所告知的内容 交互器-负责单个用例的业务逻辑 演示者—从Interactor获取结果,并准备将其显示在View上,并对从View传递来的用户输入做出反应 实体 – 交互器使用的模型层 路由-处理两个屏幕之间的导航,其职责在Wireframe对象(创建新屏幕并将其放置在应用程序的窗口中)和Presenters (获取用户输入并选择将用户移动到哪个屏幕)之间分配 为了使所有连接更加清晰,请看下面的图: 现在假设我们要向VIPER编写的应用程序中添加简单但无缝的体验。 您可能已经发现它没有太多空间。 我们应该把负责场景管理的代码放在哪里? 如何处理互动? 我们应该在实时引擎中处理它吗? 还是返回主持人? 但是在这种情况下,如果我们的经验中没有明确的业务逻辑,我们应该在交互器中做什么? 这些只是您现在可能会想到的一些问题。 让我向您展示一个简单的示例,该示例将UIKit菜单添加到我们使用ARKit进行的演示体验中。 只看最终结果: 如您所见,我们的实体仅由组件构建: SpriteComponent-负责渲染2D精灵 AgentComponent — GameplayKit代理对象的包装,实现AI行为 AnimationsComponent —根据上一次移动更改应用正确的动画 SoundComponent —播放声音效果 StateMachineComponent —允许实体更改其状态并将行为调整为当前状态(例如,当鸭子活着时使用不同的移动策略,而当鸭子死亡时使用不同的移动策略) 我们已经定义了实体,那么现在该如何处理它们呢? […]

使用ARKit获取房间计划(大小很重要的情况)

故事作者:nomtek的iOS开发人员Przemek Olszacki 两年前,我写了一篇有关“用iPhone扫描房间”的文章,您可以在这里阅读。 我尝试使用三个内置传感器(加速度计,陀螺仪和磁力计)来测量墙壁的长度并绘制房间的平面图。 我处理了从这些传感器接收到的原始数据,并根据将加速度转换为距离的自写代码计算了墙之间的距离。 结果令人鼓舞,表明可以实现,但需要更高级的计算(或更精确的传感器)才能获得所需的精度。 回去工作! 自从我看到ARKit的发布以来,我一直在等待机会尝试一下。 这是两年前返回原型的好机会。 从公告和WWDC谈话中,ARKit看起来很有希望:它的准确性,实时渲染性能和易于实现。 现在该进行测试了。 返回测量室的另一个原因是运动传感器本身已更新。 从iPhone 5S开始,使用单独的协处理器收集和处理传感器数据。 自2013年以来,每年都会更新该芯片,并在iPhone 8、8 Plus和X上推出最新的M11。从理论上讲,这三款设备的结果应该是最准确的。 科学的力量! 在衡量最重要的帮助时,我们从ARKit获得的就是设备在太空中的放置。 使用相机图像和运动传感器,它可以确定手机的位置,方向以及与某些物体和表面的距离。 无需复杂且容易出错的代码即可根据传感器提供的原始数据来计算设备的运动。 苹果为我们完成了所有这一切。 唯一困难的部分是我们如何使用它。 我尝试了几种方法来找到最准确的一种。 让我引导您完成我的过程。 你在看什么? 在我的第一次尝试中,我只是尝试重新构建两年前的应用程序-通过在手机接触墙壁时获得其位置来测量墙壁之间的距离。 不同之处在于,我不是使用自写代码来计算距离,而是使用ARKit中的数据。 简而言之,它没有用。 ARKit使用相机图像来帮助确定手机在太空中的位置,并且当手机接触墙壁时,相机会被遮挡。 如果没有相机,数据将无法可靠使用。 需要进一步实验 下一个方法基于另一个ARKit组件-通过相交最近的特征点进行命中测试。 ARKit能够通过检测相机图像中的显着特征来找到物体的表面和轮廓。 从理论上讲,将击中测试与启用的检测特征点一起使用可以允许测量从手机到相机所指向的对象的距离。 用户将站在房间的中央,并将手机的摄像头对准墙壁。 来自ARKit的数据将用于确定3D空间中的墙位置。 设备的方向将用于获取墙的方向。 不幸的是,它不适用于墙壁,因为大多数墙壁没有明显的特征并且是单色的单色表面。 下一个。 要解决以前方法中的问题,必须更改测量点。 至少要考虑两个选项。 首先是打印可以被应用识别并用作功能点的特定图案。 例如,必须将打印内容粘贴在墙上,以便应用程序能够识别出来,而不是尝试在图像中查找平整的墙。 它可能会起作用,但对用户而言将非常不便,因此未实现该想法。 第二种选择是使用ARKit提供的其他类型的点击测试。 它基于对水平面的检测。 初始化AR世界追踪时,我们可以启用水平面检测。 启用此选项后,ARKit会不断寻找可用作跟踪锚点的水平面。 好了,所以我们可以检测到水平面,但是与找到显然是垂直表面的墙又有什么关系呢? 好吧,由于我们不需要墙的高度,因此可以通过在与墙连接的地方对地板进行碰撞测试来测量其位置。 与采用特征点的方法一样,墙壁的方向由手机的方向确定。 这次,距离精度令人满意,在良好的照明条件下,我们可以获得单个墙壁位置的可用测量值。 测量多个墙壁以绘制房间平面图时会出现问题。 检测到的墙壁方向取决于用户将手机与墙壁平行放置。 […]

将DuckHunt与ARKit结合使用? -第2课:增强应用程序的体系结构

故事作者: nomtek的 iOS开发人员 Wojciech Trzasko 您可能还记得,最近我们从事了一个将经典NES游戏与我们的现实结合起来的小项目……哦,您不记得了吗? 没问题,这是一个偷偷摸摸的小故事,可以刷新您的记忆: 你还不记得吗 请查阅上一课,其中定义了Entity-Component-System模式和VIPER体系结构的基础。 目前,我们已经掌握了使用ECS模式为实时应用程序设计架构的知识,这与ARKit的经验非常吻合。 我们还了解了称为VIPER的广泛使用的iOS应用程序体系结构的基础。 因此,现在我们需要弄清楚如何连接这两个不同的世界。 为什么这两个有很大不同? 一方面,我们将ECS与ARKit相结合,该技术处理图像数据并基于结果提供实时信息。 在另一端,我们将使用以UIKit和VIPER架构为代表的基于事件的经典基础架构。 现在,该是最难的部分了。 如果有AR经验,我们将处理实时信息,而不是基于事件的基础结构。 现在,如果我们看一下经典的VIPER层,则演示者和交互者不太合适。 你是对的! 我们将尝试用ECS设计模式替换这些层。 为此,我们需要将用户的交互和对update方法的调用传递给ECS,但是由于ARKit和SceneKit的性质,此任务有些棘手。 要构建基于SceneKit的体验,您需要使用实现SCNSceneRenderer协议的对象。 对于AR场景,Apple提供了默认的AR渲染器实现,称为ARSCNView ,该渲染器将游戏逻辑和增强现实回调(例如updateAtTime , didSimulatePhysicsAtTime或didAddNodeForAnchor )返回给其委托。 因此,对于我们的ECS实施至关重要的所有回调,都将由严格连接到视图层的对象返回。 这是一个很大的障碍,如果我们不想实现自己的渲染器,则需要弄清楚如何处理它。 使它起作用的最简单方法是,从其大部分职责中裁剪视图图层并使其尽可能简单。 在我们的DuckHunt演示中,我们仅使用视图控制器对象来收集用户输入和所有逻辑回调,然后将它们传递给两个附加层: Scene和Gameplay 。 他们俩甚至都不知道视图的存在。 所有通信都通过这些层共享的接口进行。 那么,这两个新层的职责是什么? Scene是从SCNScene继承的类。 它加载并保存放置在世界上的3D对象图。 而且,它允许通过将动态对象公开来操纵它们。 游戏性是发生所有魔术的地方。 在这里,我们将介绍我们的ECS实施。 通常,它引用了我们的场景,并处理了世界上对象之间的所有交互。 让我们来看看DuckHunt游戏中的hunt模块。 HuntScene从scene.scn文件加载将在玩家周围显示的世界。 然后通过其公共界面共享鸭子生成点列表和一个其他节点。 我们允许HuntGameplay使用此节点为新生成的鸭子实体添加几何。 然后,我们将管理和确定系统顺序的逻辑从ECS模式转移到称为EntityManager的单独类。 因此,在他的最终形式中, HuntGameplay通过从EntityManager调用update来从View获取更新回调并将其传递给实体,然后根据需要生成新的Duck。 最后,它检查获胜条件。 如果满足,则要求线框移至下一个场景。 因此,如果您更深入地研究新层,您会发现与经典VIPER方法有些相似之处。 就像VIPER的视图等待演示者提供要显示的内容一样, 场景也等待游戏过程来确定世界上对象的新位置。 主要区别在于我们允许我们的游戏玩法向场景添加新的几何体。 […]