[Swift, ARKit] Migrieren Sie von veraltetem hitTest zu raycastQuery

iOS 14 wurde offiziell veröffentlicht. Gleichzeitig wurde ARKit von 3.5 auf 4.0 verschoben, war jedoch in ARSCN View vorhanden.

open func hitTest(_ point: CGPoint, types: ARHitTestResult.ResultType) -> [ARHitTestResult]

Funktion ist veraltet.

Ich denke, der Zweck dieser Funktion ist es, die Position des Ortes mit Ihrer Fingerspitze zu verfolgen, wenn Sie das in ARSCNView platzierte 3D-Objekt bewegen. Zum Beispiel der folgende Code.

@IBOutlet var scnView: ARSCNView!

override func viewDidLoad() {
    super.viewDidLoad()

    let panGesture = UIPanGestureRecognizer(target: self, action: #selector(pan))
    self.scnView.addGestureRecognizer(panGesture)
}

@objc
func pan(_ sender: UIPanGestureRecognizer) {
    //Dieser HitTest ist[SCNHitTestResult]Unterscheidet sich von der veralteten Funktion, die zurückgibt
    guard let node = scnView.hitTest(sender.location(in: scnView), options: nil).first?.node else {
        return
    }
    //Dies ist eine veraltete Funktion
    guard let transform = scnView.hitTest(sender.location(in: scnView), types: .existingPlaneUsingExtent).first?.worldTransform else {
        return
    }
    node.setWorldTransform(SCNMatrix4(transform))
}

Abhängig vom Code kann es einige Unterschiede geben, z. B. das Umschalten je nach Status des Absenders oder die Verwendung von if anstelle von guard.

Wenn Sie dies in raycastQuery umschreiben, sieht es folgendermaßen aus.

//Variablendeklaration und viewDidLoad()Wurde weggelassen

@objc
func pan(_ sender: UIPanGestureRecognizer) {
    guard let node = scnView.hitTest(sender.location(in: scnView), options: nil).first?.node else {
        return
    }
    //Wo ich mich verändert habe
    guard let raycast = scnView.raycastQuery(from: sender.location(in: scnView),
                                                  allowing: .estimatedPlane,
                                                  alignment: .any),
          let result = scnView.session.raycast(raycast).first? else {
        return
    }
    node.setWorldTransform(SCNMatrix4(result.transform))
}

Die von der ARSCNView-Haupteinheit erhaltene ARRaycastQuery wird dieses Mal an die ARSCNView-Sitzung gesendet, und das [ARRaycastResult] wird von dort erneut abgerufen. Anstatt den abgegriffenen Teil von ARSCNView so zu verwenden, wie er ist, setzen Sie eine Sitzung dazwischen.

Da sich ARRaycastResult selbst nicht geändert hat, gibt es kein Problem mit der gleichen Verwendung wie bei der Erfassung durch hitTest.

Als nächstes überprüfen wir den Inhalt von raycastQuery.

open func raycastQuery(from point: CGPoint, allowing target: ARRaycastQuery.Target, alignment: ARRaycastQuery.TargetAlignment) -> ARRaycastQuery?

Das erste Argument bleibt dasselbe. Das zweite und dritte Argument sind beide Aufzählungen in ARRaycastQuery.

Klicken Sie hier für das zweite Argument, enum.

public enum Target : Int {
    case existingPlaneGeometry = 0
    case existingPlaneInfinite = 1
    case estimatedPlane = 2
}

Es dient zur Bestimmung, was an dem Punkt vorhanden ist. Wählen Sie Vorhandene EbeneInfinit aus, wenn Sie eine Ebene mit einer festen Größe wünschen, oder Geschätzte Ebene, wenn Sie einen groben Plan wünschen.

Als nächstes kommt das dritte Argument, enum.

public enum TargetAlignment : Int {
    case horizontal = 0
    case vertical = 1
    case any = 2
}

Dies ist eine Liste von drei Optionen, unabhängig davon, ob das relevante Teil vertikal oder horizontal ist oder ob es keine Rolle spielt.

Sowohl das 2. als auch das 3. Argument sind neu, aber ich denke, Sie können sich vorstellen, dass Sie sie jetzt frei kombinieren können, indem Sie den in hitTest verwendeten ARHitTestResult.ResultType zerlegen.

Da hitTest nur veraltet ist, kann es verwendet werden, aber ich möchte es von Zeit zu Zeit ändern.

Recommended Posts

[Swift, ARKit] Migrieren Sie von veraltetem hitTest zu raycastQuery
Migrieren Sie von JUnit 4 zu JUnit 5
Migrieren Sie von on-prepukiwiki zu esa.io \ (⁰⊖⁰) /
So rufen Sie Swift 5.3-Code von Objective-C auf
Konvertiert vom String-Zeiger der C-Sprache zum Swift-String-Typ
Migrieren Sie Ubuntu 18.04 LTS von der Festplatte auf eine kleinere SSD
Migrieren Sie von Java zu Server Side Kotlin + Spring-Boot
Migrieren Sie vom Transport Client zum Rest High Level Client
[Swift] Fähigkeitskarte von unerfahren bis praktisch (Straßenkarte)
[Swift] So spielen Sie Songs aus der Musikbibliothek ab
Generieren Sie Modelle von JSON zu Swift, PHP, C #, JAVA