[Swift, ARKit] Migrer de hitTest obsolète vers raycastQuery

iOS 14 a été officiellement publié. Parallèlement à cela, ARKit est également passé de 3,5 à 4,0, mais il existait dans ARSCN View dans ce cas.

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

La fonction est obsolète.

Je pense que le but de cette fonction est d'obtenir la position du lieu tracé du bout du doigt lors du déplacement de l'objet 3D placé dans ARSCNView. Par exemple, le code ci-dessous.

@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) {
    //Ce hitTest est[SCNHitTestResult]Est différente de la fonction obsolète qui renvoie
    guard let node = scnView.hitTest(sender.location(in: scnView), options: nil).first?.node else {
        return
    }
    //C'est une fonction obsolète
    guard let transform = scnView.hitTest(sender.location(in: scnView), types: .existingPlaneUsingExtent).first?.worldTransform else {
        return
    }
    node.setWorldTransform(SCNMatrix4(transform))
}

Selon le code, il peut y avoir des différences, telles que la commutation en fonction de l'état de l'expéditeur ou l'utilisation de if let au lieu de guard.

Si vous réécrivez ceci dans raycastQuery, cela ressemblera à ce qui suit.

//Déclaration de variable et viewDidLoad()Est omis

@objc
func pan(_ sender: UIPanGestureRecognizer) {
    guard let node = scnView.hitTest(sender.location(in: scnView), options: nil).first?.node else {
        return
    }
    //Où j'ai changé
    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))
}

L'ARRaycastQuery obtenu à partir de l'unité principale ARSCNView est envoyée à la session ARSCNView cette fois, et le [ARRaycastResult] est obtenu à nouveau à partir de là. Au lieu d'utiliser la partie exploitée d'ARSCNView telle quelle, vous placez une session entre les deux.

Puisque ARRaycastResult lui-même n'a pas changé, il n'y a pas de problème avec la même utilisation que lors de son acquisition par hitTest.

Ensuite, vérifions le contenu de raycastQuery.

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

Le premier argument reste le même. Les deuxième et troisième arguments sont tous deux des énumérations dans ARRaycastQuery.

Cliquez ici pour le deuxième argument, enum.

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

C'est pour déterminer ce qui est présent au point. Sélectionnez existingPlaneInfinite si vous voulez un plan avec une taille fixe, ou estiméPlane si vous voulez un plan approximatif.

Vient ensuite le troisième argument, enum.

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

Voici une liste de trois options: si la partie pertinente est verticale ou horizontale, ou si cela n'a pas d'importance.

Les deuxième et troisième arguments sont nouveaux, mais je pense que vous pouvez penser que vous pouvez maintenant les combiner librement en décomposant le ARHitTestResult.ResultType utilisé dans hitTest.

Puisque hitTest est seulement obsolète, il peut être utilisé, mais je voudrais le changer de temps en temps.

Recommended Posts

[Swift, ARKit] Migrer de hitTest obsolète vers raycastQuery
Migrer de JUnit 4 vers JUnit 5
Migrer de on-prepukiwiki vers esa.io \ (⁰⊖⁰) /
Comment appeler le code Swift 5.3 depuis Objective-C
Conversion du pointeur de chaîne de langage C en type Swift String
Migrer Ubuntu 18.04 LTS du disque dur vers un SSD plus petit
Migrer de Java vers Kotlin côté serveur + Spring-boot
Migrer du client de transport vers le client de niveau supérieur Rest
[Swift] Carte de compétences de inexpérimenté à pratique (carte routière)
[Swift] Comment lire des chansons de la bibliothèque musicale
Générer des modèles de JSON à Swift, PHP, C #, JAVA