Slik bruker du gratis 3D-modeller fra Google Poly i Android Apps

Det er en stor etterspørsel i disse dager for Android-apper som byr på fordyktig virtuell virkelighet eller forstørrede virkelighetsopplevelser. Som utvikler er det mange forskjellige rammer du kan bruke til å lage slike programmer. 

Men, med mindre du er en dyktig 3D-kunstner, hvordan skal du lage 3D-objektene du vil vise i disse appene? Er du klar til å bruke måneder med å lære å jobbe med 3D modelleringsprogrammer som Blender eller Maya? Hvis du ikke er det, bør du vurdere å bruke Google Poly, et online-lager som inneholder tusenvis av 3D-eiendeler som følger med Creative Commons-lisenser.

De fleste av eiendelene du finner på Poly i dag er lav poly med enkle materialer. Dette skyldes at den gjennomsnittlige mobile GPUen ennå ikke blir kraftig nok til å vise 3D-objekter med høyt polygontall i sanntid.

I denne veiledningen vil jeg introdusere deg til Poly API. Jeg vil også vise deg hvordan du bruker Behandling for Android for å gjengi 3D-eiendelene du laster ned.

Forutsetninger

For å få mest mulig ut av denne opplæringen trenger du:

  • den nyeste versjonen av Android Studio
  • En enhet som kjører Android API nivå 21 eller høyere
  • og en Google Cloud-konto 

1. Oppnå en API-nøkkel

Alle HTTP-forespørslene du gjør til Poly API, må ledsages av en API-nøkkel som tilhører deg. For å skaffe nøkkelen, start ved å logge inn på Google Cloud-konsollen og navigere til dashbordet for APIer.

Deretter trykker du på Aktiver APIer og tjenester knappen, utvide Annen kategori, og velg Poly API.


Du kan nå trykke på Aktiver knappen for å aktivere Poly API.

Når API-en er aktivert, genereres et sett med API-nøkler for det automatisk. Du kan åpne legitimasjon fan for å se på dem.

For denne opplæringen vil du bare trenge Android-nøkkel. Legg merke til det slik at du kan bruke det senere.

2. Prosjektoppsett

Fordi Poly for øyeblikket ikke har en offisiell verktøykasse for Android-plattformen, må du jobbe med Poly API direkte ved hjelp av REST-grensesnittet. Ved å bruke Fuel Networking Library, som er optimalisert for Kotlin-språket, kan du spare mye tid og krefter. Så legg til følgende gjennomføring avhengighet i app modulens build.gradle fil:

implementering 'com.github.kittinunf.fuel: fuel-android: 1.13.0'

For å kunne vise 3D-eiendelene du laster ned fra Poly-depotet, trenger du også en gjengivelsesmotor. Behandling for Android kommer med en, så legg den til som en annen avhengighet.

implementering 'org.p5android: behandlingskjerne: 4.0.1'

Til slutt, ikke glem å be om INTERNETT tillatelse i manifestfilen til prosjektet ditt.

3. Oppføring av eiendeler

For å kunne laste ned et Poly-aktiv må du kjenne den unike ID-en. Ved å bruke en nettleser, en som støtter WebGL, kan du enkelt avgjøre IDen til en hvilken som helst ressurs. Det er rett i adressefeltet.

Men hvis du vil gi brukerne mulighet til å bestemme hvilke ressurser de vil bruke, kan du ved bruk av kjøringen bruke assets.list REST-metode for å bestemme ID-ene for disse eiendelene. Metoden lar deg se etter eiendeler ved hjelp av en rekke parametere, for eksempel søkeord, kategorier og 3D-filformater.

For et realistisk eksempel, la oss nå prøve å finne IDene til noen få eiendeler som tilhører dyr kategori. Du er selvsagt fri til å velge hvilken som helst annen gyldig kategori, for eksempel arkitektur, mat, eller mennesker.

Før du skriver HTTP-forespørselen din, er det en god ide å erklære API-nøkkelen og basisadressen til Poly API som konstanter i aktiviteten din.

følgesvennobjekt const val nøkkel = "Abcdefghabcdefgh1234567810" const val baseURL = "https://poly.googleapis.com/v1"

Ved å bruke basen URL, kan du bygge URL til assets.list REST-metode som vist nedenfor:

val listURL = "$ baseURL / assets"

På dette tidspunktet kan du opprette en gyldig HTTP GET-forespørsel ved å ringe httpGet () metode og passerer API-nøkkelen og ønsket kategori som spørringsparametere til den. Eventuelt kan du bruke format spørringsparameter for å angi ønsket format på eiendelene. Poly støtter OBJ, FBX, TILT, og flere andre populære 3D-formater.

Fordi metoden går asynkront, og resultatet er et JSON-dokument, må du legge ved en hendelseshåndterer til det ved å bruke responseJSON () metode. Følgende kode viser deg hvordan:

listURL.httpGet (listOf ("kategori" til "dyr", "nøkkel" til nøkkel, "format" til "OBJ")) svarJson _, _, resultat -> // Mer kode her

Inne i hendelseshandleren, hvis forespørselen din var vellykket, har du tilgang til en liste over ressurs objekter. De Navn feltet for hvert slikt objekt spesifiserer sin ID.

I tillegg vil hvert objekt ha felt som display, tillatelse, og author, som du kanskje finner nyttig. For nå, la oss bare skrive ut Navn og display av alle gjenstandene. Følgende kode viser deg hvordan:

result.fold (// Få eiendomsvalg val assets = it.obj (). getJSONArray ("assets") // Gå gjennom array for (jeg i 0 til assets.length ()) // Få id og displayName val id = assets.getJSONObject (i) .getString ("navn") val displayName = assets.getJSONObject (i) .getString ("displayName") // Skriv ut ID og displayName Log.d ("POLY", "(ID: $ id) - (NAME: $ displayName) "), // Ved en feil Log.e (" POLY "," En feil oppstod "))

Hvis du kjører appen din nå, bør du kunne se følgende utdata i logcat vinduet til Android Studio.

4. Nedlasting av eiendeler

Når du har den unike IDen til en ressurs, kan du legge den direkte til grunnwebadressen til Poly API for å opprette en ressursadresse.

// noen aktiv ID val assetID = "assets / 3yiIERrKNQr" // sin url val assetURL = "$ baseURL / $ assetID"

Når du foretar en HTTP GET-forespørsel til aktivitetsadressen ved hjelp av httpGet () metode igjen, får du et JSON-dokument som inneholder bare ett ressurs gjenstand.

assetURL.httpGet (listOf ("key" til nøkkel)) .responseJson _, _, result -> result.fold (val asset = it.obj () // Mer kode her, Log.e ("POLY ", "En feil oppstod") ) 

Som du kanskje har lagt merke til i koden ovenfor, må denne forespørselen også ha en spørringsparameter som angir API-nøkkelen din.

Du har allerede lært hvordan du bruker noen av feltene som er tilstede i ressurs objekt i forrige trinn. Nå, alt du trenger å gjøre er å bruke formater array tilstede i objektet for å bestemme nettadressene og navnene på filene som er knyttet til aktivet. Hvert element i gruppen har tre viktige felt: 

  • formatType, som lar deg bestemme typen av aktiva
  • rot, som inneholder navnet og nettadressen til den primære filen som er knyttet til aktivet
  • ressurser, som inneholder detaljer om alle sekundære filer knyttet til aktiva, for eksempel materialer og teksturer

Hvis du jobber med OBJ-formatet, blir den primære filen a .obj fil som inneholder vertices og ansikter data, og sekundære filer vil vanligvis være .MTL filer som inneholder data om materialene som brukes. Følgende kode viser deg hvordan du bestemmer nettadressene til både primære og sekundære filer:

var objFileURL: String? = null var mtlFileURL: String? = null var mtlFileName: String? = null valformater = asset.getJSONArray ("formater") // Gå gjennom alle formater for (jeg i 0 til formats.length ()) val currentFormat = formats.getJSONObject (i) // Sjekk om nåværende format er OBJ hvis (currentFormat.getString ("formatType") == "OBJ") // Få .obj fildetaljer objFileURL = currentFormat.getJSONObject ("root") .getString ("url") // Få de første .mtl fil detaljer mtlFileURL = currentFormat.getJSONArray ("ressurser") .getJSONObject (0) .getString ("url") mtlFileName = currentFormat.getJSONArray ("ressurser") .getJSONObject (0) .getString ("relativePath") pause

I koden ovenfor, i tillegg til nettadressen til .MTL fil, vi bestemmer også navnet sitt ved hjelp av relativePath felt. Å gjøre det er viktig fordi navnet er hardt kodet inn i mtllib element av .obj fil og bør ikke endres.

Når du har nettadressene til begge filene, kan du bruke httpDownload () Metoden til drivstoffbiblioteket for å laste dem ned. Slik kan du laste dem ned til appens private lagringskatalog, hvis absolutte vei kan bestemmes ved hjelp av FilesDir eiendom:

// laste ned og lagre obj fil som asset.obj objFileURL !!. httpDownload (). destinasjon _, _ -> Fil (filesDir, "asset.obj") .response _, _, resultat -> result.fold (, Log.e ("POLY", "En feil oppstod")) // Last ned og lagre mtl-filen uten å endre navnet mtlFileURL !!. HttpDownload (). Destinasjon _, _ -> Fil (filerDir, mtlFileName) .response _, _, result -> result.fold (, Log.e ("POLY", "En feil oppstod"))

5. Vise eiendeler

Du trenger et 3D-lerret for å tegne Poly-aktiva du lastet ned. For å opprette en, må du utvide PApplet klassen som tilbys av Behandlings for Android-biblioteket. Et lerret som er opprettet på denne måten, støtter som standard kun 2D-former. For å konfigurere den for å tegne 3D-figurer, overstyr du også innstillinger () metode og pass P3D som et argument til full skjerm() metode som også gjør lerretet så stort som brukerens skjerm.

val canvas = objekt: PApplet () override fun settings () fullScreen (PConstants.P3D) // Mer kode her

Deretter oppretter du en ny eiendom inne i klassen for å representere Poly-aktiva som en PShape gjenstand.

var myPolyAsset: PShape? = null

For å initialisere egenskapen, overstyr den setup () metode og ring til loadShape () metode, passerer den absolutte banen til .obj filen du lastet ned som et argument for det.

overstyr det morsomme oppsettet () myPolyAsset = loadShape (File (filesDir, "asset.obj"). absolutePath)

Du kan nå begynne å tegne på lerretet ved å overstyre tegne() metode. Inne i metoden er det første du må gjøre å ringe bakgrunn() Metode for å sikre at du alltid tegner på et tomt lerret.

overstyr det morsomme tegnet () bakgrunn (0) // Mer kode her

Når de trekkes direkte, ser de fleste Poly-eiendeler seg veldig små og inverterte. Du kan fikse dette enten ved å bruke et egendefinert kamera eller ved å bruke lerretstransformasjoner. For å holde denne opplæringen enkel og intuitiv, la oss bruke lerretstransformasjoner.

For å øke størrelsen på aktiva, bruk skala () metode og passere en stor negativ verdi til den. Verdien må være negativ for å sikre at aktiva blir vendt vertikalt. Eventuelt kan du bruke oversette() Metode for å justere sin posisjon langs X- og Y-aksene. Følgende kode viser deg hvordan:

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

Du kan nå gå videre og tegne aktiva ved å ringe form() metode.

form (myPolyAsset)

Lerret er for øyeblikket ikke en del av aktivitetens synhierarki. Derfor, hvis du prøver å kjøre appen din nå, vil du ikke kunne se aktiva. For å fikse dette, må du først legge til en ny FrameLayout widget til aktivitetens layout XML-fil.

 

Deretter oppretter du en ny PFragment eksempelvis bruk lerretet og pek det til FrameLayout widget.

val fragment = PFragment (lerret) fragment.setView (lærredholder, dette)

På dette tidspunktet kan du kjøre appen igjen for å se aktiva.

Konklusjon

Du vet nå hvordan du bruker Poly API for å søke etter og laste ned 3D-eiendeler. I denne opplæringen lærte du også hvordan du gjengir og manipulerer disse ressursene ved å bruke Behandling for Android.

Det er verdt å merke seg at mange av eiendelene som er tilgjengelige på Poly ble opprettet ved hjelp av Google Blocks, et program tilgjengelig for brukere av HTC Vive og Oculus Rift. Hvis du eier disse VR-hodesettene, bør du vurdere å lage og sende inn dine egne modeller.

For å lære mer om Poly API, kan du se den offisielle dokumentasjonen.