美文网首页ARKit
ARKit框架详细解析(三)—— 开启你的第一个AR体验之旅

ARKit框架详细解析(三)—— 开启你的第一个AR体验之旅

作者: 刀客传奇 | 来源:发表于2017-09-27 22:42 被阅读71次

    版本记录

    版本号 时间
    V1.0 2017.09.27

    前言

    苹果最近新出的一个API就是ARKit,是在2017年6月6日,苹果发布iOS11系统所新增框架,它能够帮助我们以最简单快捷的方式实现AR技术功能。接下来几篇我们就详细的对ARKit框架进行详细的解析。AR相关代码已经上传到Github - 刀客传奇AR相关Building-Your-First-AR-Experience,感兴趣的可以看上面几篇。
    1. ARKit框架详细解析(一)—— 基本概览
    2. ARKit框架详细解析(二)—— 关于增强现实和ARKit

    Overview - 概览

    上面GitHub中的工程示例,此示例应用程序运行ARKit世界跟踪会话,并显示在SceneKit视图中显示的内容。 为了演示平面检测,应用程序只需放置一个SCNPlane对象来可视化每个检测到的ARPlaneAnchor 对象。


    Configure and Run the AR Session - 配置和运行AR会话

    ARSCNView类是一个SceneKit视图,它包含一个ARSession 对象,用于管理创建增强现实(AR)体验所需的运动跟踪和图像处理。 但是,要运行会话,您必须提供会话配置。

    ARWorldTrackingConfiguration类提供高精度的运动跟踪功能,可以帮助您将虚拟内容放置在真实世界的表面上。 要启动AR会话,请使用所需的选项(如平面检测)创建会话配置对象,然后在ARSCNView实例的会话对象上调用runWithConfiguration:options:方法,具体如下所示:

    let configuration = ARWorldTrackingConfiguration()
    configuration.planeDetection = .horizontal
    sceneView.session.run(configuration)
    

    只有当屏幕上显示的视图才会运行会话。

    重要提示:如果您的应用程序需要ARKit的核心功能,请使用应用程序的Info.plist文件部分中的arkit键使您的应用程序仅在支持ARKit的设备上可用。 如果AR是应用程序的辅助功能,请使用isSupported 属性来确定是否提供基于AR的功能。


    在检测到的平面中放置3D内容

    设置AR会话后,可以使用SceneKit在视图中放置虚拟内容。

    当启用平面检测时,ARKit会为每个检测到的平面添加和更新锚点。 默认情况下,ARSCNView类为每个锚点的SceneKit场景添加一个 SCNNode对象。 您的视图的委托可以实现渲染器:renderer:didAddNode:forAnchor:方法来向场景添加内容。

    相关代码如下所示。

    func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
           // Place content only for anchors found by plane detection.
           guard let planeAnchor = anchor as? ARPlaneAnchor else { return }
    
           // Create a SceneKit plane to visualize the plane anchor using its position and extent.
           let plane = SCNPlane(width: CGFloat(planeAnchor.extent.x), height: CGFloat(planeAnchor.extent.z))
           let planeNode = SCNNode(geometry: plane)
           planeNode.simdPosition = float3(planeAnchor.center.x, 0, planeAnchor.center.z)
           
           /*
            `SCNPlane` is vertically oriented in its local coordinate space, so
            rotate the plane to match the horizontal orientation of `ARPlaneAnchor`.
           */
           planeNode.eulerAngles.x = -.pi / 2
           
           // Make the plane visualization semitransparent to clearly show real-world placement.
           planeNode.opacity = 0.25
           
           /*
            Add the plane visualization to the ARKit-managed node so that it tracks
            changes in the plane anchor as plane estimation continues.
           */
           node.addChildNode(planeNode)
    }
    

    如果将内容添加为与锚点对应的节点的子节点,则ARSCNView类将自动移动该内容,因为ARKit会优化其对平面位置和范围的估计。 为了显示估计平面的完整范围,此示例应用程序还实现了renderer:didUpdateNode:forAnchor: 方法,更新SCNPlane 对象的大小以反映ARKit提供的估计值,下面看一下示例代码。

    func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) {
        // Update content only for plane anchors and nodes matching the setup created in `renderer(_:didAdd:for:)`.
        guard let planeAnchor = anchor as?  ARPlaneAnchor,
            let planeNode = node.childNodes.first,
            let plane = planeNode.geometry as? SCNPlane
            else { return }
        
        // Plane estimation may shift the center of a plane relative to its anchor's transform.
        planeNode.simdPosition = float3(planeAnchor.center.x, 0, planeAnchor.center.z)
        
        /*
         Plane estimation may extend the size of the plane, or combine previously detected
         planes into a larger one. In the latter case, `ARSCNView` automatically deletes the
         corresponding node for one plane, then calls this method to update the size of
         the remaining plane.
        */
        plane.width = CGFloat(planeAnchor.extent.x)
        plane.height = CGFloat(planeAnchor.extent.z)
    }
    

    后记

    未完,待续~~~

    相关文章

      网友评论

        本文标题:ARKit框架详细解析(三)—— 开启你的第一个AR体验之旅

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