Comment utiliser des modèles 3D gratuits de Google Poly dans des applications Android

De nos jours, la demande d'applications Android offrant des expériences immersives de réalité virtuelle ou de réalité augmentée est énorme. En tant que développeur, vous pouvez utiliser de nombreux frameworks différents pour créer de telles applications.. 

Mais, à moins que vous ne soyez également un artiste 3D qualifié, comment allez-vous créer les objets 3D que vous afficheriez dans ces applications? Êtes-vous prêt à passer des mois à apprendre à travailler avec des programmes de modélisation 3D tels que Blender ou Maya? Si vous ne l'êtes pas, envisagez d'utiliser Google Poly, un référentiel en ligne contenant des milliers d'actifs 3D fournis avec les licences Creative Commons..

La plupart des actifs que vous pouvez trouver sur Poly aujourd'hui sont des low poly avec des matériaux simples. En effet, le GPU mobile moyen n’est pas encore assez puissant pour afficher en temps réel des objets 3D à grand nombre de polygones..

Dans ce tutoriel, je vais vous présenter l'API Poly. Je vais également vous montrer comment utiliser Traitement pour Android pour restituer les éléments 3D que vous téléchargez..

Conditions préalables

Pour tirer le meilleur parti de ce tutoriel, vous aurez besoin de:

  • la dernière version d'Android Studio
  • un appareil fonctionnant sous Android API de niveau 21 ou supérieur
  • et un compte Google Cloud 

1. Acquisition d'une clé API

Toutes les demandes HTTP que vous adressez à l'API Poly doivent être accompagnées d'une clé API qui vous appartient. Pour acquérir la clé, commencez par vous connecter à la console Google Cloud et accédez au tableau de bord des API..

Ensuite, appuyez sur le Activer les API et les services bouton, développez le Autre catégorie et sélectionnez API poly.


Vous pouvez maintenant appuyer sur le Activer bouton pour activer l'API Poly.

Une fois l’API activée, un ensemble de clés d’API est générée automatiquement. Vous pouvez ouvrir le Lettres de créance onglet pour les regarder.

Pour ce tutoriel, vous n’avez besoin que de la Clé Android. Prenez-en note pour pouvoir l'utiliser plus tard.

2. Configuration du projet

Comme Poly n’a pas actuellement de boîte à outils officielle pour la plate-forme Android, vous devez utiliser l’API Poly directement à l’aide de son interface REST. En utilisant la bibliothèque de réseau Fuel, optimisée pour le langage Kotlin, vous pouvez économiser beaucoup de temps et d’efforts. Alors ajoutez ce qui suit la mise en oeuvre dépendance dans le app modules build.gradle fichier:

implémentation 'com.github.kittinunf.fuel: fuel-android: 1.13.0'

Pour pouvoir afficher les fichiers 3D téléchargés à partir du référentiel Poly, vous avez également besoin d'un moteur de rendu. Le traitement pour Android est livré avec un, alors ajoutez-le comme une autre dépendance.

implémentation 'org.p5android: processing-core: 4.0.1'

Enfin, n'oubliez pas de demander le L'INTERNET permission dans le fichier manifeste de votre projet.

3. Liste des actifs

Pour pouvoir télécharger un actif Poly, vous devez connaître son identifiant unique. En utilisant un navigateur, qui prend en charge WebGL, vous pouvez facilement déterminer l'ID de tout actif. C'est dans la barre d'adresse.

Toutefois, si vous souhaitez autoriser vos utilisateurs à choisir, à l'exécution, les actifs qu'ils souhaitent utiliser, vous pouvez utiliser le assets.list Méthode REST pour déterminer les ID de ces actifs. Cette méthode vous permet de rechercher des actifs en utilisant divers paramètres, tels que des mots-clés, des catégories et des formats de fichier 3D..

Par exemple, essayons maintenant de trouver les identifiants de quelques actifs appartenant au groupe. animaux Catégorie. Vous êtes bien entendu libre de choisir une autre catégorie valide, telle que architecture, aliments, ou personnes.

Avant de composer votre requête HTTP, il est judicieux de déclarer votre clé API et l'URL de base de l'API Poly en tant que constantes de votre activité..

objet compagnon const val key = "Abcdefghabcdefgh1234567810" const val baseURL = "https://poly.googleapis.com/v1"

En utilisant l'URL de base, vous pouvez créer l'URL du assets.list Méthode REST comme indiqué ci-dessous:

val listURL = "$ baseURL / assets"

À ce stade, vous pouvez créer une demande HTTP GET valide en appelant le httpGet () méthode et en transmettant votre clé d’API et la catégorie souhaitée en tant que paramètres de requête. Vous pouvez éventuellement utiliser le format paramètre de requête pour spécifier le format souhaité des actifs. Poly prend en charge les formats OBJ, FBX, TILT et plusieurs autres formats 3D populaires..

Comme la méthode est exécutée de manière asynchrone et que son résultat est un document JSON, vous devez lui associer un gestionnaire d’événements à l’aide de la commande suivante. responseJSON () méthode. Le code suivant vous montre comment:

listURL.httpGet (listOf ("catégorie" à "animaux", "clé" à une clé, "format" à "OBJ")). responseJson _, _, résultat -> // Plus de code ici

Dans le gestionnaire d'événements, si votre demande aboutit, vous aurez accès à une liste de Atout objets. le prénom le champ de chacun de ces objets spécifie son identifiant.

De plus, chaque objet aura des champs tels que Afficher un nom, Licence, et nom de l'auteur, que vous pourriez trouver utile. Pour l'instant, imprimons simplement le prénom et Afficher un nom de tous les objets. Le code suivant vous montre comment:

result.fold (// Obtient un tableau d'actifs val atouts = it.obj (). getJSONArray ("assets") // Boucle dans un tableau pour (i sur 0 jusqu'à assets.length ()) // Obtient id et displayName val id = assets.getJSONObject (i) .getString ("nom") val displayName = assets.getJSONObject (i) .getString ("displayName") // Identifiant d'impression et displayName Log.d ("POLY", "(ID: $ id) - (NAME: $ displayName) "), // En cas d'erreur, Log.e (" POLY "," Une erreur est survenue "))

Si vous exécutez votre application maintenant, vous devriez pouvoir voir la sortie suivante dans Logcat fenêtre d'Android Studio.

4. Téléchargement des actifs

Une fois que vous avez l'ID unique d'un actif, vous pouvez directement l'ajouter à l'URL de base de l'API Poly pour créer une URL d'actif..

// un identifiant d'actif val assetID = "assets / 3yiIERrKNQr" // son url val assetURL = "$ baseURL / $ assetID"

Lorsque vous envoyez une requête HTTP GET à l'URL de l'actif à l'aide de la commande httpGet () méthode à nouveau, vous obtiendrez un document JSON contenant un seul Atout objet.

assetURL.httpGet (listOf ("clé" de la clé)) .responseJson _, _, résultat -> result.fold (val asset = it.obj () // Plus de code ici, Log.e ("POLY "," Une erreur est survenue "))

Comme vous l'avez peut-être remarqué dans le code ci-dessus, cette requête doit également comporter un paramètre de requête mentionnant votre clé API.

Vous avez déjà appris à utiliser certains des champs présents dans le Atout objet à l'étape précédente. Maintenant, tout ce que vous avez à faire est d’utiliser le formats tableau présent dans l'objet pour déterminer les URL et les noms des fichiers associés à l'actif. Chaque élément du tableau aura trois champs importants: 

  • formatType, qui vous permet de déterminer le type d'actif
  • racine, qui contient le nom et l'URL du fichier principal associé à l'actif
  • Ressources, qui contient des détails sur tous les fichiers secondaires associés à l'actif, tels que les matériaux et les textures

Si vous travaillez avec le format OBJ, le fichier principal sera un fichier. .obj fichier contenant des sommets et des données de faces, et les fichiers secondaires seront généralement .mtl fichiers contenant des données sur les matériaux utilisés. Le code suivant vous montre comment déterminer les URL des fichiers principal et secondaire:

var objFileURL: String? = null var mtlFileURL: String? = null var mtlFileName: String? = null val formats = asset.getJSONArray ("formats") // Boucle dans tous les formats de (i dans 0 jusqu'à formats.length ()) val currentFormat = formats.getJSONObject (i) // Vérifie si le format actuel est OBJ si (currentFormat.getString ("formatType") == "OBJ") // Obtenir les détails du fichier .obj objFileURL = currentFormat.getJSONObject ("root") .getString ("url") // Obtenir les premiers détails du fichier .mtl mtlFileL. = currentFormat.getJSONArray ("resources") .getJSONObject (0) .getString ("url") mtlFileName = currentFormat.getJSONArray ("resources") .getJSONObject (0) .getString ("relativePath") break

Dans le code ci-dessus, en plus de l'URL du .mtl fichier, nous déterminons également son nom en utilisant le chemin relatif champ. Il est important de le faire car le nom est codé en dur dans le mtllib élément du .obj fichier et ne doit pas être changé.

Une fois que vous avez les URL des deux fichiers, vous pouvez utiliser le httpDownload () méthode de la bibliothèque de carburant pour les télécharger. Voici comment vous pouvez les télécharger dans le répertoire de stockage privé de votre application, dont le chemin absolu peut être déterminé à l'aide du filesDir propriété:

// télécharge et stocke le fichier obj sous le nom asset.obj objFileURL !!. httpDownload (). destination _, _ -> Fichier (filesDir, "asset.obj") .response _, _, result -> result.fold (, Log.e ("POLY", "Une erreur est survenue")) // télécharger et stocker le fichier mtl sans // changer son nom mtlFileURL !!. HttpDownload (). Destination _, _ -> Fichier (Rép_Fichier, NomFichierMtl) .response _, _, résultat -> résultat.fold (, Log.e ("POLY", "Une erreur est survenue"))

5. Affichage des actifs

Vous aurez besoin d'un canevas 3D pour dessiner l'actif Poly que vous avez téléchargé. Pour en créer un, vous devez étendre le PApplet classe offerte par la bibliothèque Processing for Android. Cependant, une toile créée de cette manière ne supportera, par défaut, que des formes 2D. Pour le configurer afin de dessiner également des formes 3D, remplacez le réglages() méthode et passe P3D comme argument à la plein écran() méthode, qui rend également la toile aussi grande que l'écran de l'utilisateur.

val canvas = objet: PApplet () redéfinit les paramètres amusants () fullScreen (PConstants.P3D) // Plus de code ici

Ensuite, créez une nouvelle propriété dans la classe pour représenter l’actif Poly en tant que PShape objet.

var myPolyAsset: PShape? = null

Pour initialiser la propriété, remplacez le installer() méthode et appelez le loadShape () méthode, en passant le chemin absolu du .obj fichier que vous avez téléchargé comme argument.

remplacez fun setup () myPolyAsset = loadShape (File (filesDir, "asset.obj"). absolutePath)

Vous pouvez maintenant commencer à dessiner sur la toile en remplaçant le dessiner() méthode. Dans la méthode, la première chose à faire est d’appeler le Contexte() méthode pour vous assurer de toujours dessiner sur une toile vierge.

redéfinit fun draw draw () background (0) // plus de code ici

Lorsqu'ils sont dessinés directement, la plupart des actifs de Poly ont l'air très petits et inversés. Vous pouvez résoudre ce problème en utilisant une caméra personnalisée ou en utilisant des transformations de canevas. Pour que ce tutoriel reste simple et intuitif, utilisons les transformations de canevas..

Pour augmenter la taille de l’actif, utilisez la commande échelle() méthode et passez une grande valeur négative à elle. La valeur doit être négative pour vous assurer que l'actif est retourné verticalement. Vous pouvez éventuellement utiliser le Traduire() méthode pour ajuster sa position le long des axes X et Y. Le code suivant vous montre comment:

échelle (-50f) traduire (-4f, -14f)

Vous pouvez maintenant aller de l’avant et dessiner l’actif en appelant le forme() méthode.

forme (myPolyAsset)

Le canevas ne fait actuellement pas partie de la hiérarchie de vues de votre activité. Par conséquent, si vous essayez d'exécuter votre application maintenant, vous ne pourrez pas voir l'actif. Pour résoudre ce problème, ajoutez d'abord un nouveau FrameLayout widget au fichier XML de disposition de l'activité.

 

Ensuite, créez un nouveau Fragmentation par exemple en utilisant la toile et pointez le FrameLayout widget.

val fragment = PFragment (canvas) fragment.setView (canvas_holder, this)

À ce stade, vous pouvez exécuter l'application à nouveau pour voir l'actif..

Conclusion

Vous savez maintenant comment utiliser l’API Poly pour rechercher et télécharger des fichiers 3D. Dans ce didacticiel, vous avez également appris à restituer et à manipuler ces actifs à l'aide de Traitement pour Android..

Il convient de noter que de nombreux actifs disponibles sur Poly ont été créés à l'aide de Google Blocks, une application disponible pour les utilisateurs de HTC Vive et Oculus Rift. Si vous possédez ces casques VR, envisagez de créer et de soumettre vos propres modèles..

Pour en savoir plus sur l’API Poly, vous pouvez vous référer à la documentation officielle..