如何使用ARKit检测平面

问题描述 投票:1回答:1

我正在创建一个使用ARKit测量对象高度的应用程序。对于瓶子,笔和显示器等小物体,它显示出几乎准确的结果。但是当我尝试一些大的物体,即男人的身高时,门的高度对于每次测量都会显示不同的结果。我认为这是因为表面平面检测。

检测平面有什么更好的解决方案吗?或任何其他寻找高度的选择?

还有关于ARKit的Vision框架的任何信息吗?

ios swift augmented-reality arkit measure
1个回答
0
投票

查看以下代码,我认为它将帮助您了解测量的工作原理:

class ViewController: UIViewController, ARSCNViewDelegate, ARSessionDelegate {

    @IBOutlet weak var resultLabel: UILabel!
    @IBOutlet weak var aimLabel: UILabel!
    @IBOutlet weak var notReadyLabel: UILabel!
    @IBOutlet var sceneView: ARSCNView!

    let session = ARSession()
    let vectorZero = SCNVector3()
    let sessionConfig = ARWorldTrackingSessionConfiguration()
    var measuring = false
    var startValue = SCNVector3()
    var endValue = SCNVector3()

    override func viewDidLoad() {
        super.viewDidLoad()
        setupScene()
    }
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        UIApplication.shared.isIdleTimerDisabled = true
    }
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        session.pause()
    }
    func setupScene() {
        sceneView.delegate = self
        sceneView.session = session
        session.run(sessionConfig, options: [.resetTracking, 
                                             .removeExistingAnchors])
        resetValues()
    }
    func resetValues() {
        measuring = false
        startValue = SCNVector3()
        endValue =  SCNVector3()
        updateResultLabel(0.0)
    }
    func updateResultLabel(_ value: Float) {
        let cm = value * 100.0
        let inch = cm * 0.3937007874
        resultLabel.text = String(format: "%.2f cm / %.2f\"", cm, inch)
    }
    func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) {
        DispatchQueue.main.async {
            self.detectObjects()
        }
    }  
    func detectObjects() {
        if let worldPos = sceneView.realWorldVector(screenPos: view.center) {
            aimLabel.isHidden = false
            notReadyLabel.isHidden = true
            if measuring {
                if startValue == vectorZero {
                    startValue = worldPos
                }
                endValue = worldPos
                updateResultLabel(startValue.distance(from: endValue))
            }
        }
    }
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        resetValues()
        measuring = true
    }
    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        measuring = false
    }
}

如你所见,没有.planeDetection结构。

© www.soinside.com 2019 - 2024. All rights reserved.