簡體   English   中英

如何使用ARKit檢測平面

[英]How to detect plane surface using ARKit

我正在創建一個使用ARKit測量物體高度的應用程序。 對於瓶子,鋼筆和顯示器之類的小物體,它幾乎可以顯示准確的結果。 但是當我嘗試一些大的物體時,例如人的身高,門的高度,每次測量都顯示不同的結果。 我認為這是由於表面平面檢測。

有沒有更好的解決方案來檢測飛機? 或尋找高度的任何其他選擇?

還有關於ARKit視覺框架的信息嗎?

查看以下代碼,我認為它將幫助您了解度量的工作原理:

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結構。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM