web-dev-qa-db-fra.com

Comment détecter les plans verticaux dans ARKit?

Comment est-il possible de mettre en œuvre une détection de plan vertical (c'est-à-dire pour les murs)?

let configuration = ARWorldTrackingSessionConfiguration()
configuration.planeDetection = .horizontal //TODO
49
Jan F.

Edit: Ceci est maintenant supporté à partir d'ARKit 1.5 (iOS 11.3). Utilisez simplement .vertical. J'ai conservé le post précédent ci-dessous à des fins historiques.


TL; DR

La détection de plan vertical n'est pas (encore) une fonctionnalité qui existe dans ARKit. Le .horizontal suggère que cette fonctionnalité pourrait être modifiée et éventuellement ajoutée à l’avenir. S'il s'agissait simplement d'une valeur booléenne, cela suggérerait qu'elle est finale.

Confirmation

Cette suspicion a été confirmée par une conversation que j'ai eu avec un ingénieur Apple à WWDC17.

Explication

Vous pourriez faire valoir qu'il serait difficile de créer une implémentation pour cela car il y a infiniment plus d'orientations pour un plan vertical que pour un plan horizontal, mais comme rodamn, ce n'est probablement pas le cas.

From rodamn’s comment: Dans sa forme la plus simple, un plan est défini comme étant trois points coplanaires. Vous avez une surface candidate une fois que suffisamment d'éléments coplanaires détectés sont détectés le long d'une surface (verticale, horizontale ou à un angle quelconque). C'est juste que la normale pour les horizontaux sera le long de l'axe haut/bas, tandis que les normales de la verticale seront parallèles au plan du sol. Le problème est que les cloisons sèches non décorées ont tendance à générer peu de caractéristiques visuelles et que les murs lisses peuvent souvent passer inaperçus. Je soupçonne fortement que c’est pourquoi le .vertical La fonctionnalité n’est pas encore disponible

Cependant, il existe un contre-argument à ceci . Voir les commentaires de rickster pour plus d'informations.

66
Zack

Le support pour cela arrive avec iOS 11.3:

static var vertical: ARWorldTrackingConfiguration.PlaneDetection

La session détecte les surfaces parallèles à la gravité (quelle que soit leur orientation).

https://developer.Apple.com/documentation/arkit/arworldtrackingconfiguration.planedetectionhttps://developer.Apple.com/documentation/arkit/arworldtrackingconfiguration.planedetection/2867271-vertical

6
janpio

La version iOS 11.3 d’Apple comportera diverses mises à jour pour AR, y compris ARKit 1.5. Dans cette mise à jour, ARKit inclut la possibilité pour ARKit de reconnaître et de placer des objets virtuels sur des surfaces verticales telles que les murs et les portes.

La prise en charge de vertical est maintenant prise en charge dans ARWorldTrackingConfiguration

let configuration = ARWorldTrackingConfiguration()
configuration.planeDetection = [.horizontal, .vertical]
sceneView.session.run(configuration)
5
shri

Étant donné que l’iPhone X est équipé d’une caméra de profondeur orientée vers l’avant, j’ai le sentiment qu’une caméra de recul orientée vers le dos figurera sur la prochaine version et peut-être le .vertical capacité sera déléguée jusque-là.

2
Mike M

je l'ai fait avec Unity, mais je dois faire mes calculs.

J'utilise Random Sample Consensus pour détecter un plan vertical à partir du nuage de points renvoyé par ARkit. C'est comme avoir une boucle qui sélectionne au hasard 3 points pour créer un avion et compte les points qui lui correspondent, et voir quel essai est le meilleur.

Ça marche. Mais parce qu'ARkit ne peut pas renvoyer beaucoup de points lorsque le mur est de couleur unie. Donc, cela ne fonctionne pas dans beaucoup de situations.

1
Sunny Chow

Apple travaillerait sur des capacités AR supplémentaires pour le nouvel iPhone, à savoir des capteurs supplémentaires pour l'appareil photo. Peut-être que ce sera une fonctionnalité lorsque ces capacités de périphérique seront connues. Quelques spéculations ici. http://uk.businessinsider.com/Apple-iphone-8-rumors-3d-laser-camera-augmented-reality-2017-7 et une autre source https: // www .fastcompany.com/40440342/Apple-travaille-durement sur un iphone-8-face-arrière-3d-laser-pour-ar-et-autofocus-source

0
Alex McPherson

Dans ARKit 1.0, il n'y avait que .horizontal _ cas de enum permettant de détecter des surfaces horizontales telles qu'une table ou un sol. Dans ARKit 1.5 et supérieur , il y a .horizontal et .vertical propriétés de type d’un PlaneDetection structure conforme au protocole OptionSet.

Pour implémenter une détection de plan vertical dans ARKit 2.0, utilisez le code suivant:

configuration.planeDetection = ARWorldTrackingConfiguration.PlaneDetection.vertical

Ou vous pouvez utiliser la détection pour les deux types d’avions:

private func configureSceneView(_ sceneView: ARSCNView) {

    let configuration = ARWorldTrackingConfiguration()
    configuration.planeDetection = [.horizontal, .vertical]    //BOTH TYPES
    configuration.isLightEstimationEnabled = true
    sceneView.session.run(configuration)
}

Vous pouvez aussi ajouter une extension à ARSceneManager pour gérer les appels de délégués:

extension ARSceneManager: ARSCNViewDelegate {

    func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
        guard let planeAnchor = anchor as? ARPlaneAnchor else { 
            return 
        }
        print("Found plane: \(planeAnchor)")
    }
}
0
ARGeo