使用ARKit编写您的第一个增强现实应用程序

直到最近,增强现实还是科幻小说乌托邦中刻画的“未来主义”思想之一。 但是构建AR应用程序的时机已经到来,您可以随身携带一个。

在本教程中,您将学习如何将离地球最近的火星带入自己的房间。

入门

Xcode版本

在开始之前,请确保您的Mac上安装了最新版本的Xcode。 这非常重要,因为ARKit仅在Xcode 9或更高版本上可用。 您可以通过打开Xcode并转到上方工具栏中的Xcode > 关于Xcode来检查您的版本。

如果您的Xcode版本早于Xcode 9,则可以转到Mac App Store并免费进行更新。 如果您还没有Xcode,也可以免费下载并安装。

样例项目

新项目

确定具有正确版本的Xcode之后,您需要创建一个新的Xcode项目。

继续并打开Xcode,然后单击“ 创建新的Xcode项目”。

图1创建一个Xcode项目

您可能习惯于制作“ 单视图”应用程序,但是对于本教程,您将需要选择“ 增强现实”应用程序 ,然后单击“ 下一步”。

图2选择一个增强现实应用
游戏框架

您可以根据自己的喜好为项目命名,但我将命名为ARPlanets。 您还将注意到,底部有一个选项,您可以从其中选择SceneKit,SpriteKit和Metal。

这些都是Apple的游戏框架,在本教程中,我们将使用SceneKit,因为我们将使用3D对象。

继续并选择SceneKit(如果尚未选择)。 您的屏幕应如下所示:

图3创建您的项目

准备测试

连接iPhone

由于Xcode Simulator没有相机,因此您需要插入iPhone。 不幸的是,如果您没有iPhone,则需要借用一本才能随本教程一起使用(以及与其他任何与相机相关的应用程序)。 如果您已经将iPhone连接到Xcode,则可以跳到下一步。

Xcode 9中的一个令人讨厌的新功能是您可以在设备上无线调试应用程序,因此让我们花点时间现在进行设置:

在顶部菜单栏中,选择“ 窗口” >“ 设备和模拟器”。 在出现的窗口中,确保在顶部选择了设备

现在,使用避雷线插入设备。 这应该使您的设备出现在“ 设备和模拟器”窗口的左窗格中。 只需单击您的设备,然后选中通过网络连接框。

图4设备和模拟器

现在,您将可以在所有未来的应用程序的iPhone上进行无线调试。

完成设定

现在您的设置完成。 您应该有一个运行良好的ARKit应用程序,并且可以在刚刚连接的iPhone上对其进行测试。 在Xcode左上方的“ 运行”和“ 停止”按钮旁边,选择 模拟器下拉菜单中的设备。

图5选择一个模拟器

我已经选择了Vardhan的iPhone,但是您需要选择特定的设备。

现在,您已经完成了创建入门项目的工作,单击“运行”后 ,您应该会看到虚拟飞船出现在您的世界中 它应该是这样的:

增强现实飞船

深潜

好的,我们终于准备好深入研究并编写一些代码了。 您已经有一个可以正常工作的ARKit应用,因此让我们在此基础上做一些有趣的事情。

探索样本项目

节点和纹理

如果查看名为art.scnassets的文件夹,您会注意到它已经包含了两件事:宇宙飞船节点及其纹理。 在此示例中,Apple创建了一个空白的宇宙飞船对象,并基本上使用图像叠加层来形成其颜色和形状。

同样,我们将创建自己的球体,并覆盖火星表面图像以创建火星的准确表示。

探索示例代码

Xcode中的ARKit模板附带了一堆预先编写的代码,以使飞船出现,因此,让我们花一些时间来探索一切的含义以及它为什么起作用。

在文件顶部,您将看到以下内容:

import UIKit
import SceneKit
import ARKit

在顶部,正在导入UIKit ,我们需要它,因为主视图将是UIViewController 。 还记得在项目设置中选择SceneKit的时候吗? 它正与下面的ARKit一起导入。 这些是此文件使用的所有库。

在此之下,您将看到一个类声明和以下代码行:

@IBOutlet var sceneView: ARSCNView!

我们在这里不需要深入,但这是一个增强现实SceneKit视图,该视图通过@IBOutlet链接到情节@IBOutlet 。 这是我们将在本教程中放置的所有内容的主要视图。

再往前走一点 viewDidLoad()方法应如下所示:

override func viewDidLoad() {
    super.viewDidLoad()
  
    // 1
    sceneView.delegate = self
    
    // 2
    sceneView.showsStatistics = true
    
    // 3
    let scene = SCNScene(named: "art.scnassets/ship.scn")!
    
    // 4
    sceneView.scene = scene
}

这是此代码的作用:

  1. 还记得链接到情节sceneView吗? 我们正在将其委托分配给我们的ViewController ViewController 因为它符合ARSCNViewDelegate协议。
  2. 下一行代码是可选的,当您实际在App Store上发布时,需要将其禁用(设置为false)。 这将显示诸如FPS的数据和其他性能数据。
  3. 以前,我们在名为art.scnassets的文件夹中看到了ship.scn文件(3D渲染) 在这一行中,正在创建SCNScene ,它是节点的层次结构(在这种情况下,是飞船及其摄像头)。
  4. 最后,将场景添加到sceneView ,该场景通过@IBOutlet连接到情节@IBOutlet

我们没有涵盖ViewController.swift文件中的每一行,但是我们要涵盖的内容对您来说很重要,以便将来与本教程一起学习并构建自己的ARKit应用。

创造火星

卸下太空飞船

由于我们将在ARKit应用中制作行星而不是宇宙飞船,因此您需要将其删除。

首先,从art.scnassets文件夹中删除以下两个文件: ship.scntexture.png 。 我们将不再需要这些。

接下来,返回您的ViewController.swift文件并找到以下代码行:

// Create a new scene
let scene = SCNScene(named: "art.scnassets/ship.scn")!

由于我们不再拥有ship.scn文件,因此此代码行将导致我们的应用程序崩溃,尤其是因为此行末尾的感叹号将其强制。 由于我们不会在船上使用.scn文件,因此无需使用字符串初始化SCNScene

只需将以下代码替换为以下代码:

// Create a new scene
let scene = SCNScene()

如果现在运行您的应用程序,您将看到现实,但不会得到增强。 换句话说,宇宙飞船将消失。

功能声明

viewDidLoad()下方,创建一个函数声明,如下所示:

// Creates planet Mars
function createMars() {
    // Do stuff
}

创建某些东西而不返回它似乎没有意义吗? 在函数中,我们将需要返回一个SCNNode 。 在此过程中,我们还要输入一个行星位置的参数。

进行这些修改之后,您的方法应如下所示:

// Creates planet Mars
function createMars(at position: SCNVector3) -> SCNNode {
    // Do stuff
}
编码球体

由于火星是球形的,因此让我们创建一个球体作为火星的基本形状。 您可以选择直接在viewDidLoad()方法中执行此操作,但是我们将使用上面声明的函数。

在函数内部,插入以下代码:

// 1
let sphere = SCNSphere(radius: 0.4)

// 2
let node = SCNNode(geometry: sphere)

// 3
node.position = position

// 4
return node

这是此代码的作用:

  1. 这条线创建半径为0.4 SCNSphere类型的球体。
  2. 在这里,我们仅将球体变成一个SCNNode即可将其返回到函数调用站点。
  3. 当我们将位置作为createMars()函数的参数时,我们将在此处使用该参数设置在上一行中创建的SCNNode的位置。
  4. 这只是将SCNNode返回到函数。
添加球体

到目前为止,我们已经创建了一个球体,但是要使其完全显示,我们需要将其添加到当前场景中。 为此,请将以下三行代码添加到viewDidLoad()方法中:

// 1
let position = SCNVector3(0, 0, -3)

// 2
let mars = createMars(at: position)

// 3
scene.rootNode.addChildNode(mars)

这是代码的作用:

  1. 该行创建一个SCNVector3类型的位置(这是空间中一个点的三维表示),该位置将传递到我们之前创建的createMars()函数中。
  2. 在这里,我们调用createMars()并从上一个变量传入位置。 接下来,我们将将此函数返回的节点分配给名为mars的变量。
  3. 之后,我们将mars添加到Apple的示例项目中提供的场景中。

哇! 我们已经取得了相当大的进步。 如果现在运行您的应用程序,您应该能够看到世界上某个地方有一个白色的球体。 如果尝试从其他角度看它,它看起来就像一个圆,但这是因为我们还没有任何纹理或阴影。 这是它的外观:

无纹理的AR球体
添加纹理

现在我们有了一个球体,我们需要添加一个纹理,使其看起来像实际的行星火星。 我只是搜索了火星表面的照片,并且将使用它,但是您可以使用任何您想要的照片(如果您要混合,甚至可以使用其他行星的纹理)。

要使用刚刚得到的图像,您需要将其放置在两个文件夹中: art.xcassetsart.scnassets 。 需要注意的另一件事:如果您希望能够将此代码复制并粘贴到您的项目中,则需要将图像命名为mars_texture.png ,并且必须为PNG   文件。

在函数createMars()return行之前添加以下代码:

let material = SCNMaterial()
material.diffuse.contents = #imageLiteral(resourceName: "mars_texture.png")
sphere.firstMaterial = material

首先,我们创建一个SCNMaterial ,SceneKit可以在以后使用该SCNMaterial包裹球体,然后将其分配给名为material的常量。 然后,我们将选定的图像SCNMaterial然后将其重新分配给默认SCNMaterial的内容。 换句话说, material常数现在包含要用作SCNMaterial图像。 最后,我们用先前制作的SCNMaterial包裹球体。

现在您已经完成了,并且如果您运行应用程序,则可以在房间里看到火星! 您甚至可以在它周围走动,并从不同角度观看它。 外观如下:

火星在你的后院

结论

现在,您可以看到在您的应用程序中实现增强现实有多么容易。 您可以通过它发挥想象力,甚至制作出完整的游戏。 如果您具有更多的三维三维渲染技术,也可以将其与您的技能集成。

希望本教程对您有帮助,您喜欢它!

翻译自: https://code.tutsplus.com/tutorials/code-your-first-augmented-reality-app-with-arkit--cms-29705

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值