La RA et la réalité virtuelle sont de plus en plus courantes, et toutes les grandes entreprises de haute technologie les poursuivent: Apple a ARKit, Google a ARCore et Microsoft a son propre HoloLens (et puis, bien sûr, il y a Unity). Et avec quelques applications qui reçoivent beaucoup d'attention du public, Développement d'applications de réalité augmentée devient une compétence très souhaitable pour les développeurs mobiles.
Dans cet article, j'aimerais vous présenter une petite application simple mais significative qui fera plus que simplement avoir un cube rotatif. Qui a besoin de cubes rotatifs de toute façon? Faisons la matrice.
ARKit est un framework Apple pour la création d'applications AR pour les appareils iOS. Plusieurs moteurs de rendu peuvent être utilisés avec: SpriteKit pour les objets 2D, SceneKit pour la 3D, et Métal si nous voulons implémenter un moteur de rendu personnalisé.
comment faire de la modélisation financière
Pour cette démo, nous utiliserons SceneKit pour rendre et placer des objets 3D entièrement rendus (couteaux).
Depuis ARKit v2, cinq types de configuration sont pris en charge dans ARKit:
AROrientationTrackingConfiguration - Lorsque vous souhaitez suivre uniquement l'orientation de l'appareil (par exemple, pour une application de constellation d'étoiles). Avec cette configuration, les mouvements physiques comme le pas de côté ne sont pas suivis et n'affecteront pas la position ou la direction des objets sur la scène.
ARWorldTrackingConfiguration - Il s'agit probablement de la configuration la plus souvent utilisée pour la RA car elle prend en charge ce que la plupart des gens considéreraient comme la réalité augmentée. Les exemples incluent des applications de chasse virtuelle pour animaux de compagnie ou Pokémon.
ARFaceTrackingConfiguration - Cette configuration n'est actuellement prise en charge que par l'iPhone X car elle nécessite une caméra TrueDepth (comme Face ID). Cette configuration suit les caractéristiques du visage et son décalage relatif par rapport à l'expression faciale neutre (par exemple, une application où les utilisateurs peuvent essayer des lunettes de soleil de mode avant de les commander).
ARImageTrackingConfiguration - Si vous avez un ensemble de marqueurs et que vous souhaitez montrer des animaux sautant hors du marqueur, cette configuration est faite pour vous. Il ne s’agit pas de marqueurs en forme de carte, mais de toute image 2D. Vous pourriez pointer votre appareil photo vers la Joconde et elle tournerait la tête et vous dirait quelque chose. Un inconvénient est que vous devez dire à l'avance quelle est la taille physique du marqueur d'image.
ARObjectScanningConfiguration - Cette configuration est la version 3D de ARImageTrackingConfiguration.
Dans cette démo, nous allons ajouter des couteaux et des balles à la scène, et nous aimerions avoir six degrés de liberté, donc l'outil approprié est ARWorldTrackingConfiguration.
exemples de loi de proximité gestalt
Tous ceux qui ont vu The Matrix peuvent se rappeler que Neo (Keanu Reeves) a esquivé les balles et les a arrêtées en l'air. Notre application nous aidera à recréer cette scène à partir d'un flux de caméra en direct. Ainsi, nous pouvons créer des vidéos personnalisées démontrant des pouvoirs de type néo.
Notre application aura des modèles 3D de balles et de couteaux. C'est à l'utilisateur de déterminer le nombre de balles ou de couteaux qu'il souhaite dans son film. Si vous souhaitez passer du temps et ajouter d'autres modèles, le code de l'application est open source et il est disponible sur GitHub ( https://github.com/altaibayar/toptal_ar_video_maker ). Bien qu'il ne s'agisse pas d'un didacticiel AR complet, la démo et la source devraient être une ressource précieuse si vous essayez de vous lancer dans le développement d'applications AR sur iOS.
Le scénario de cas d'utilisation prévu est le suivant:
Comme mentionné précédemment, nous voulons pouvoir bouger librement tout en enregistrant tous les 360 ° de la scène et que les balles et les couteaux suivent le mouvement de la caméra de manière appropriée.
À des fins de démonstration, nous n’aurons que deux types d’objets virtuels: les couteaux et les balles de fusil de chasse.
Les couteaux sont des objets détaillés et j'utiliserai le modèle gratuit de https://poly.google.com/view/3TnnfzKfHrq (Merci Andrew).
Les balles de fusil de chasse, cependant, sont de simples objets sphériques et nous pouvons simplement les coder. Nous les rendrons métalliques et brûlantes pour la variété. Comme nous émulons un fusil de chasse, nous les générons également sous forme de groupes groupés. Pour rendre le regroupement logique sans trop de tracas, nous pouvons utiliser le générateur de nombres aléatoires gaussien du GamplayKit.
GameplayKit est un outil utile qui est utile chaque fois que vous avez besoin d'une génération de bruit aléatoire, d'une machine à états, d'une IA ou d'une prise de décision basée sur les probabilités.
override init() { super.init(); // generate 50 gaussian distributed position around [0, 0, 0] let positions = Randomness.gaussian(center: SCNVector3Zero, count: 50); for pos in positions { let node = SCNNode(geometry: sphereGeometry()); node.position = pos; self.addChildNode(node); } } private func sphereGeometry() -> SCNGeometry { // radius of one projectile sphere is 5mm/0.2inch let sphere = SCNSphere(radius: 0.005); // sphere is reddish sphere.firstMaterial?.diffuse.contents = UIColor.red; // reflection on light is gray/silver sphere.firstMaterial?.reflective.contents = UIColor.gray; // metalness is 0.3 sphere.firstMaterial?.metalness.contents = 0.3; // shading should be realistic sphere.firstMaterial?.lightingModel = .physicallyBased; return sphere; }
Une logique de décalage aléatoire similaire peut être utilisée pour les couteaux, mais comme ils ne se comportent pas comme des groupes, une distribution aléatoire simple peut être utilisée.
Il est au-delà de la portée de cette démo de se plonger dans les discussions sur le paradigme d'architecture qui est le meilleur. Il existe de nombreux articles qui approfondissent ce sujet.
migration de données à partir de systèmes existants
Au lieu de cela, je vais simplement présenter la structure du projet comme un guide pour trouver votre chemin dans le projet GitHub lié: quels sont les principaux composants, comment ils sont connectés et pourquoi ils ont été choisis.
L'application n'a que trois écrans:
PermissionViewController - L'écran où nous demandons à l'utilisateur d'accorder à l'application l'accès aux fonctionnalités mobiles requises.
ExportViewController - Cet écran affiche une vidéo enregistrée et offre les options pour partager ou enregistrer la vidéo.
MainViewController - Toute la magie se produit ici.
D'après mon expérience, il est préférable que vous enveloppiez toutes les classes ARKit nécessaires telles que ARSession, ARConfiguration et tous les types uniques de SCNNode. De cette façon, le code est explicite.
ARSession est hérité d'ApeeScapeARSession, et la nouvelle classe de session n'a que trois méthodes: le constructeur de classe où nous configurons tout ce qui est nécessaire et les méthodes resetTracking et pauseTracking.
L'application reconnaît quatre types uniques de SCNNodes:
BulletsNode - Ce nœud représente un ensemble de cartouches de fusil de chasse. Le bruit gaussien aléatoire, les couleurs et le mode d'éclairage physique sont définis automatiquement.
Aucun travail spécial ou supplémentaire n'est requis dans les classes qui utilisent KnifeNode ou BulletsNode, et elles peuvent être utilisées comme modèles pour personnaliser l'application afin d'ajouter d'autres types d'objets 3D.
Modèle de couteau: https://poly.google.com/view/3TnnfzKfHrq
Enregistrement depuis SCNScene: https://github.com/svtek/SceneKitVideoRecorder
Icônes de bouton, application de démonstration ARKit: https://developer.apple.com/documentation/arkit/handling_3d_interaction_and_ui_controls_in_augmented_reality
principe d'unité et de variété de conception
ARKit est un framework Apple permettant de créer des applications de réalité augmentée pour les appareils iOS.
SceneKit est un framework pour développer des graphiques 3D dans un environnement Apple. Il sert d'interface abstraite vers les API de niveau inférieur telles que les moteurs de rendu.