ARKit (四)

ARAnchor 是包含對真是世界位置和方向的轉(zhuǎn)換,anchor 是看不見的,它僅僅是一個對象在 ARKit 的場景中,ARKit 用一個空的 SCNNode 來代表 ARAnchor, 所需要做的就是把 content 作為子節(jié)點添加到它上面去。

image.png

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

觀察平面

為了讓 ARKit 觀察平面,需要設(shè)置 ARConfiguration 對象

config.planeDetection = .horizontal

也可以設(shè)置為檢測豎直的平面

config.planeDetection = .vertical

Handling new plane anchor

func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) 當(dāng)有新的錨點添加的時候?qū)|發(fā),當(dāng)觸發(fā)這個方法的時候可以添加內(nèi)容到這個錨點上

    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 可能沒有檢測到平面完整的信息,這個時候需要用戶移動產(chǎn)生新的信息,需要根據(jù)新的信息作出更新

    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()
        }
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容