Hoe gratis 3D-modellen van Google Poly te gebruiken in Android-apps

Er is tegenwoordig een enorme vraag naar Android-apps die meeslepende virtual reality- of augmented reality-ervaringen bieden. Als ontwikkelaar zijn er veel verschillende frameworks die u kunt gebruiken om dergelijke apps te maken. 

Maar, tenzij u ook een ervaren 3D-artiest bent, hoe gaat u de 3D-objecten maken die u in die apps zou weergeven? Ben je klaar om maanden door te brengen met leren werken met 3D-modelleringsprogramma's zoals Blender of Maya? Als dat niet het geval is, kunt u overwegen Google Poly te gebruiken, een online repository met duizenden 3D-items die worden geleverd met Creative Commons-licenties.

De meeste van de activa die u vandaag op Poly kunt vinden, zijn laag poly met eenvoudige materialen. Dit komt omdat de gemiddelde mobiele GPU nog niet krachtig genoeg moet zijn om 3D-objecten met hoge aantallen veelhoeken in realtime weer te geven.

In deze zelfstudie zal ik u kennis laten maken met de Poly API. Ik zal u ook laten zien hoe u Processing voor Android gebruikt om de 3D-items die u downloadt te renderen.

voorwaarden

Om het beste uit deze zelfstudie te halen, hebt u het volgende nodig:

  • de nieuwste versie van Android Studio
  • een apparaat met Android API-niveau 21 of hoger
  • en een Google Cloud-account 

1. Een API-sleutel verkrijgen

Alle HTTP-verzoeken die u in de Poly API indient, moeten vergezeld zijn van een API-sleutel die bij u hoort. Als u de sleutel wilt verkrijgen, logt u in op de Google Cloud-console en navigeert u naar het API-dashboard.

Druk vervolgens op API's en services inschakelen knop, vouw de anders categorie en selecteer Poly API.


U kunt nu op de in staat stellen om de Poly API in te schakelen.

Zodra de API is ingeschakeld, wordt automatisch een reeks API-sleutels gegenereerd. U kunt de Geloofsbrieven tab om ze te bekijken.

Voor deze zelfstudie hebt u alleen de Android-sleutel. Noteer het, zodat u het later kunt gebruiken.

2. Projectinstellingen

Omdat Poly momenteel geen officiële toolkit voor het Android-platform heeft, moet u direct met de Poly API werken met behulp van de REST-interface. Door de Fuel networking-bibliotheek te gebruiken, die is geoptimaliseerd voor de Kotlin-taal, kunt u veel tijd en moeite besparen. Dus voeg het volgende toe implementatie afhankelijkheid in de app module build.gradle het dossier:

implementatie 'com.github.kittinunf.fuel: brandstof-android: 1.13.0'

Om de 3D-items die u downloadt vanuit de Poly-repository te kunnen weergeven, hebt u ook een rendering-engine nodig. Verwerking voor Android wordt geleverd met één, dus voeg het toe als een andere afhankelijkheid.

implementatie 'org.p5android: processing-core: 4.0.1'

Vergeet tenslotte niet om de INTERNET toestemming in het manifestbestand van uw project.

3. Vermelding van activa

Als u een Poly-item wilt downloaden, moet u de unieke ID kennen. Door een browser te gebruiken die WebGL ondersteunt, kunt u gemakkelijk de ID van een item bepalen. Het staat precies in de adresbalk.

Als u echter wilt dat uw gebruikers tijdens runtime dynamisch kunnen bepalen welke items ze willen gebruiken, kunt u de assets.list REST-methode om de ID's van die items te bepalen. Met deze methode kunt u naar activa zoeken met verschillende parameters, zoals trefwoorden, categorieën en 3D-bestandsindelingen.

Laten we voor een realistisch voorbeeld nu proberen de ID's te vinden van een paar items die tot de. Behoren dieren categorie. U bent natuurlijk vrij om een ​​andere geldige categorie te kiezen, zoals architectuur, voedsel, of mensen.

Voordat u uw HTTP-aanvraag samenstelt, is het een goed idee om uw API-sleutel en de basis-URL van de Poly API als constanten in uw activiteit te declareren.

begeleidende object const val key = "Abcdefghabcdefgh1234567810" const val baseURL = "https://poly.googleapis.com/v1"

Met behulp van de basis-URL kunt u de URL van de assets.list REST-methode zoals hieronder getoond:

val listURL = "$ baseURL / assets"

Op dit punt kunt u een geldig HTTP GET-verzoek maken door het httpGet () methode en het doorgeven van uw API-sleutel en de gewenste categorie als queryparameters. Optioneel kunt u de formaat queryparameter om het gewenste formaat van de activa op te geven. Poly ondersteunt OBJ, FBX, TILT en verschillende andere populaire 3D-indelingen.

Omdat de methode asynchroon wordt uitgevoerd en het resultaat een JSON-document is, moet u er een gebeurtenishandler aan koppelen met behulp van de responseJSON () methode. De volgende code laat zien hoe:

listURL.httpGet (listOf ("categorie" naar "animals", "key" to key, "format" to "OBJ")). responseJson _, _, result -> // Meer code hier

In de gebeurtenishandler hebt u toegang tot een lijst met als uw verzoek is gelukt aanwinst voorwerpen. De naam veld van elk van deze objecten specificeert zijn ID.

Bovendien heeft elk object velden zoals Weergavenaam, licentie, en auteur naam, wat je misschien handig vindt. Laten we voorlopig gewoon het naam en Weergavenaam van alle objecten. De volgende code laat zien hoe:

result.fold (// Genereer activa array val assets = it.obj (). getJSONArray ("assets") // Loop through array voor (i in 0 until assets.length ()) // Get id en displayName val id = assets.getJSONObject (i) .getString ("name") val displayName = assets.getJSONObject (i) .getString ("displayName") // Id afdrukken en displayName Log.d ("POLY", "(ID: $ id) - (NAME: $ displayName) "), // In het geval van een fout Log.e (" POLY "," Er is een fout opgetreden "))

Als u uw app nu uitvoert, zou u de volgende uitvoer in de kunnen zien logcat venster van Android Studio.

4. Activa downloaden

Zodra u de unieke ID van een item hebt, kunt u deze rechtstreeks toevoegen aan de basis-URL van de Poly API om een ​​activum-URL te maken.

// some asset id val assetID = "assets / 3yiIERrKNQr" // zijn url val assetURL = "$ baseURL / $ assetID"

Wanneer u een HTTP GET-verzoek doet naar de activum-URL met behulp van de httpGet () methode opnieuw, u krijgt een JSON-document met slechts één aanwinst voorwerp.

assetURL.httpGet (listOf ("key" to key)) .responseJson _, _, result -> result.fold (val asset = it.obj () // Meer code hier, Log.e ("POLY ", "Er is een fout opgetreden") ) 

Zoals u wellicht in de bovenstaande code heeft opgemerkt, moet dit verzoek ook een queryparameter hebben die uw API-sleutel vermeldt.

Je hebt al geleerd hoe je sommige velden in de. Kunt gebruiken aanwinst object in de vorige stap. Nu, alles wat u hoeft te doen is gebruik maken van de formats array aanwezig in het object om de URL's en namen te bepalen van de bestanden die aan het item zijn gekoppeld. Elk item in de array heeft drie belangrijke velden: 

  • formatType, waarmee u het type van het activum kunt bepalen
  • wortel, die de naam en de URL bevat van het primaire bestand dat aan het activum is gekoppeld
  • middelen, die details bevat over alle secundaire bestanden die aan het item zijn gekoppeld, zoals materialen en texturen

Als u met de OBJ-indeling werkt, is het primaire bestand een .obj bestand met vertices en faces-data, en de secundaire bestanden zijn dat meestal .mtl bestanden met gegevens over de gebruikte materialen. De volgende code laat zien hoe u de URL's van zowel de primaire als de secundaire bestanden kunt bepalen:

var objFileURL: String? = null var mtlFileURL: String? = null var mtlFileName: String? = null val-formaten = asset.getJSONArray ("formaten") // Doorloop alle formaten voor (i in 0 tot formats.length ()) val currentFormat = formats.getJSONObject (i) // Controleer of het huidige formaat OBJ is als (currentFormat.getString ("formatType") == "OBJ") // Get .obj-bestandsdetails objFileURL = currentFormat.getJSONObject ("root") .getString ("url") // Verkrijg de eerste .mtl-bestandsdetails mtlFileURL = currentFormat.getJSONArray ("resources") .getJSONObject (0) .getString ("url") mtlFileName = currentFormat.getJSONArray ("resources") .getJSONObject (0) .getString ("relativePath") -onderbreking

In de bovenstaande code, in aanvulling op de URL van de .mtl bestand, we bepalen ook de naam met behulp van de relatief pad veld. Dit is belangrijk omdat de naam hard gecodeerd is in de mtllib element van de .obj bestand en mag niet worden gewijzigd.

Zodra u de URL's van beide bestanden hebt, kunt u de HTTPDownload () methode van de Brandstofbibliotheek om ze te downloaden. U kunt ze als volgt downloaden naar de privéopslagmap van uw app, waarvan het absolute pad kan worden bepaald met behulp van de FilesDir eigendom:

// download en sla obj-bestand op als asset.obj objFileURL !!. httpDownload (). bestemming _, _ -> Bestand (filesDir, "asset.obj") .response _, _, result -> result.fold (, Log.e ("POLY", "Er is een fout opgetreden")) // download en sla mtl-bestand op zonder de naam te wijzigen mtlFileURL !!. HttpDownload (). Destination _, _ -> Bestand (filesDir, mtlFileName) .response _, _, result -> result.fold (, Log.e ("POLY", "Er is een fout opgetreden"))

5. Activa weergeven

Je hebt een 3D-tekenpapier nodig om het Poly-item te tekenen dat je hebt gedownload. Om er een te maken, moet je de PApplet klasse aangeboden door de Processing voor Android-bibliotheek. Een canvas dat op deze manier is gemaakt, ondersteunt standaard echter alleen 2D-vormen. Om het te configureren om ook 3D-vormen te tekenen, overschrijft u de Instellingen () methode en doorgeven P3D als een argument voor de volledig scherm() methode, die ook het canvas zo groot maakt als het scherm van de gebruiker.

val canvas = object: PApplet () overschrijf leuke instellingen () fullScreen (PConstants.P3D) // Meer code hier

Maak vervolgens een nieuwe eigenschap binnen de klasse om het Poly-item als een PShape voorwerp.

var myPolyAsset: PShape? = null

Om de eigenschap te initialiseren, overschrijft u de opstelling() methode en bel de loadShape () methode, passeren van het absolute pad van de .obj bestand dat u als argument hebt gedownload.

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

U kunt nu beginnen met tekenen op het canvas door de. Te overschrijven trek() methode. Binnen de methode, is het eerste wat je hoeft te doen het bellen van de achtergrond() methode om ervoor te zorgen dat je altijd op een leeg canvas tekent.

negeer leuke trekking () background (0) // Meer code hier

Wanneer ze direct worden getekend, zien de meeste Poly-items er erg klein en omgekeerd uit. U kunt dit oplossen door een aangepaste camera te gebruiken of door canvastransformaties te gebruiken. Om deze tutorial eenvoudig en intuïtief te houden, gebruiken we canvastransformaties.

Gebruik de .om de grootte van het item te vergroten schaal() methode en geef er een grote negatieve waarde aan. De waarde moet negatief zijn om te zorgen dat het activum verticaal wordt omgedraaid. Optioneel kunt u de vertalen() methode om zijn positie langs de X- en Y-as aan te passen. De volgende code laat zien hoe:

schaal (-50f) translate (-4f, -14f)

Je kunt nu doorgaan en het item tekenen door het te gebruiken vorm() methode.

vorm (myPolyAsset)

Het canvas maakt momenteel geen deel uit van de weergavehiërarchie van uw activiteit. Daarom kunt u het item niet zien als u uw app nu probeert uit te voeren. Om dit op te lossen, voegt u eerst een nieuw toe FrameLayout widget naar het XML-bestand met de lay-out van de activiteit.

 

Maak vervolgens een nieuw PFragment bijvoorbeeld gebruik het canvas en wijs het naar de FrameLayout widget.

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

Op dit punt kunt u de app opnieuw uitvoeren om het item te bekijken.

Conclusie

U weet nu hoe u de Poly API moet gebruiken om 3D-items te zoeken en te downloaden. In deze zelfstudie hebt u ook geleerd hoe u die elementen kunt weergeven en manipuleren met behulp van Verwerking voor Android.

Het is vermeldenswaard dat veel van de beschikbare items op Poly zijn gemaakt met Google Blocks, een applicatie die beschikbaar is voor gebruikers van HTC Vive en Oculus Rift. Als u die VR-headsets bezit, overweeg dan om uw eigen modellen te maken en in te dienen.

Voor meer informatie over de Poly API, kunt u de officiële documentatie raadplegen.