美文网首页ARKit
如何在iOS11中使用ARKit创建测量应用(尺子)

如何在iOS11中使用ARKit创建测量应用(尺子)

作者: 长风浮云 | 来源:发表于2017-10-25 17:20 被阅读0次

    我相信,当苹果在WWDC大会上宣布一个新的框架——ARKit时,你们中的许多人(像我一样)都非常激动。演示非常有趣,我们大多数人开始思考:使用这个框架我们还能实现什么?在本文中,我将向您展示如何创建一个基本的测量应用程序(尺子),这是真实的——您的设备能够测量真实世界中的事物!但是,现在,让我们从零开始。

    什么是ARKit?

    这是iOS 11的一个框架,它允许我们将数字对象与现实世界融合在一起。这真的是新事物吗?绝对不是。

    我们以前也见过类似的东西,比如口袋妖怪GO游戏或宜家应用程序,但现在更容易实现同样的效果(甚至更好!)结果,只需要付出更少的努力。

    不过,你需要记住的是,ARKit需要在苹果A9和A10处理器上运行。

    开始写代码吧!

    首先,我们必须创建一个支持ARKit的新空项目。Xcode 9现在有了一个单独的模板。

    Zrzut-ekranu-2017-07-13-o-11.40.11-461x327@2x.png

    为什么使用模板要比自己写好?在配置过程中,我们可以选择需要展现的内容技术,如:SpriteKit, SceneKit 和 Meta。

    在SceneKit(在这个demo中,我选择了该技术)的情况下,我们可以看到一个art.scnassets文件夹与ship场景(在WWDC17中很有名),默认的配置和场景设置,处理方法,如运行或暂停场景,以及会话错误处理方法(didFailWithError,wasInterrupted和interruptionEnded)。在storyboard中ARSCNView对象已经与ViewController关联。

    在这个demo中,通过屏幕的中心简单的检测世界并且将我们检测到的结果通过我创建了一些标签来显示出来。

    接下来我们要做的是配置session并设置sessionConfig。到目前为止,我们只能探测到水平平面,但这并不是主要问题,因为在我们的应用中,我们将会涉及到特征点(features points)。等等,特征点是什么?

    特征点-由框架确定的作为表面的一部分的点。基于这些,我们能够探测到事物。

    在这个demo中,我们不需要检测平面(到目前为止,只有水平平面可用),所以默认的配置就足够了。

    func setupScene() {
            sceneView.delegate = self
            sceneView.session = session
            
            session.run(sessionConfig, options: [.resetTracking, .removeExistingAnchors])
            
            resetValues()
    }
    

    特征点在哪里?

    好了,为了能够进行正确的检测,我们需要一个函数来检测特征点,然后将其转换为三维坐标来计算它们之间的距离。下面是我们检测功能的简短描述。在ARSCNView的扩展中:

    func realWorldVector(screenPos: CGPoint) -> SCNVector3? {
            let planeTestResults = self.hitTest(screenPos, types: [.featurePoint])
            if let result = planeTestResults.first {
                return SCNVector3.positionFromTransform(result.worldTransform)
            }
            
            return nil
    }
    

    在上面我们已经设置了session的代理。
    接下来,我们需要实现updateAtTime的方法,并调用我们的检测方法。也不要忘记改操作必须在主线程上完成。

    func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) {
            DispatchQueue.main.async {
                self.detectObjects()
            }
    }
    

    它是如何工作的呢?我们需要在ARSCNView中调用hitTest,并将期望的结果类型设置为特征点。一旦我们得到了结果,我们就从数组中获取第一个对象并且调用辅助方法通过矩阵变换获取坐标点。

    基本上,最难的部分完成了。

    现在我们必须“保存”我们想要测量的物体的开始点和结束点。这两个点是SCNVector3类型的,所以我们需要计算它们之间的距离。

    非常简单:

    func distance(from vector: SCNVector3) -> Float {
            let distanceX = self.x - vector.x
            let distanceY = self.y - vector.y
            let distanceZ = self.z - vector.z
            
            return sqrtf((distanceX * distanceX) + (distanceY * distanceY) + (distanceZ * distanceZ))
     }
    

    好了,现在我们可以查看效果了。

    如何做到这一点呢?当你点击并按住,应用程序就会开始测量,第一次点击的点作为开始点,一旦手指松开,测量就会完成。

    总结:

    有时,我们会得到一些奇怪的结果,不要惊讶,因为这是由于特征点。我们一次会获得很多特征点,因此我们可能没有用最好的特征点去开始测量,所以尝试着移动设备,以获取更好的检测结果。
    github地址
    原文链接

    measuring_ios_4.gif

    相关文章

      网友评论

        本文标题:如何在iOS11中使用ARKit创建测量应用(尺子)

        本文链接:https://www.haomeiwen.com/subject/npeqpxtx.html