39 votes

Quelle est la différence entre utiliser ARAnchor pour insérer un nœud et insérer directement un nœud?

Dans ARKit, j'ai trouvé 2 façons d'insérer un nœud après le hitTest

  1. Insérez un ARAnchor puis créez le noeud dans le rendu (_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode?

     let anchor = ARAnchor(transform:hit.worldTransform)
    sceneView.session.add(anchor:anchor)
     
  2. Insérez le nœud directement

     node.position = SCNVector3(hit.worldTransform.columns.3.x, hit.worldTransform.columns.3.y, hit.worldTransform.columns.3.z)
    sceneView.scene.rootNode.addChildNode(node)
     

Les deux cherchent à travailler pour moi, mais pourquoi dans un sens ou dans l'autre?

59voto

rickster Points 19870

Mise à jour: Comme d'iOS 11.3 (aka "ARKit 1.5"), il y est une différence entre l'ajout d'un ARAnchor à la session (et puis associe dans ce cas des SceneKit contenu avec l' ARSCNViewDelegate rappels) et il suffit de placer le contenu dans SceneKit de l'espace.

Lorsque vous ajoutez un point d'ancrage pour la session, vous dites ARKit que d'un certain point dans l'espace est approprié à votre application. ARKit pouvez ensuite faire un travail supplémentaire pour s'assurer que son monde de coordonnées de l'espace des lignes avec précision avec le monde réel, au moins dans le voisinage de ce point.

Donc, si vous êtes en essayant de faire du contenu virtuel semblent être "attaché" à une le monde réel point d'intérêt, comme mettre un objet sur une table ou un mur, vous devriez voir moins de "dérive" en raison de world-suivi de l'inexactitude, si vous donnez l'objet d'une ancre que si vous venez de placer dans SceneKit de l'espace. Et si cet objet se déplace d'une position statique à un autre, vous aurez envie de supprimer le point d'ancrage d'origine et en ajouter une à la nouvelle position par la suite.

En outre, dans iOS 11.3 vous pouvez opter pour "relocalisation", un processus qui aide ARKit reprendre une session après il est interrompu par un appel téléphonique, changement d'applications, etc). La session fonctionne toujours alors qu'il essaie de comprendre comment la carte où vous étiez avant, à l'endroit où vous êtes maintenant, ce qui pourrait entraîner dans le monde-l'espace des positions des ancres en changeant une fois la relocalisation réussit.

(D'un autre côté, si vous êtes juste faire de space invaders qui flottent dans l'air, parfaitement assortis monde de l'espace n'est pas aussi important, et donc vous n'aurez pas vraiment voir beaucoup de différence entre l'ancrage et de la non-ancrage de positionnement.)

Voir la peu autour de "l'Utilisation des ancres afin d'améliorer le suivi de la qualité autour des objets virtuels" d'Apple dans la Manipulation de l'Interaction 3D et de Contrôles d'INTERFACE en Réalité Augmentée article / exemple de code.

Le reste de cette réponse reste historiquement pertinente pour iOS 11.0-11.2.5 et explique le contexte, donc je vais le laisser ci-dessous...


Considérons tout d'abord l'utilisation de l' ARAnchor sans SceneKit.

  • Si vous utilisez ARSKView, vous avez besoin d'un moyen de faire référence à des positions / orientations en 3D (du monde réel) de l'espace, parce que SpriteKit n'est pas 3D. Vous avez besoin d' ARAnchor pour garder la trace des positions en 3D de sorte qu'ils peuvent être substitués en 2D.

  • Si vous êtes à la construction de votre propre moteur avec le Métal (ou GL, pour une raison étrange)... ce n'est pas une scène 3D description de l'API, c'est un GPU de programmation de l'API, de sorte qu'il n'a pas vraiment d'avoir une notion de l'espace. Vous pouvez utiliser ARAnchor comme un pont entre ARKit de la notion de monde de l'espace et tout ce que vous construisez.

Ainsi, dans certains cas, vous avez besoin d' ARAnchor parce que c'est la seule façon rationnelle de se référer à des positions 3D. (Et bien sûr, si vous utilisez la détection de plan, vous avez besoin d' ARPlaneAnchor parce que ARKit sera en fait de déplacer des personnes par rapport à la scène de l'espace tel que révisé ses estimations de l'endroit où les avions sont.)


Avec ARSCNView, SceneKit a déjà un monde en 3D de coordonnées de l'espace, et ARKit fait tout le travail de prise de l'espace qui correspond au monde réel de l'espace ARKit cartographie. Donc, étant donné un float4x4 transformer qui décrit une position (et de l'orientation, etc) dans le monde de l'espace, vous pouvez soit:

  • Créer un ARAnchor, l'ajouter à la session, et de répondre à des ARSCNViewDelegate de rappel pour fournir SceneKit de contenu pour chaque ancre, qui ARKit va ajouter à et la position dans la scène pour vous.
  • Créer un SCNNode, définir son simdTransform, et l'ajouter en tant qu'enfant de la scène de l' rootNode.

Tant que vous avez un exécutant ARSession, il n'y a pas de différence entre les deux approches - ils sont l'équivalent des façons de dire la même chose. Donc, si vous aimez faire les choses SceneKit façon, il n'y a rien de mal à cela. (Vous pouvez même utiliser SCNVector3 et SCNMatrix4 au lieu de SIMD types si vous le souhaitez, mais vous devrez le convertir en arrière si vous êtes également SIMD types de ARKit Api.)


Une fois ces approches diffèrent, c'est lorsque la session est réinitialisé. Si le monde de suivi échoue, vous reprenez une interruption de séance, et/ou vous démarrez une session encore, "le monde de l'espace" n'est plus en ligne avec le monde réel, de la même façon que lorsque vous avez placé le contenu de la scène.

Dans ce cas, vous pouvez avoir ARKit supprimer les ancres de la session - voir l' run(_:options:) méthode et ARSession.RunOptions. (Oui, tous, parce que, à ce stade, vous ne pouvez pas faire confiance à aucun d'eux d'être plus valable.) Si vous avez placé le contenu de la scène à l'aide d'ancres et de déléguer des rappels, ARKit sera nuke tous les le contenu. (Vous obtenez délégué rappels qu'il a été supprimé.) Si vous avez placé le contenu avec SceneKit API, il reste dans la scène (mais plus probablement au mauvais endroit).

Donc, pour utiliser le tri de dépend de la façon dont vous voulez gérer les échecs de session et des interruptions (et en dehors de qui il n'y a pas de réelle différence).

2voto

Fernando López Points 13

SCNVector3 est juste "une représentation des trois composantes du vecteur." SCNVector3 docs.

Lors de l'utilisation de ARAnchor, vous avez accès à trois composantes de vecteur de, mais aussi vous êtes en mesure de "suivre les positions et orientations des biens réels ou des objets virtuels par rapport à la caméra" ARAnchor docs. Et c'est pourquoi vous utilisez la session d'ajouter le point d'ancrage au lieu d'utiliser la scène.

Voir les docs et vous pouvez voir la différence en termes de l'API :)

Espérons que cela aide.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X