ARKit définir la transformation ARAnchor en fonction de l'location tactile

Je joue avec l'application de démarrage AR sur XCode 9 où les ancres sont créées dans une scène à la pression:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { guard let sceneView = self.view as? ARSKView else { return } // Create anchor using the camera's current position if let currentFrame = sceneView.session.currentFrame { // Create a transform with a translation of 0.2 meters in front // of the camera var translation = masortingx_identity_float4x4 translation.columns.3.z = -0.2 let transform = simd_mul(currentFrame.camera.transform, translation) // Add a new anchor to the session let anchor = ARAnchor(transform: transform) sceneView.session.add(anchor: anchor) } } 

Cela entraîne toujours la création de l'ancre au milieu de l'écran, quel que soit l'endroit où je tapote, ce qui est logique, car nous obtenons la transformation de la camera actuelle et appliquons uniquement une translation dans l'axe z.

Je voudrais plutôt que l'ancre soit placée là où j'ai tapé avec mon doigt. Je peux get l'location du robinet en utilisant touches.first?.location(in: sceneView) , c'est-à-dire, juste la distance du coin supérieur gauche de l'écran en points, mais je ne sais pas comment appliquer ces coordonnées 2D pt l'ancre transforme en mètres, et sur quel axe ils s'appliquent.

Je suppose que vous faites reference au projet ARKitExample d'Apple "Placer des objects virtuels en réalité augmentée".

Jetez un coup d'œil à la méthode VirtualObject.translateBasedOnScreenPos(_:instantly:infinitePlane:) qui est appelée lorsque vous déplacez un model (déjà placé) à l'écran, ce qui nécessite essentiellement de résoudre les problèmes que vous décrivez.

Vous constaterez que cela appelle à son tour ViewController.worldPositionFromScreenPosition(_:objectPos:infinitePlane:) .

Extrait de cette méthode, leur approche est:

  1. Toujours faire un test de coup contre les ancres plan existantes. (Si de telles ancres existent et seulement dans leur étendue.)

  2. Collectez plus d'informations sur l'environnement en effectuant des tests de hit sur le nuage de points de fonctionnalité, mais ne renvoyez pas le résultat pour le moment.

  3. Si désiré ou nécessaire (pas de résultat de test de bonne fonctionnalité): Test de réussite contre un plan horizontal infini (en ignorant le monde réel).

  4. Si disponible, renvoyer le résultat du test d'access à des fonctionnalités de haute qualité si les tests d'atteinte contre des plans infinis ont été ignorés ou qu'aucun plan infini n'a été touché.

  5. En dernier recours, effectuez un second test de détection non filtré sur les fonctionnalités. S'il n'y a pas de caractéristiques dans la scène, le résultat returnné ici sera nul.

Comme vous pouvez le voir, ils prennent en count divers aspects qui peuvent ou non s'appliquer à votre cas d'utilisation. Envisagez d'étudier et de réutiliser (des parties de) leur approche.