ARKit和SceneKit入门

尽管增强现实技术已经存在了很多年,并且基于目标的体验的准确性不断提高,但是诸如PokémonGO等游戏的普及以及Apple发行的ARKit和Google的Android的AR Core的推出AR掌握在大多数消费者手中。

凭借能够了解您周围世界的无目标AR的能力,我们有机会打造出引人入胜的新AR体验。 随着新能力的出现,我们在创造这些体验的工作中将面临新的挑战。 在接下来的几篇文章中,我们将逐步建立各种流程,获取3D模型,对其进行处理并将其用于我们自己的AR体验中。

可以在https://github.com/AbovegroundDan/ARTutorial_Part1上找到此文章的项目。

基本

我们的ARKit应用程序将使用SceneKit进行渲染。 SceneKit是适用于iOS的本机3D渲染引擎,可直接与ARKit挂钩。

3D模型格式

SceneKit中有一些可用的本机格式可用于加载3D模型,但我们将专注于Collada Digital Asset Exchange或DAE格式。 DAE格式使我们可以在场景文件中包含多个对象,包括相机和灯光以及任何几何图形。

SceneKit具有用于加载场景文件的例程,我们将编写一些扩展程序以简化加载。

要编辑3D模型,我们将使用Blender,因为它是免费的并且可以满足我们的需求。

尺寸和单位

SceneKit使用仪表作为尺寸调整和物理模拟的度量单位。 因此,当我们看到任何涉及尺寸的内容时,包括Xcode中的“场景编辑器”,它始终是指米。

在Blender中,我们还需要确保以米为单位工作。 Blender的默认值是米单位,但是检查总比处理场景中的巨型或微小模型要安全得多。 在Blender的右侧面板中,选择“场景”选项卡,并确保将“单位”设置为“默认”或“仪表”。

坐标系

SceneKit在“ Y向上”系统中运行,这意味着Y轴朝上,而Blender的Z轴朝上。 在导出场景并将其加载到SceneKit时,我们需要意识到这一点。 通常这不是问题,因为出口商通常会负责转换。 根据您使用的是自定义导出器还是在不同的坐标系中工作,可能需要在建模应用程序内部旋转模型。

管道

从艺术家那里获得模型或自己完成所有工作时能够快速工作的秘诀是拥有良好的工作流程。 在这种情况下,我们需要一个良好的管道来以尽可能少的按摩和处理将模型带入我们的经验。

搅拌机加工和出口

我们首先要考虑的是我们是否要使用AR世界中文件中的模型来源。 在此示例中,我们将直接从3D模型文件创建AR场景,因此我们不会做太多更改。

确保稍后进行更简单的导入的一件事是确保文件路径是相对的,以便以后稍后导入或必须将文件传输到另一台计算机时,纹理的路径将继续指向有效文件。

归一化

我建议将每个模型的当前位置,旋转和比例标准化为基准值。 例如,如果在建模过程中将模式缩放为(0.87,0.92,0.87)以更好地适合场景,则应用该缩放将使当前缩放为(1.0,1.0,1.0),但将模型保持在该大小你有过。

这可能会干扰设置为特定值的动画,但是对于静态模型而言,它可以很好地工作,并且如果我们要设置比例或旋转值的动画,可以让我们在代码中进行某些假设。

为了规范当前值,我们必须使用Blender的Apply选项应用于对象。 通过单击场景层次面板旁边的+按钮,打开属性面板。 选择模型将向我们显示以下属性。

在这里我们可以看到对象具有旋转和比例。 我们将删除对象上的旋转,但将比例保持在它们所处的值(这是我们的美术师打算如何显示对象),但是我们要做的是将这些值设为默认值或身份值。

选择对象后,我们从底部菜单栏中选择“ 对象”->“应用”->“旋转和缩放”菜单项。

完成此操作后,我们可以看到旋转值分别为(0,0,0),缩放比例为(1.0,1.0,1.0),正是我们想要的值。

在这种特殊情况下,这些对象是单独的网格对象,我们现在要做的是将它们组合在一起,以便我们可以整体上操纵这些对象。 让我们创建一个父转换并将所有这些对象作为其子对象。 从3D视图底部的“添加”菜单中,选择“ 添加”->“空”->“平轴”

在“层次结构”视图中,将“ Empty”对象重命名为“ Sphere”,然后将每个ORB对象拖动到“ Sphere”,以便它们成为Sphere的子级。

出口

我们现在准备使用此模型。 选择“文件”->“导出”->“ Collada”,并确保选择了以下纹理选项,如下所示:

这将有助于使所有纹理都附着在模型上。 所有其他默认选项应按原样工作。 保存文件,然后进行编码。

代码

ARKit项目设置

让我们开始其中的Xcode部分。 为了简洁起见,我们将从使用ARKit Xcode模板开始。 打开Xcode,然后选择File-> New-> Project或使用⇧⌘N,然后选择Augmented Reality App模板开始一个新项目。

输入项目的名称,确保代码签名和捆绑包名称正确,单击“下一步”,然后选择目录来创建项目。

创建项目后,您可以运行该应用程序,并查看示例项目在AR中显示的默认发货。 要注意的一件事是,将船放置在相对于项目开始时相机所面对的位置的位置。 终止该应用程序,然后运行几次,每次都面对不同的方向。 船舶始终以相同的距离显示在镜头前。 这是因为船在场景中的位置是-0.8米。 打开相机并开始会话时即创建场景。 如果查看“ ship.scn”文件,然后向下钻取shipMesh对象,您会发现它位于(X:0.0,Y:0.1,Z:-0.8)。 要注意的一件事是Z坐标为负。 这是因为负Z轴在相机轴上指向前方。

现在我们了解了示例应用程序的工作原理,接下来要做的是删除场景资产(船)并使用我们自己的模型。

让我们在项目中建立一个新的组,并将其称为模型。 在这里,我们将放入我们先前修改的sphere.dae文件。 将我们的模型文件及其纹理拖放到该组中,或按住Control键单击组名,然后选择“将文件添加到项目”,然后选择要添加的文件。

SceneKit导入

我们将在代码中创建一个自定义场景,使用模型加载Collada文件,然后将这些模型放入场景中。 如果要将多个模型加载到场景中,这将允许我们使用多个文件。 它还可以让我们控制添加的内容,因为很多时候我们不想导入文件中的内容,例如其他相机,灯光或空对象。 我们的目标是最大程度地减少我们在SceneKit编辑器中对源文件进行的清理量。

让我们检查一下我们的模型文件,确保旋转和比例正确,并且所有纹理均正确连接。 选择模型文件,然后通过单击场景视图左下方的选项卡按钮打开“场景图视图”。 在属性面板中选择模型和Node Inspector。

在这里我们可以看到我们所有的值都是正确的。 正如我们所期望的那样,我们在所有轴上的旋转均为0,并且比例为1.0。

我们还可以看到我们的材料很好,但是让我们切换到属性面板中的“材料”检查器以查看外观如何。 材料检查器是左侧第5个图标,看起来像一个球形。 如果发现缺少纹理的模型,则只需将纹理文件从项目检查器拖到适当的纹理通道即可。 颜色纹理贴图通常进入“漫反射”通道。

场景创建

现在我们准备好模型文件了,我们将创建一个新场景。 这将在以后设置我们以自定义场景,而不是在一个文件中包含所有内容。

在我们的项目中创建一个名为Scenes的组,并在该组中创建一个名为HoverScene的新Swift文件。 我们将定义一个包含场景的新结构。 我们将对其进行初始化,并添加几个灯光,一个环境灯光和一个定向灯光。

额外信用

尽管在您运行应用程序时,使球体出现在照相机恰好指向的任何位置的前面都是很好的,但这不是很实际。 让我们稍稍更改一下创建代码,以在点击屏幕时放置球体。

在ViewController的viewDidLoad ()方法中创建一个手势识别器:

在本系列的第2部分中,我们将介绍一些SceneKit基础知识,包括动作,动画和使用摄影机。 我们还将详细介绍如何在增强现实场景中对用户交互做出反应。

AbovegroundDan / ARTutorial_Part1
通过在GitHub上创建一个帐户来为ARTutorial_Part1开发做出贡献。 github.com