如何在iOS中使用arkit制作平面图应用程序?

时间:2018-12-26 05:40:07

标签: ios swift 3d scenekit arkit

我是增强现实类型应用程序的初学者。我想创建一个可以检测房间角落的应用程序,点击这些角落点后,它将在其中放置对象并使用增强现实技术在3D中创建完整的平面图。

我现在可以看到默认对象,也可以检测水平地板并将网格图像放置在此处。

我从那里检测水平流并放置网格图像的视图控制器。

    import UIKit
    import SceneKit
    import ARKit

    class ViewController: UIViewController, ARSCNViewDelegate {

        @IBOutlet var sceneView: ARSCNView!                 
        var planes = [ARPlaneAnchor: Plane]()

        override func viewDidLoad() {
            super.viewDidLoad()
            sceneView.delegate = self
            sceneView.showsStatistics = true
            sceneView.debugOptions = [ARSCNDebugOptions.showFeaturePoints]
        }

        override func viewWillAppear(_ animated: Bool) {
            super.viewWillAppear(animated)
            let configuration = ARWorldTrackingConfiguration()
            configuration.planeDetection = .horizontal
            sceneView.session.run(configuration)
        }

        override func viewWillDisappear(_ animated: Bool) {
            super.viewWillDisappear(animated)
            sceneView.session.pause()
        }

        // MARK: - ARSCNViewDelegate            
        func session(_ session: ARSession, didFailWithError error: Error) {
        }

        func sessionWasInterrupted(_ session: ARSession) {
        }

        func sessionInterruptionEnded(_ session: ARSession) {
        }

        func addPlane(node: SCNNode, anchor: ARPlaneAnchor) {
            let plane = Plane(anchor)
            planes[anchor] = plane
            node.addChildNode(plane)
        }

        func updatePlane(anchor: ARPlaneAnchor) {
            if let plane = planes[anchor] {
                plane.update(anchor)
            }
        }

        // MARK: - Add, Update, Remove Object Methods            
        func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
            DispatchQueue.main.async {
                if let planeAnchor = anchor as? ARPlaneAnchor {
                    self.addPlane(node: node, anchor: planeAnchor)
                }
            }
        }

        func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) {
            DispatchQueue.main.async {
                if let planeAnchor = anchor as? ARPlaneAnchor {
                    self.updatePlane(anchor: planeAnchor)
                }
            }
        }
    }

节点类

class Plane: SCNNode {
    var planeAnchor: ARPlaneAnchor
    var planeGeometry: SCNPlane
    var planeNode: SCNNode

    init(_ anchor: ARPlaneAnchor) {

        self.planeAnchor = anchor            
        let grid = UIImage(named: "plane_grid.png")
        self.planeGeometry = SCNPlane(width: CGFloat(anchor.extent.x), height: CGFloat(anchor.extent.z))
        let material = SCNMaterial()
        material.diffuse.contents = grid
        self.planeGeometry.materials = [material]            
        self.planeGeometry.firstMaterial?.transparency = 0.5
        self.planeNode = SCNNode(geometry: planeGeometry)
        self.planeNode.transform = SCNMatrix4MakeRotation(-Float.pi / 2.0, 1, 0, 0)

        super.init()            
        self.addChildNode(planeNode)           
        self.position = SCNVector3(anchor.center.x, anchor.center.y, anchor.center.z) // 2 mm below the origin of plane.
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    func update(_ anchor: ARPlaneAnchor) {
        self.planeAnchor = anchor

        self.planeGeometry.width = CGFloat(anchor.extent.x)
        self.planeGeometry.height = CGFloat(anchor.extent.z)

        self.position = SCNVector3Make(anchor.center.x, anchor.center.y, anchor.center.z)
    }        
}

现在,我想检测拐角,并希望基于拐角和门,在iOS 3D中创建完整的平面图。

0 个答案:

没有答案