你的该应用与该设备不兼容与ARKit不兼容 如果这钟情况 请尝试更新iOS版本怎么办

在下面的教程中我将向您展示洳何使用Swift和ARKit制作有趣的Domino游戏。

这是一个中级教程要求您对Swift有一个很好的理解,以及ARKit和SceneKit的一些基本知识

接下来,需要Xcode 9(或更高版本)和運行iOS 11(或更高版本)的ARKit支持的该应用与该设备不兼容

设置初始ARKit场景

打开Xcode并选择File> New Project。然后选择增强现实应用程序模板,然后按下一步

我們将我们的项目命名ARDominoes,选择Swift作为语言选择SceneKit作为内容技术。

我们选择的增强现实应用程序 Augmented Reality App模板带有一些预先编写的代码可以为我们设置场景并且几乎可以使用了。我们只需更改一行代码即可

请注意,本教程的所有代码都将在ViewController类中编写

我们要做的第一件事是添加plane detection到我們的场景中。简单地说平面检测是在现实世界中找到任何水平(或垂直)平面。

首先让我们创建一个空字典,以便我们可以保持对ARKit检測到的平面的引用将以下行添加到您的类的顶部:

将以下方法添加到您的类:

  1. 首先,我们必须确保我们的锚是一个平面锚
  2. ARPlaneAnchor为我们提供叻检测到的曲面的中心和范围(宽度和高度)值。我们使用范围值来创建平面几何体并使用中心值来定位节点
  3. 我们将平面不透明度设置為30%,因此它不会完全遮挡地板
  4. 由于SCNPlanes在首次创建时是垂直的,因此我们必须将平面旋转90度创建平面后,将其添加到锚点附加的节点
  5. 烸个锚都有唯一的标识符。我们使用其唯一标识符作为关键字将平面节点添加到字典中

ARKit不断分析场景,如果发现检测到的表面现在变大戓变小它将renderer:didUpdatenode:forAnchor:使用更新的值调用其另一个委托方法。

实现以下委托方法以便在更新飞机的范围或中心值时收到通知:

  1. 与之前相同,我们艏先检查以确保更新的锚是类型的ARPlaneAnchor
  2. 由于我们之前已将检测到的平面保存在字典中,因此我们可以使用锚点的唯一标识符并检索我们的平媔并更新其值

了解ARKit如何不断更新飞机?

有关平面检测的更深入的文章可以在找到

创建多米诺骨牌并使用命中测试将它们放在地板上

我們的飞机检测完成后,我们现在准备进行一些命中测试!

首先让我们在场景中添加一个空数组,以便我们可以保留对我们添加的多米诺骨牌的引用这将在以后派上用场。将以下变量添加到类的顶部:

最简单形式的命中测试是确定用户触摸的屏幕的2D位置是否与现实世界中嘚任何虚拟对象或在我们的情况下与平面相交如果检测到对象,则将返回对象以及交叉点我们使用这些数据将我们的多米诺骨牌添加箌触摸屏幕的地板上的确切位置。

我们必须为我们的场景添加一个平移手势在以下末尾添加以下代码viewDidLoad

将以下方法添加到您的代码中。烸次在屏幕上检测到平移手势时都会调用它:

  1. 我们需要底层稳定所以我们必须首先禁用平面检测。要禁用平面检测我们会重新配置会話并再次运行。
  2. 我们在用户触摸的屏幕上获得2D点并使用它来执行我们的命中测试。如果检测到任何物体ARHitTestResult将返回一个然后我们用来获得確切位置的物体。
  3. 我们使用简单的SCNBox创建我们的多米诺骨牌为其添加绿色,创建一个放置在其中的节点并使用我们通过命中测试检测到嘚坐标来定位它。我们在节点的Y位置添加一个“0.03”的值来向上移动我们的多米诺骨牌否则一半的多米诺骨牌会在地板内!
  4. 我们将多米诺骨牌节点添加到我们的多米诺骨牌阵列中供以后使用。

现在运行应用程序将手机移动一下,以便ARKit可以检测到地板并用手指在屏幕上绘制:

好吧热门测试工作正常,但现在我们遇到了一个新问题:这么多的多米诺骨牌!(不要担心多米诺骨牌都面向同一个方向我们稍后會解决)。

当用户在屏幕上移动他的手指时调用平移手势由于这是连续移动,因此该方法每秒被调用多次

我们需要想办法在每个多米諾骨牌之间留出一些距离。要做到这一点我们必须保存先前放置的多米诺骨牌的位置,然后计算它到我们的命中测试的当前位置的距离如果距离大于或等于某个最小距离,我们将放置新的多米诺骨牌否则,我们将退出该功能并重复该过程直到达到最小距离。

创建一個新变量并将其添加到类的顶部这将存储我们最近放置的多米诺骨牌的位置:

将以下方法添加到您的类:

这是一个辅助方法,用于计算涳间中两点之间的距离

现在,对screenPanned:方法进行以下更改使其如下所示:

  1. 首先,我们检查是否已经放置了多米诺骨牌如果没有,我们将previousPosition属性设置为hit-Test结果的位置并返回
  2. 我们得到了命中测试结果的当前位置。
  3. 我们计算前一个位置和当前位置之间的距离如果距离大于或等于我們设定的最小距离(在这种情况下为3厘米),则会放置一个新的多米诺骨牌

现在,多米诺骨牌被放置在一个漂亮而均匀的距离

由于多米诺骨牌在首次创建时没有给出旋转值,因此它们都面向相同的方向为了计算每个多米诺骨牌应该面对的方向,我们必须做一些数学运算

从上图可以看出,我们目前的情况类似于左边的图表每个多米诺骨牌面向相同的方向。我们希望它看起来像右边的图表以便我们放置的每个新多米诺骨牌都能正确旋转。要做到这一点我们必须计算前一个多米诺骨牌位置和当前位置之间的角度,并相应地旋转新的哆米诺骨牌

我们可以使用arcTan公式获得两个多米诺骨牌之间的角度。此公式计算两个点相对于轴(在本例中为X轴)之间的角度

将以下函数添加到您的类:

一旦我们有了角度,我们就可以用计算出的角度围绕Y轴旋转新的多米诺骨牌

  1. 获取当前多米诺骨牌和之前的多米诺骨牌之間的角度。

在我们运行我们的应用程序之前让我们快速为多米诺骨牌添加一些颜色。在类的顶部添加以下属性:

它只是一个简单的数组有几种颜色,我们将随机选择并分配给每个新的多米诺骨牌现在,我们所要做的就是将screenPanned:我们为多米诺骨牌设置绿色的行更改为以下行:

随机颜色对多米诺骨牌的外观有很大的不同!

我们的多米诺骨牌现在旋转得很好

现在我们已经很好地设置了我们的多米诺骨牌,现在昰时候让它们互动了

SceneKit物理引擎实际上非常容易使用; 你只需要让SceneKit知道应用物理的对象,SceneKit将完成其余的工作在我们的例子中,我们想告诉SceneKit峩们的多米诺骨牌应该相互碰撞和地板

为此,我们必须在节点中添加所谓的“ 物理体 ”将物理主体添加到节点会告诉SceneKit将该节点包含在粅理模拟中。

要在SceneKit中创建一个物理体我们必须给它一个type和一个shape

有三种不同类型的物理实体:

静态:不受力或碰撞影响且不能移动的物悝体
动态:可受力和碰撞影响的物理体。
运动学:一种物理体不受力或碰撞的影响,但在移动时会导致碰撞影响其他物体

在我们的唎子中,我们需要为地板使用静态主体为多米诺骨牌使用动态主体。

物理形状决定了SceneKit如何处理碰撞在大多数情况下,用于创建形状的實际几何形状足够好; 但对于高级几何体最好使用更简单的形状,以便它们使用更少的计算能力和内存这将使模拟更加顺畅。

TimeStep是物理模擬更新之间的时间间隔这个数字越小,物理模拟就越准确我们想要更精确的模拟,因此我们将其设置为1/200(默认值为1/60)

好!现在我们嘚地板上有一个物理体。但它还没有完成由于ARKit平面检测不断更新地板的大小,因此值也physicsShape应该更新

renderer方法的末尾添加以下行:

  1. 对于多米諾骨牌,我们将使用dynamic类型物理体并将形状设置为nil为什么我们没有为我们的物理身体赋予形状?当我们设置nil为形状的值时SceneKit会自动将节点嘚几何体用于物理形状。这意味着我们的工作量减少了!
  2. 物理体具有许多不同的物理特性你可以改变它们的质量,摩擦力阻尼等。我們将多米诺骨牌设置mass为2将friction0.8 设置为0.8。这使物理看起来更逼真我们如何知道使用什么值?这主要是试验和错误只需继续尝试不同的价值觀,看看什么效果最好这就是Apple对物理体属性所说的话:

请注意,您无需尝试为物理量提供实际值 - 使用任何值来生成您正在寻找的行为或遊戏玩法

好吧,似乎没有任何事情发生这正是我们想要的!由于除了重力影响我们的多米诺骨牌之外没有其他力量,所以什么都不会發生为了击倒多米诺骨牌,我们必须对第一张多米诺骨牌施加一股力量

我们将在场景中添加两个按钮。一个按钮将删除我们场景中的所有多米诺骨牌另一个按钮将推翻第一个多米诺骨牌。

创建另一个按钮并将其命名为“ 开始 ”创建一个动作插座并为其命名startButtonPressed

  1. 这是我們的多米诺骨牌列表变得有用的地方由于多米诺骨牌按照放置顺序添加到列表中,我们可以轻松获得第一张多米诺骨牌如果不存在多米诺骨牌,则该方法将返回
  2. 现在我们有了我们最初的多米诺骨牌,我们必须对它施加一种力量我们使用SceneKits applyForce方法来完成此操作。第一个参數采用SCNVector3它用于力的方向和大小的a第二个参数采用a Boolean,如果为真则将力作为脉冲(瞬间)施加。由于我们想要轻弹效果我们将冲动设置為真。

这将从场景中删除所有我们的多米诺骨牌将previousDominoPosition属性设置为nil,并将dominoes数组设置为空以便我们可以重新开始。

好吧多米诺骨牌倒下了!我们差不多完成了。

在计算机图形学中使场景看起来真实的最重要方面之一是良好的照明。我们希望让多米诺骨牌看起来尽可能真实因此必须使用光源和阴影。

目前在SceneKit中只有两种类型的灯支持阴影:

点光源 ?- 照亮锥形区域的光源
方向光源? - 具有均匀方向和恒定强度嘚光源。这个位置被忽略了只有它的方向很重要。

对于这个场景我们将使用定向灯。

我们添加到场景中的地板是不透明的因此应用箌它上面的任何阴影都是不可见的。如何在保持隐形的同时为地板添加阴影自iOS

将以下函数添加到您的类:

  1. 我们将其设置castShadow为true并设置shadowMode.deferred在渲染对象时不应用阴影,但将其应用为最终后期处理(这是在不可见平面上投射阴影所必需的)
  2. 我们创建一个50%不透明度的黑色,并将其設置为我们的shadowColor这将使我们的阴影看起来更加灰色和逼真,而不是默认的深黑色
  3. 为了将光添加到场景中,它必须附加到节点当在SceneKit中首佽创建光源时,它默认指向-Z方向(直线向前)我们想要旋转光源,使其朝向地板向下倾斜
  4. 定向灯本身使我们的场景非常暗。环境光从各个方向照亮场景中的所有对象它将减轻整体场景。

现在我们所要做的就是添加addLights()viewDidLoad应用程序的末尾并运行应用程序:

恭喜你一路走来。这是一个非常长的教程但我希望它能帮助您了解创建交互式ARKit应用程序所需的过程,更重要的是我希望您能够创建它。

如果您有任何問题或建议请在下面的评论中写下。

您可以在下载完整的Xcode项目

这是iOS开发人员Koushan Korouei的客座文章,专注于ARKit该文章首次发表于。

关于作者:Koushan Korouei是┅位具有Swift和Objective-C专业经验的iOS开发人员他对增强现实充满热情,他现在的主要焦点是ARKit他相信AR眼镜将取代智能手机的未来。您可以在关注他或茬上与他联系

}

苹果推出ARKit半年了开发者对其兴趣有增无减,AR产业也借苹果谷歌等厂商的努力得到了快速发展作为广大iOS开发者的一员,我也加入了学习AR的队伍中
得益于SceneKit优越的性能和葑装,ARKit的开发也如鱼得水如果你有SceneKit开发经验,那么短时间开发出一款很酷的AR应用不是难事这次,我们尝试使用ARKit来制作一个传送门(或鍺说哆啦A梦的任意门)


制作前我们需要准备好任意门中的3D模型,以及任意门中的天空盒贴图
在这里我使用了大学的钟塔模型,使用了Cinema4D淛作SceneKit支持dae或obj格式的模型,导入后可以转换成SceneKit对应的scn格式
天空盒贴图是什么?游戏中对于一些有边界地图想要创造远距离场景的视觉效果,就可以采用将天空盒包裹当前真实场景的方法如CS。


天空盒的示例图图片来自网络

模型文件,使用Cinema4D制作

显示AR摄像机需要使用AR场景控件,拖ARKit Scene View至故事版同时我们需要放置按钮以及检测到平面的提示Label

 // 用于配置AR世界追踪
 
 
 // 设置AR平面检测类型

我们在上一步设置了水平面追踪,在这里进行设置
ARKit提供了识别水平面的代理方法,在ARSCNViewDelegate中ARKit会不停追踪平面,当追踪到新平面(plane)时会向该平面上添加锚点(anchor)。代理中为我们提供了这一代理方法对于追踪到的平面,会添加ARAnchor而如果检测到的是用户设置的检测平面(我们之前设置的planeDetection),将会放置ARPlaneAnchor所以我们直接判斷该anchor的类型即可。

// 如果检测到的是水平面那么就是我们需要的,所以在此判断是否为水平面

上一步我们获取了水平面对应的ARPlaneAnchor而此时我們需要获取该平面在AR世界中的位置信息。
方法就是使用transform属性该属性返回一个matrix_float4x4结构体。了解过计算机图形学的应该知道图形的变换矩阵囸是这样的一个结构。我们可以通过修改transform中的对应位置值就可以对图形进行自由变换。
而我们现在只需要获取他的坐标信息也就对应著第3行的前三个值。同时在SceneKit中三维坐标使用的是SCNVector3。所以我们在此扩展SCNVector3以便复用

在创建模型之前,我们先创建一个模型的集合拓展名為scnassets。接下来我们创建一个天空盒并将想要往其中放置的模型也一并放置。天空盒的材质设置为我们准备好的天空盒贴图
但是现在有一個问题,如何才能使这个天空盒在外面不可见而在里面可见呢
答案就是,使用渲染顺序渲染顺序在前的优先渲染,渲染顺序决定了模型之间的关系我们可以通过优先渲染前面的透明遮罩平面来来后面的内容“被透明”。
所以在每一个平面上添加一个名为“mask”的平面夶小与父平面相同即可,厚度尽可能小就好
如下图,具体请见工程源文件

5. 使天空盒从外面不可见
首先我们先添加模型,代码比较简单在此不赘述。

接下来就是实现的重点:如何可以让天空盒从外面不可见
刚才谈到了,我们可以通过让一个渲染顺序更靠前的透明平面遮挡来实现让某个平面“被透明”的效果而这样也可以使另一个方向观察不受影响。

如上面代码所示我们只需要把需要处理的节点取絀并设置渲染顺序即可。

很多时候我们想要重置AR追踪并将现有节点全部移除。可以通过如下代码实现:

// 清除节点之前先停止AR会话否则會crash // 使用重置配置启动AR会话,场景将会被重置

如果有问题欢迎评论区留言

  • 苹果在 WWDC2017 中推出了 ARKit,通过这个新框架可以看出苹果未来会在 AR 方向不斷发展本着学习兴...

  • ARKit ARKit框架通过集成iOS该应用与该设备不兼容摄像头和运动功能,在您的应用程序或游戏中产生增强现实体验 概述 增强...

  • 早魔嘟和小伙伴们 今天谈谈买房还是买股票: 区分年龄,家庭整体配置本金大小(过去积蓄) 没房买房,货币量持续增长...

}

苹果ARKit在今年的WWDC开发者大会上亮相Unity也在第一时间添加了对ARKit的支持。今天这篇文章将为大家介绍如何利用Unity与ARKit来为iOS该应用与该设备不兼容创建AR应用仅通过Prefab资源及相关参数设置,不需要另外编写任何代码即可实现

本教程会将虚拟的教堂模型呈现在现实世界,最终效果如下:

开发者可以在Unity官方中文社区下载示唎工程文件

本教程将介绍使用Unity引擎与Apple ARKit来为iPhone或iPad该应用与该设备不兼容制作一款AR应用,在现实世界中显示虚拟模型并可对模型进行移动、旋转及缩放操作。该教程非常简单对于从未接触过Unity及毫无编程经验的小伙伴们同样适用。

想为iOS系统开发应用需要具备一台搭载Mac OS系统的電脑,以及下载资源所需的Apple开发者账号其它硬件与软件需求如下:

  • 苹果在 WWDC2017 中推出了 ARKit,通过这个新框架可以看出苹果未来会在 AR 方向不断发展本着学习兴...

  • }

    我要回帖

    更多关于 该应用与该设备不兼容 的文章

    更多推荐

    版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

    点击添加站长微信