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开发做出贡献。

github.com