专栏首页Charlie's RoadARKit上手 添加3D物体

ARKit上手 添加3D物体

创建项目 首先打开Xcode,选择ARKit模板,如下所示:

AR项目创建

之后,填写完项目信息后,选择Content Technology为SceneKit,当然也可以选择SpriteKit,不过在3D空间中就不是那么立体了。 开发语言选择Swift,Swift天然亲和ARKit,很多网上的Demo都是用Swift写的,这样也方便移植和借鉴。

然后连接你的测试设备并运行,app就可以运行了。该模版APP会在实施摄像头镜头中展示一架飞机的3D模型。如下图所示:

3D飞机

实际项目中,你也可以不使用该模版来创建项目,直接引入相关库也可以进行开发。

在项目中可以看到viewWillAppear方法中已经初始化了ARWorldTrackingConfiguration实例。

override func viewWillAppear(_ animated: Bool) {

  super.viewWillAppear(animated)  

  // Create a session configuration
  let configuration = ARWorldTrackingConfiguration()

  // Run the view's session
  sceneView.session.run(configuration)

} 放置3D物体 SceneKit有一些基础类,SCNScene是所有3D内容的容器,可以在其中添加多个3D物体。 要向scene中添加内容,要创建SCNGeometry,然后将其包装为SCNNode并添加到SCNScene中。

首先注释掉let scene = SCNScene(named: "art.scnassets/ship.scn")! sceneView.scene = scene,然后添加代码如下:

override func viewDidLoad() {

super.viewDidLoad()
// 存放所有3D几何体的容器
let scene = SCNScene()

// 想要绘制的 3D 立方体
let boxGeometry = SCNBox(width: 0.1, height: 0.1, length: 0.1, chamferRadius: 0.0)

// 将几何体包装为node以便添加到scene
let boxNode = SCNNode(geometry: boxGeometry)

// 把box放在摄像头正前方
boxNode.position = SCNVector3Make(0, 0, -0.5)

// rootNode是一个特殊的node,它是所有node的起始点
scene.rootNode.addChildNode(boxNode)

// 将 scene 赋给 view
sceneView.scene = scene

} 现在运行该项目,就会看到有3D立方体悬浮在空中,并且全方位无死角。

此外还可以增加一些调试信息

// ARKit统计信息例如fps等 sceneView.showsStatistics = YES;

sceneView.debugOptions = [ARSCNDebugOptions.showFeaturePoints]; // 调整摄像头属性 当前摄像头有效直径在10m范围内 if let camera = sceneView.pointOfView?.camera {

camera.wantsHDR = true
  camera.wantsExposureAdaptation = true
  camera.exposureOffset = -1
  camera.minimumExposure = -1
  camera.zFar = 10

} 之前简单体验了ARKit的功能,下面简单介绍ARKit的工作原理:

ARKit工作原理 在ARKit中,创建虚拟3D模型其实可以分为两个步骤:

相机捕捉现实世界图像–由ARKit实现 在图像中显示虚拟3D模型/2D模型–由SceneKit/SpriteKit实现 ARKit中ARSCNView用于显示3D虚拟AR的视图,它的作用是管理一个ARSession,一个ARSCNView实例默认持有一个ARSession。 在一个完整的AR体验中,ARKit框架只负责将真实世界画面转变为一个3D场景,这一个转变的过程主要分为两个环节:由ARCamera负责捕捉摄像头画面,由ARSession负责搭建3D场景,而将虚拟物体显示在3D场景中则是由SceneKit框架来完成,每个虚拟物体都是一个节点SCNNode,每个节点构成一个场景SCNScene。 ARCamera只负责捕捉图像,不参与数据的处理。它属于3D场景中的一个环节,每一个3D Scene都会有一个Camera,它决定了我们看物体的视野。 下图是ARKit与SceneKit的框架关系图:

ARKit class结构

ARSessionConfiguration的主要目的就是负责追踪相机在3D世界中的位置以及一些特征场景的捕捉(例如平面捕捉),这个类本身比较简单却作用巨大。ARSessionConfiguration是一个父类,为了更好的看到增强现实的效果,苹果官方建议我们使用它的子类ARWorldTrackingSessionConfiguration,该类只支持A9芯片之后的机型,也就是iPhone6s之后的机型。

当ARWorldTrackingSessionConfiguration计算出相机在3D世界中的位置时,它本身并不持有这个位置数据,而是将其计算出的位置数据交给ARSession去管理,而相机的位置数据对应的类就是ARFrame。ARSession类一个属性叫做currentFrame,维护的就是ARFrame这个对象。

ARFrame

ARKit的完整运行流程可以参考下图:

ARSCNView加载场景SCNScene SCNScene启动ARCamera开始捕捉图像 ARSCNView开始将SCNScene的场景数据交给ARSession ARSession通过管理ARSessionConfiguration实现场景的追踪并且返回一个ARFrame(添加3D物体模型时计算3D模型相对于相机的真实矩阵位置时需要使用) 给ARSCNView的SCNScene添加一个子节点(SCNNode) ARKit工作流程

本文将会使用ARKit创建一个简单的app,结束时就可以在AR世界里放置3D物体,并且可以用iOS设备绕着它移动。虽然这是一个非常简单的app,我们会在之后的文章中继续为其编写更多功能,包括平面检测、3D物理效果等其他东西。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Swift算法俱乐部:Swift栈(Stack)数据结构

    翻译自raywenderlich网站iOS教程Swift Algorithm Club系列

    用户3539187
  • 类方法load和initialize的区别

    Objective-C作为一门面向对象语言,有类和对象的概念。编译后,类相关的数据结构会保留在目标文件中,在运行时得到解析和使用。在应用程序运行起来的时候,类的...

    用户3539187
  • Python文件读写保存操作

    上面的代码其实没啥要介绍的,就是一个for循环然后逻辑和单个文件读操作一样,只是多了个写操作。

    用户3539187
  • 探秘|决定未来的八大核心科技

    在新兴科技高速发展的今天,各个技术风口你方唱罢我登场,把我们裹挟其中,无论是创业者,还是大公司的决策人,都需要时刻判断趋势。 也许每个人心里都在想类似的问题:“...

    灯塔大数据
  • 腾讯优图,互联网趋势和场景驱动下的AI创新

    引言:6.14日“腾讯创新日:科技年技术盛宴”代表腾讯各个事业群技术实力的四级专家、腾讯微创新2016年度创意获奖团队欢聚一堂,一起畅谈AI、系统安全、架构设计...

    腾讯大讲堂
  • 一个非典型Spring循环依赖的问题分析

    这两天工作遇到了一个挺有意思的Spring循环依赖的问题,但是这个和以往遇到的循环依赖问题都不太一样,隐藏的相当隐蔽,网络上也很少看到有其他人遇到类似的问题。这...

    猿天地
  • 这个Spring循环依赖的坑,90%以上的人都不知道

    这两天工作遇到了一个挺有意思的Spring循环依赖的问题,但是这个和以往遇到的循环依赖问题都不太一样,隐藏的相当隐蔽,网络上也很少看到有其他人遇到类似的问题。这...

    黄泽杰
  • 手把手撸PHP扩展 0x08: 协程创建(四)

    size是结构体zend_fcall_info的大小,通过sizeof(fci)计算得到。

    桶哥
  • Spring框架注解扫描开启之配置细节

    Spring框架对Bean进行装配提供了很灵活的方式,下面归纳一下主要的方式: • 在XML中进行显示配置 • 在Java中进行显示配置 •...

    用户1208223
  • Lync 2013持久聊天迁移至Skype for Business

       前几篇文章已经讲解了Lync就地升级至Skype for Business,原来Lync中建的持久聊天室如何迁移到SkypeForBusiness,下面讲...

    杨强生

扫码关注云+社区

领取腾讯云代金券