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