Poly API: Henter 3D-eiendeler for VR- og AR Android-appene dine

Forfatter: Peter Berry
Opprettelsesdato: 14 Lang L: none (month-012) 2021
Oppdater Dato: 2 Kan 2024
Anonim
Poly API: Henter 3D-eiendeler for VR- og AR Android-appene dine - Apps
Poly API: Henter 3D-eiendeler for VR- og AR Android-appene dine - Apps

Innhold


Har du en god ide for en mobilapp, Virtual Reality (VR) eller Augmented Reality (AR), men aner du ikke hvordan du skal gi visjonen din liv?

Med mindre du er en Android-utvikler som også tilfeldigvis er en erfaren 3D-artist, kan det være en skremmende prosess å lage alle eiendelene som kreves for å levere en oppslukende, 360 graders opplevelse.

Bare fordi du ikke har tid, ressurser eller erfaring som er nødvendig for å lage 3D-modeller, ikke betyr at du ikke kan bygge en flott VR- eller AR-mobilapp! Det er et stort utvalg av 3D-ressurser som er fritt tilgjengelig på World Wide Web, pluss alle API-er, rammer og biblioteker du trenger for å laste ned og gjengi disse eiendelene i Android-applikasjonene dine.

Les Neste: Du kan nå besøke hvilken som helst webside ved å bruke Daydream VR. Til og med den.

I denne artikkelen skal vi se på Poly, et nettbasert depot og API som setter tusenvis av 3D-eiendeler til fingerspissene. På slutten av denne artikkelen vil du ha opprettet en app som henter en 3D Poly-eiendel ved kjøretid, og deretter gjengi den ved hjelp av det populære Processing for Android-biblioteket.


Viser 3D-eiendeler med Poly

Hvis du noen gang har dablet i Unity-utviklingen, er Poly-depot lik Unity Asset Store - bortsett fra at alt i Poly er gratis!

Mange av Polys 3D-modeller er publisert under Creative Commons-lisensen, så du står fritt til å bruke, endre og remikse disse eiendelene, så lenge du gir skaperen passende kreditt.

Alle Polys 3D-modeller er designet for å være kompatible med Googles VR- og AR-plattformer, som Daydream og ARCore, men du kan bruke dem hvor og hvor du vil - potensielt kan du til og med bruke dem med Apples ARKit!

Når det gjelder å hente og vise Poly-eiendeler, har du to alternativer. For det første kan du laste ned eiendelene til datamaskinen din og deretter importere dem til Android Studio, slik at de leverer med applikasjonen din og bidrar til APK-størrelsen, eller du kan hente disse eiendelene under drift ved å bruke Poly API.

Den tverrplattforme, REST-baserte Poly API gir programmatisk, skrivebeskyttet tilgang til Polys enorme samling av 3D-modeller. Dette er mer komplisert enn å pakke eiendeler med APK-en din, men det er flere fordeler med å hente Poly-eiendeler under kjøretid, spesielt at det hjelper å holde APK-størrelsen din under kontroll, noe som kan påvirke hvor mange som laster ned applikasjonen din.


Du kan også bruke Poly API for å gi brukerne dine flere valg, for eksempel hvis du utvikler et mobilspill, kan du la brukerne velge mellom en rekke karaktermodeller.

Siden du står fritt til å endre Poly-modellene, kan du til og med la brukerne dine justere det valgte tegnet, for eksempel ved å endre hår- eller øyenfargen, eller ved å kombinere det med andre Poly-eiendeler, for eksempel forskjellige våpen og rustninger. På denne måten kan Poly API hjelpe deg med å levere et imponerende utvalg av 3D-ressurser, med mye rom for å tilpasse opplevelsen - og alt for relativt lite arbeid. Brukerne dine vil være overbevist om at du har brukt et tonn tid og omhyggelig laget alle disse 3D-modellene!

Lage et 3D-modelleringsprosjekt

Vi skal lage en applikasjon som henter en bestemt Poly-eiendel når applikasjonen først blir lansert, og deretter viser den eiendelen i fullskjermmodus, på brukerens forespørsel.

For å hjelpe oss med å hente denne eiendelen, bruker jeg Fuel, som er et HTTP-nettverksbibliotek for Kotlin og Android. Begynn med å opprette et nytt prosjekt med innstillingene du ønsker, men når du blir bedt om det, velger du "Inkluder Kotlin-støtte."

Alle samtaler du ringer til Poly API må inneholde en API-nøkkel, som brukes til å identifisere appen din og håndheve bruksgrenser. Under utvikling og testing vil du ofte bruke en ubegrenset API-nøkkel, men hvis du har noen planer om å gi ut denne appen, må du bruke en Android-begrenset API-nøkkel.

For å opprette en begrenset nøkkel, må du kjenne prosjektets SHA-1-signeringssertifikat, så la oss få denne informasjonen nå:

  • Velg fanen “Gradle” i Android Studio (der markøren er plassert i følgende skjermbilde). Dette åpner et "Gradle projects" -panel.

  • I "Gradle projects" -panelet dobbeltklikker du for å utvide prosjektets "rot", og velg deretter "Oppgaver> Android> Signeringsrapport." Dette åpner et nytt panel nederst i Android Studio-vinduet.
  • Velg knappen "Veksle utførelser / tekstmodus" (der markøren er plassert i følgende skjermbilde).

"Kjør" -panelet vil nå oppdatere for å vise mye informasjon om prosjektet ditt, inkludert SHA-1-fingeravtrykket.

Opprett en Google Cloud Platform-konto

For å skaffe deg den nødvendige API-nøkkelen, trenger du en Google Cloud Platform (GPC) -konto.

Hvis du ikke har en konto, kan du registrere deg for en gratis prøveperiode på 12 måneder ved å gå over til Try Cloud Platform for gratis-siden og følge instruksjonene. Merk at et kredittkort eller debetkort er påkrevd, men i henhold til siden Ofte stilte spørsmål brukes dette bare for å bekrefte identiteten din, og "du vil ikke bli belastet eller fakturert under den gratis prøveperioden."

Få din Poly API-nøkkel

Når du er registrert, kan du aktivere Poly API og opprette nøkkelen:

  • Gå over til GCP-konsollen.
  • Velg det fôrede ikonet i øverste venstre hjørne, og velg "APIer og tjenester> Dashboard."
  • Velg "Aktiver APIer og tjenester."
  • I menyen til venstre velger du “Annet.”
  • Velg "Poly API" -kortet.
  • Klikk på "Aktiver" -knappen.
  • Etter noen øyeblikk blir du ført til en ny skjerm. Åpne sidemenyen og velg "APIer og tjenester> Legitimasjon."

  • I den påfølgende popup-vinduet velger du "Begrens nøkkel."
  • Gi nøkkelen et særegent navn.
  • Under "Applikasjonsbegrensninger" velger du "Android-apper."
  • Velg "Legg til pakkenavn og fingeravtrykk."
  • Kopier / lim inn prosjektets SHA-1-fingeravtrykk i feltet "Signering-Certificate fingerprint".
  • Skriv inn prosjektets pakkenavn (det vises i manifestet og øverst i hver klassefil).
  • Klikk på "Lagre."

Du vil nå bli ført til prosjektets "Credentials" -skjermbilde, som inneholder en liste over alle dine API-nøkler - inkludert den Poly-aktiverte API-nøkkelen du nettopp opprettet.

Prosjektavhengigheter: Drivstoff, P3D og Kotlin utvidelser

For å hente og vise Poly-eiendeler, trenger vi en hjelpende hånd fra noen ekstra biblioteker:

  • Brensel. Poly har foreløpig ingen offisiell Android-verktøysett, så du må jobbe med API direkte ved å bruke REST-grensesnittet. For å gjøre denne prosessen enklere, bruker jeg Fuel HTTP-nettverksbiblioteket.
  • Behandler for Android. Jeg bruker P3D-rendereren i dette biblioteket for å vise Poly-aktiva.

Åpne prosjektets build.gradle-fil, og legg til disse to bibliotekene som prosjektavhengighet:

avhengigheter {implementeringsfilTree (inkluderer:, dir: libs) implementering "org.jetbrains.kotlin: kotlin-stdlib-jre7: $ kotlin_version" implementering com.android.support:appcompat-v7:27.1.1 // Legg til Fuel-biblioteket / / implementering com.github.kittinunf.fuel: fuel-android: 1.13.0 // Legg til prosessering for Android-motor // implementering org.p5android: prosessering-kjerne: 4.0.1}

For å gjøre koden vår mer kortfattet, bruker jeg også Kotlin Android-utvidelser, så la oss legge til denne pluginen mens vi har build.gradle-filen åpen:

bruk plugin: kotlin-android-utvidelser

Til slutt, siden vi henter eiendelen fra Internett, trenger appen vår Internett-tillatelse. Åpne manifestet ditt og legg til følgende:

Legger til API-nøkkelen

Hver gang appen vår ber om en eiendel fra Poly, må den inkludere en gyldig API-nøkkel. Jeg bruker tekstholdertekst, men du erstatt denne plassholderen med din egen API-nøkkel hvis applikasjonen noen gang skal fungere.

Jeg legger også til en sjekk, slik at applikasjonen vil vise en advarsel hvis du glemmer å erstatte teksten "INSERT-YOUR-API-KEY":

import android.os.Bundle import android.support.v7.app.AppCompatActivity class MainActivity: AppCompatActivity () {companion object {const val APIKey = "INSERT-YOUR-API-KEY"} overstyrer moro onCreate (savedInstanceState: Bundle?) { super.onCreate (savedInstanceState) setContentView (R.layout.activity_main) // Hvis API-nøkkelen begynner med "INSERT" ... // if (APIKey.startsWith ("INSERT")) {//, viser deretter følgende toast ... .// Toast.makeText (dette, "Du har ikke oppdatert API-nøkkelen din", Toast.LENGTH_SHORT) .show ()} annet {... ... ...

Henter eiendelen

Du kan velge en hvilken som helst eiendel på Google Poly-siden, men jeg bruker denne modellen av planeten Jorden.

Du henter en eiendel ved å bruke IDen, som vises på slutten av URL-sneglen (uthevet i forrige skjermbilde). Vi kombinerer denne aktiva-IDen med Poly API-verten, som er "https://poly.googleapis.com/v1."

import android.content.Intent import android.os.Bundle import android.support.v7.app.AppCompatActivity import android.widget.Toast import com.github.kittinunf.fuel.android.extension.responseJson import com.github.kittinunf.fuel .httpDownload import com.github.kittinunf.fuel.httpGå import kotlinx.android.synthetic.main.activity_main. * import java.io.File class MainActivity: AppCompatActivity () {companion object {const val APIKey = "INSERT-YOUR-API -KEY "val assetURL =" https://poly.googleapis.com/v1/assets/94XG1XUy10q "} overstyre moro onCreate (savedInstanceState: Bundle?) {Super.onCreate (savedInstanceState) setContentView (R.layout.activity_main) if ( APIKey.startsWith ("INSERT")) {Toast.makeText (dette, "Du har ikke oppdatert API-nøkkelen din", Toast.LENGTH_SHORT) .show ()} annet {

Deretter må vi sende en GET-forespørsel til URL-en til eiendelen ved å bruke metoden httpGet (). Jeg spesifiserer også at responstypen må være JSON:

import android.content.Intent import android.os.Bundle import android.support.v7.app.AppCompatActivity import android.widget.Toast import com.github.kittinunf.fuel.android.extension.responseJson import com.github.kittinunf.fuel .httpDownload import com.github.kittinunf.fuel.httpGå import kotlinx.android.synthetic.main.activity_main. * import java.io.File class MainActivity: AppCompatActivity () {companion object {const val APIKey = "INSERT-YOUR-API -KEY "val assetURL =" https://poly.googleapis.com/v1/assets/94XG1XUy10q "} overstyre moro onCreate (savedInstanceState: Bundle?) {Super.onCreate (savedInstanceState) setContentView (R.layout.activity_main) if ( APIKey.startsWith ("INSERT")) {Toast.makeText (dette, "Du har ikke oppdatert API-nøkkelen din", Toast.LENGTH_SHORT) .show ()} annet {// Foreta et serveranrop, og send deretter dataene ved å bruke "ListOf" metode // assetURL.httpGet (listOf ("nøkkel" til APIKey)). ResponsJson {forespørsel, respons, resultat -> // Gjør noe med svaret // result.fold ({val as sett = it.obj ()

Eiendelen kan ha flere formater, for eksempel OBJ, GLTF og FBX. Vi må bestemme at eiendelen er i OBJ-format.

I dette trinnet henter jeg også inn navn og URL til alle filene vi trenger å laste ned,
inkludert eiendelens primære fil ("root"), pluss eventuelle tilknyttede materiale- og teksturfiler ("ressurser").

Hvis applikasjonen vår ikke klarer å hente eiendelen riktig, vil den vise en skål som informerer brukeren.

import android.content.Intent import android.os.Bundle import android.support.v7.app.AppCompatActivity import android.widget.Toast import com.github.kittinunf.fuel.android.extension.responseJson import com.github.kittinunf.fuel .httpDownload import com.github.kittinunf.fuel.httpGå import kotlinx.android.synthetic.main.activity_main. * import java.io.File class MainActivity: AppCompatActivity () {companion object {const val APIKey = "INSERT-YOUR-API -KEY "val assetURL =" https://poly.googleapis.com/v1/assets/94XG1XUy10q "} overstyre moro onCreate (savedInstanceState: Bundle?) {Super.onCreate (savedInstanceState) setContentView (R.layout.activity_main) if ( APIKey.startsWith ("INSERT")) {Toast.makeText (dette, "Du har ikke oppdatert API-nøkkelen din", Toast.LENGTH_SHORT). Show ()} annet {// Gjør en GET-forespørsel til eiendelens URL // assetURL. httpGet (listOf ("nøkkel" til APIKey)). responseJson {forespørsel, respons, resultat -> // Gjør noe med svaret // result.fold ({val asset = it.obj () var objectURL: String? = null var materialLibraryName: String? = null var materialLibraryURL: String? = null // Sjekk eiendelens format ved å bruke "formater" -feltet // val assetFormats = asset.getJSONArray ("formater") // Loop gjennom alle formatene // for (i i 0 til assetFormats.length ()) { val currentFormat = assetFormats.getJSONObject (i) // Bruk formattype for å identifisere denne ressurens formattype. Hvis formatet er OBJ… .// if (currentFormat.getString ("formatType") == "OBJ") {//...så hente denne ressursens 'root' -fil, dvs. OBJ-filen // objectURL = currentFormat. getJSONObject ("root") .getString ("url") // Hent alle rootfilens avhengigheter // materialLibraryName = currentFormat.getJSONArray ("ressurser") .getJSONObject (0) .getString ("relativePath") materialLibraryURL = currentFormat.getJSONAray ("ressurser") .getJSONObject (0) .getString ("url") break}} objectURL !!. httpDownload (). destinasjon {_, _ -> File (filesDir, "globeAsset.obj")}. svar {_ , _, result -> result.fold ({}, {// Hvis du ikke kan finne eller laste ned OBJ-filen, viser du en feil // Toast.makeText (dette, "Kan ikke laste ned ressurs", Toast.LENGTH_SHORT ) .show ()})} materialLibraryURL !!. httpDownload (). destinasjon {_, _ -> File (filesDir, materialLibraryName)}. svar {_, _, result -> result.fold ({}, {Toast. makeText (dette, "Kan ikke laste ned ressurs", Toast.LENGTH_SHORT) .show ()})}}, { Toast.makeText (dette, "Kan ikke laste ned ressurs", Toast.LENGTH_SHORT) .show ()})}}}

På dette tidspunktet, hvis du installerer prosjektet på Android-smarttelefonen eller nettbrettet ditt, eller Android Virtual Device (AVD), vil eiendelen lastes ned, men appen vil faktisk ikke vise den. La oss fikse dette nå!

Opprette en ny skjerm: Legger til navigasjon

Vi kommer til å vise eiendelen i fullskjermmodus, så la oss oppdatere main_activity.xml-filen til å inkludere en knapp som når du trykker på vil starte fullskjermaktivitet.

La oss nå legge til onClickListener på slutten av filen MainActivity.kt:

import android.content.Intent import android.os.Bundle import android.support.v7.app.AppCompatActivity import android.widget.Toast import com.github.kittinunf.fuel.android.extension.responseJson import com.github.kittinunf.fuel .httpDownload import com.github.kittinunf.fuel.httpGå import kotlinx.android.synthetic.main.activity_main. * import java.io.File class MainActivity: AppCompatActivity () {companion object {const val APIKey = "INSERT-YOUR-API -KEY "val assetURL =" https://poly.googleapis.com/v1/assets/94XG1XUy10q "} overstyre moro onCreate (savedInstanceState: Bundle?) {Super.onCreate (savedInstanceState) setContentView (R.layout.activity_main) if ( APIKey.startsWith ("INSERT")) {Toast.makeText (dette, "Du har ikke oppdatert API-nøkkelen din", Toast.LENGTH_SHORT) .show ()} else {assetURL.httpGet (listOf ("key" til APIKey)). responseJson {forespørsel, respons, resultat -> result.fold ({val asset = it.obj () var objectURL: String? = null var materialLibraryName: String? = null var materialLibraryURL: Str ing? = null val assetFormats = asset.getJSONArray ("formater") for (i i 0 til assetFormats.length ()) {val currentFormat = assetFormats.getJSONObject (i) if (currentFormat.getString ("formatType") == "OBJ" ) {objectURL = currentFormat.getJSONObject ("root") .getString ("url") materialLibraryName = currentFormat.getJSONArray ("resources") .getJSONObject (0) .getString ("relativePath") materialLibraryURL = currentFormat.getJSONArray ) .getJSONObject (0) .getString ("url") break}} objectURL !!. httpDownload (). destinasjon {_, _ -> File (filesDir, "globeAsset.obj")}. svar {_, _, resultat -> result.fold ({}, {Toast.makeText (dette, "Kan ikke laste ned ressurs", Toast.LENGTH_SHORT). show ()})} materialLibraryURL !!. httpDownload (). destinasjon {_, _ -> Fil (filesDir, materialLibraryName)}. svar {_, _, result -> result.fold ({}, {Toast.makeText (dette, "Kan ikke laste ned ressurs", Toast.LENGTH_SHORT). show ()})}}, {Toast.makeText (dette, "Kan ikke laste ned ressurs", Toast.LENGTH_SHORT) .sh ow ()})} // Implementere en knapp // displayButton.setOnClickListener {val intention = Intent (dette, SecondActivity :: class.java) startActivity (intention); }}}

Bygge et 3D-lerret

La oss nå lage aktiviteten der vi vil vise eiendelen vår i fullskjermmodus:

  • Kontroll-klikk på prosjektets MainActivity.kt-fil, og velg "Ny> Kotlin fil / klasse."
  • Åpne rullegardinmenyen “Kind”, og velg “Class.”
  • Gi denne klassen navnet “SecondActivity”, og klikk deretter “OK.”

For å tegne et 3D-objekt trenger vi et 3D-lerret! Jeg skal bruke Processing for Android's biblioteks P3D-renderer, som betyr å utvide PApplet-klassen, overstyre metoden for innstillinger () og deretter sende P3D som et argument til metoden FullScreen (). Vi må også lage en eiendom som representerer Poly-eiendelen som et PShape-objekt.

privat morsom displayAsset () {val canvas3D = objekt: PApplet () {var polyAsset: PShape? = null overstyrer morsomme innstillinger () {fullScreen (PConstants.P3D)}

Deretter må vi initialisere PShape-objektet ved å overstyre Setup-metoden, kalle loadShape () -metoden og deretter passere den absolutte banen til .obj-filen:

overstyre morsomme oppsett () {polyAsset = loadShape (File (filesDir, "globeAsset.obj"). absolutePath)}

Tegning på P3Ds lerret

For å tegne på dette 3D-lerretet, må vi overstyre metoden Draw ():

overstyre morsom tegning () {bakgrunn (0) form (polyAsset)}}

Som standard er mange av eiendelene hentet fra Poly API på den mindre siden, så hvis du kjører denne koden nå, kan det hende du ikke en gang ser eiendelen, avhengig av skjermkonfigurasjonen. Når du lager 3D-scener, vil du vanligvis lage et tilpasset kamera slik at brukeren kan utforske scenen og se 3D-eiendelene dine fra hele 360 ​​grader. Dette er imidlertid utenfor omfanget av denne artikkelen, så jeg endrer eiendelens størrelse og posisjon manuelt for å sikre at den passer komfortabelt på skjermen.

Du kan øke eiendelens størrelse ved å føre en negativ verdi til skala () -metoden:

skala (-10f)

Du kan justere eiendelens posisjon i det virtuelle 3D-rommet ved å bruke translate () -metoden og følgende koordinater:

  • X. Plasser eiendelen langs den horisontale aksen.
  • Y. Plasser eiendelen langs den vertikale aksen.
  • Z. Dette er "dybde / høyde" -aksen, som forvandler et 2D-objekt til et 3D-objekt. Positive verdier skaper inntrykk av at objektet kommer mot deg, og negative verdier skaper inntrykk av at objektet beveger seg bort fra deg.

Merk at transformasjoner er kumulative, så alt som skjer etter funksjonen akkumulerer effekten.

Jeg bruker følgende:

oversett (-50f, -100f, 10f)

Her er den ferdige koden:

overstyre morotegning () {bakgrunn (0) skala (-10f) oversette (-50f, -100f) // Tegn eiendelen ved å kalle formen () -metoden // form (polyAsset)}}

Deretter må vi lage den tilsvarende layoutfilen, der vi legger til 3D-lerretet som en FrameLayout-widget:

  • Kontroll-klikk på prosjektets "res> layout" -mappe.
  • Velg "Layout resource file."
  • Gi denne filen navnet “aktivitet_sekund”, og klikk deretter “OK.”

Nå har vi vår “asset_view” FrameLayout, vi må gi vår SecondActivity beskjed om det! Bla tilbake til filen SecondActivity.kt, opprett en ny PFragment-forekomst og pek den i retning av “asset_view”-widgeten:

import android.os.Bundle import android.support.v7.app.AppCompatActivity import kotlinx.android.synthetic.main.activity_second. * import processing.android.PFragment importbehandling.core.PApplet importbehandling.core.PConstants import processing.core .PShape import java.io.File class SecondActivity: AppCompatActivity () {overstyre moro onCreate (savedInstanceState: Bundle?) {Super.onCreate (savedInstanceState) setContentView (R.layout.activity_second) displayAsset ()} privat moro displayAsset () {val canvas3D = objekt: PApplet () {var polyAsset: PShape? = null overstyre morsomme innstillinger () {fullScreen (PConstants.P3D)} overstyre morsomme oppsett () {polyAsset = loadShape (File (filesDir, "globeAsset.obj"). absolutePath)} overstyre morotegning () {bakgrunn (0) skala (-10f) oversette (-50f, -100f) form (polyAsset)}} // Legg til følgende // val assetView = PFragment (canvas3D) assetView.setView (asset_view, dette)}}

Det siste trinnet er å legge til SecondActivity til manifestet ditt:

// Legg til følgende //

Testing av prosjektet ditt

Vi er nå klare til å teste det ferdige prosjektet! Installer den på Android-enheten eller AVD, og ​​sørg for at du har en aktiv Internett-tilkobling. Så snart appen lanseres, vil den laste ned eiendelen, og du kan deretter se den ved å gi knappen "Display Asset" et trykk.

Du kan laste ned dette komplette prosjektet fra GitHub.

Innpakking

I denne artikkelen så vi på hvordan du bruker Poly API for å hente en 3D-eiendel under kjøretid, og hvordan du kan vise den eiendelen ved å bruke Processing for Android-biblioteket. Tror du at Poly API har potensial til å gjøre VR og AR-utvikling tilgjengelig for flere mennesker? Gi oss beskjed i kommentarene nedenfor!

I slekt

  • Google vil bringe AR-apper til “hundrevis av millioner” Android-enheter i 2018
  • Google vil lære deg om AI og maskinlæring gratis
  • 15 beste VR-spill for Google Papp
  • 10 beste VR-apper for Google Papp
  • Hva er Google Fuchsia? Er dette den nye Android?
  • Hva er Google Duplex? - funksjoner, utgivelsesdato og mer
  • Hvordan lage en VR-app for Android på bare 7 minutter
  • Mobil VR-headset - hva er de beste alternativene?

Fremtredende amung-annoner om kritierte Apple iPhone finne ikke lenger på amung amerikanke YouTube-kanal.Annonene pirret moro ved Apple belutninger om å fjerne hodetelefonkontakten og bruke ...

De ite tre kvartalene på rad har den kineike produenten OnePlu hatt kronen i India om den ledende markedjefen for marttelefoner. Da elkapet tok den kronen bort fra amung, var det litt av et jokk ...

Nettstedsvalg