美文网首页
ARKit (四)

ARKit (四)

作者: V_coa | 来源:发表于2018-06-17 16:59 被阅读34次

ARAnchor 是包含对真是世界位置和方向的转换,anchor 是看不见的,它仅仅是一个对象在 ARKit 的场景中,ARKit 用一个空的 SCNNode 来代表 ARAnchor, 所需要做的就是把 content 作为子节点添加到它上面去。

image.png

ARPlaneAnchor 包含了位置和方向,和另外一些平面的信息,包括,中点,大小。

观察平面

为了让 ARKit 观察平面,需要设置 ARConfiguration 对象

config.planeDetection = .horizontal

也可以设置为检测竖直的平面

config.planeDetection = .vertical

Handling new plane anchor

func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) 当有新的锚点添加的时候将会触发,当触发这个方法的时候可以添加内容到这个锚点上

    func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
        guard let planeAnchor = anchor as? ARPlaneAnchor else { return }
        DispatchQueue.main.async {
            let newNode = self.createARPlaneNode(planeAnchor: planeAnchor, color: UIColor.yellow.withAlphaComponent(0.5))
            node.addChildNode(newNode)
        }
    }

ARKit 可能没有检测到平面完整的信息,这个时候需要用户移动产生新的信息,需要根据新的信息作出更新

    func updateARPlaneNode(planeNode: SCNNode, planeAchor: ARPlaneAnchor) {
        let planeGeometry = planeNode.geometry as! SCNPlane
        planeGeometry.width = CGFloat(planeAchor.extent.x)
        planeGeometry.height = CGFloat(planeAchor.extent.z)
        planeNode.position = SCNVector3Make(planeAchor.center.x, 0, planeAchor.center.z)
    }

    func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) {
        guard let planeNode = anchor as? ARPlaneAnchor else { return }
        DispatchQueue.main.async {
            self.updateARPlaneNode(planeNode: node.childNodes[0], planeAchor: planeNode)
        }
    }
image.png

更新 FoucsNode 位置

    func updateFoucsNode() {
        let result = self.sceneView.hitTest(self.focusPoint, types: [.existingPlaneUsingExtent])
        if result.count == 1 {
            if let match = result.first {
                let t = match.worldTransform
                self.focusNode.position = SCNVector3.init(t.columns.3.x, t.columns.3.y, t.columns.3.z)
                self.gameState = .swipeToPlay
            }
        } else {
            self.gameState = .pointToSurface
        }
    }

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

相关文章

  • ARKit (四)

    ARAnchor 是包含对真是世界位置和方向的转换,anchor 是看不见的,它仅仅是一个对象在 ARKit 的场...

  • 8月iOS Library Top5 ---2017.08

    1.ARKit-CoreLacation ARKit-CoreLacation将ARKit和CoreLocatio...

  • ARKit Work Shop Demo

    ARKit文章: 到底有多强?苹果的增强现实框架:ARKit ARKit进阶:物理世界 ARKit进阶:材质 De...

  • 四、ARKit涂鸦②

    欢迎小伙伴们的到来~ (一)介绍 如果小伙伴们还没对ARKit有任何的了解可以先看看我前面几章的介绍再来更好的看本...

  • ARKit -- 基础概念

    参考内容 直击苹果 ARKit 技术 到底有多强?苹果的增强现实框架:ARKit ARKit文档翻译之ARKit简介

  • 到底有多强?苹果的增强现实框架:ARKit

    相关 ARKit进阶:物理世界ARKit进阶:材质ARKit实战:如何实现任意门 写在前面 其实准备ARKit已经...

  • 苹果 ARKit 初探

    苹果 ARKit 初探 苹果 ARKit 初探

  • ARCore Google与Apple正面叫板

    今年6月份Apple发布了iOS 11,随之带来了ARKit,ARKit一出技惊四座,就在昨天Google发布了他...

  • ARKit入门

    分享收藏关于ARKit的文章集 适合新手入门学习ARKit从入门到精通(1)-ARKit初体验ARKit从入门到精...

  • ARKit浅析篇

    在上一篇ARKit体验篇中我们体验了ARKit,这一篇主要从类出发分析下ARKit的流程。 ARKit浅析 我们知...

网友评论

      本文标题:ARKit (四)

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