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
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.
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.
Cette suspicion a été confirmée par une conversation que j'ai eu avec un ingénieur Apple à WWDC17.
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.
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
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)
É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à.
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.
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
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’unPlaneDetection
structure conforme au protocoleOptionSet
.
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)")
}
}