Как сделать приложение плана этажа, используя arkit в iOS? - PullRequest
0 голосов
/ 26 декабря 2018

Я новичок в приложениях типа дополненной реальности.Я хочу создать приложение, которое будет определять углы комнаты, и после нажатия на такие угловые точки оно будет размещать объекты там и создавать полный план этажа в 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)
    }        
}

Теперь я хочу определить угол и, основываясь на углах и дверях, хочу создать полный план этажа в 3D в iOS.

...