Notes and thoughts from Tony

ARKit(一)——初体验

Comments

ARKit 介绍

增强现实技术(Augmented Reality,简称 AR),是一种实时地计算摄影机影像的位置及角度并加上相应图像、视频、3D模型的技术,这种技术的目标是在屏幕上把虚拟世界套在现实世界并进行互动。

苹果在 WWDC2017 上推出了 [ARKit]((https://www.youtube.com/watch?v=S14AVwaBF-Y),从而能够让我们更方便的实现 AR 功能。本文通过创建简单 Demo 来体验下 ARKit 的功能。

需要注意的是:

Xcode 运行 ARKit 需要 iOS11+ 的系统,而且,硬件也有要求,设备需要具备 A9 及以上处理器(也就是 iPhone SE、iPhone6S、iPhone 6S Plus之后的设备,或 2017 年之后的 iPad)。另外,还需要 XCode 9。

创建项目

新建 XCode 项目,选择 AR App。

01

填写完项目信息后,确认 Content Technology 的选项为 Scene KitSceneKit 框架可以在 iOS 设备上渲染 3D 图形,为 ARKit 提供了渲染 3D 内容的功能。Sprite Kit 是用来渲染 2D 图像的。

02

编译运行项目,移动后会申请相机权限,同意后,便可以在屏幕中看到一架飞机。是不是很简单?作为 iOS 开发者有时也会感觉到很幸福(我肯定是忘了适配 iPhone X 的痛了)。

03

这是苹果自带的示例程序,我们需要一步步创建自己的 Demo。

viewWillAppear 方法中实例化了 ARSession。

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    
    // Create a session configuration
    ARWorldTrackingConfiguration *configuration = [ARWorldTrackingConfiguration new];

    // Run the view's session
    [self.sceneView.session runWithConfiguration:configuration];
}

绘制方块

接下来使用 SceneKit 绘制一个 3D 立方体。SceneKit 是所有 3D 内容的容器,它可以将多个 3D 物体以不同的位置,角度,尺寸等添加到场景中。

所要要在虚拟场景中添加内容,就要先创建一个几何体,然后将几何图形包装到场景节点中并将其添加到场景中。在 viewDidLoad 中添加以下代码(之前的示例代码删除):

- (void)viewDidLoad {
    [super viewDidLoad];
    // 创建 SCNScene 实例来作为所有 3D 物体的容器
    SCNScene *scene = [SCNScene new];
    // 我们要创建的正方体
    SCNBox *boxGeometry = [SCNBox
                           boxWithWidth:0.1
                           height:0.1
                           length:0.1
                           chamferRadius:0.0];
    // 将正方体封装成 SCNNode
    SCNNode *boxNode = [SCNNode nodeWithGeometry:boxGeometry];
    // 将立方体放在相机前面
    boxNode.position = SCNVector3Make(0, 0, -0.5);
    // rootNode 是 3D 场景中所有的物体的起点
    [scene.rootNode addChildNode: boxNode];
    // 将 scene 赋值给 sceneView.scene
    self.sceneView.scene = scene;
}

ARKit 中的坐标基本能用“米”对应,所以,上面的代码创建了一个 10*10*10 的立方体。

ARKit 和 SceneKit 的坐标系如下所示:

04

相机朝向的是 Z 轴的负方向,所以,是防止的 -0.5 的位置。

当 ARSession 启动时,计算出的摄像机位置初始设置为 X = 0,Y = 0,Z = 0。

现在运行项目,应该能看到漂浮在空中的立方体。

05

但是立方体的棱角并不是太明显,因为没有添加光照效果。添加下面的代码:

self.sceneView.autoenablesDefaultLighting = YES;

06

OK,这样就很容易识别出立方体了。可以通过走动来观察一下。

参考:

Apple ARKit by Example

代码:

文章中的代码都可以从我的GitHub ARKitDemo找到。