ARKit by Example - 第1部分:AR立方体

这篇第一篇文章将使用ARKit创建一个非常简单的hello world AR应用程序。最后,我们将能够在增强的世界中定位3D立方体,并使用我们的iOS设备移动它。

要在ARKit中呈现3D内容,我们将使用SceneKit:https//developer.apple.com/scenekit/这是一个在iOS设备上渲染3D图形的框架。如果您熟悉基本的3D概念,那将非常简单。

如果你不能等到文章结尾,这里有一个应用程序的视频。正如您在使用ARKit时所看到的,我们可以将虚拟对象放置在现实世界中,并在我们移动相机时将它们固定到位。

即使这是一个非常简单的应用程序,我们将通过这些系列文章继续构建越来越多的功能,包括几何检测,3D物理和更多有趣的东西。

Youtube

要求

截至撰写本文时,您需要一台带有A9 / A10处理器的iOS设备来支持ARKit。这意味着iPhone 6S或更好,或iPad 2017或更好。

对于sfotware,您需要安装:

安装好后,您就可以开始了。

创建项目

首先打开XCode,选择ARKit项目模板:

XCode 9 Beta - 新项目模板选择器

填写项目详细信息,确保选择“Scene Kit”作为“内容技术”选项。默认情况下可能会说“Sprite Kit”用于2D渲染,但我们想要用于渲染3D内容的“Scene Kit”。

image.png

运行项目,如果设备上的所有内容都按预期工作,您应该会看到一个应用程序,其中显示了实时摄像头源和位于物理空间中的飞机的3D模型。

移动并观察飞机在现实世界中保持的位置,即使您移动相机也是如此:

image.png

示例项目中的上述示例实际上比我们要创建的更高级,但这里的重点是学习如何从头开始编写这些项目,以便打开项目,并从viewDidLoad方法中删除所有代码(除了超级电话)。

ARKit核心课程

ARSCNView  - 辅助视图,有助于使用SceneKit渲染的3D内容增强实时摄像机视图。这堂课有几件事:

  • 从视图中的设备相机渲染实时视频流,作为3D场景的背景
  • ARKit的3D坐标系与SceneKit的3D坐标系匹配,因此在此视图中渲染的对象将自动匹配增强的ARKit世界视图
  • 自动移动虚拟SceneKit 3D相机以匹配ARKit跟踪的3D位置,因此不需要额外的代码来连接ARKit移动事件以映射到SceneKit 3D渲染。

ARSession  - 每个增强现实会话都需要一个ARSession实例。它负责控制摄像机,从设备中收集所有传感器数据等,以构建这种无缝体验。ARSCNView实例已经有一个ARSession实例,您只需要在启动时配置它。

ARWorldTrackingSessionConfiguration  - 此类向ARSession指示我们想要使用六个自由度来跟踪现实世界中的用户,滚动,俯仰,偏航和X,Y和Z中的平移。这使我们可以在您可以创建AR体验不仅可以在同一个位置旋转以查看增强内容,还可以在3D空间中移动对象。如果您不需要翻译部分,并且用户在项目扩充内容时保持静止,则可以使用ARSessionConfiguration类来初始化ARSession实例。

对于本系列的第1部分,我们只需要这些类,还有更多,但这是一个很好的起点。回到我们的项目,我们可以在viewWillAppear方法中看到初始化ARSession实例,self.sceneView引用ARSCNView实例。

- (void)viewWillAppear:(BOOL)animated {
  [super viewWillAppear:animated];
  // Create a session configuration
  ARWorldTrackingSessionConfiguration *configuration = [ARWorldTrackingSessionConfiguration new];
  // Run the view's session
  [self.sceneView.session runWithConfiguration:configuration];
}

绘制立方体

我们将使用SceneKit绘制3D立方体。SceneKit有几个基本类,SCNScene是所有3D内容的容器,您可以在场景中添加多个3D几何体,包括各种位置,旋转,比例等。

要向场景添加内容,首先要创建一些几何体,几何体可以是复杂的形状,或简单的形状,如球体,立方体,平面等。然后将几何体包裹在场景节点中并将其添加到场景中。然后SceneKit将遍历场景图并渲染内容。

要添加场景并绘制立方体,我们将在viewDidLoad方法中添加以下代码:

- (void)viewDidLoad {
  [super viewDidLoad];
  // Container to hold all of the 3D geometry  
  SCNScene *scene = [SCNScene new];
  // The 3D cube geometry we want to draw
  SCNBox *boxGeometry = [SCNBox 
                          boxWithWidth:0.1 
                          height:0.1 
                          length:0.1 
                          chamferRadius:0.0];
  // The node that wraps the geometry so we can add it to the scene
  SCNNode *boxNode = [SCNNode nodeWithGeometry:boxGeometry];
  // Position the box just in front of the camera
  boxNode.position = SCNVector3Make(0, 0, -0.5);
  // rootNode is a special node, it is the starting point of all
  // the items in the 3D scene
  [scene.rootNode addChildNode: boxNode];
  // Set the scene to the view
  self.sceneView.scene = scene;
}

ARKit中的坐标大致对应于米,因此在这种情况下,我们创建一个10x10x10厘米的盒子。

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

image.png

正如您在上面的代码中所看到的那样,摄像机前面的摄像机位置为-0.5,因为摄像机面向负Z方向。

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

如果您现在运行该示例,您应该会看到一个漂浮在空间中的小型立方体,当您四处移动时,它可以保持它的位置,您应该能够一直走动,向下看,在它上面。

我们想要做的一个快速调整是在3D场景中添加一些默认光照,这样我们就可以看到立方体的两侧,我们可以稍后添加一些更高级的光照但是现在我们可以在SCNScene实例上设置autoenablesDefaultLighting :

self.sceneView.autoenablesDefaultLighting = YES;

下一篇文章

在下一篇文章中,我们将开始使我们的应用程序更有趣,添加一些更复杂的对象,检测场景中的平面以及与场景中的几何体交互,敬请期待...

原文:�https://blog.markdaws.net/arkit-by-example-part1-7830677ef84d
作者:Mark Dawson

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容