Poly API: Henter 3D-aktiver til dine VR- og AR Android-apps

Forfatter: Peter Berry
Oprettelsesdato: 14 August 2021
Opdateringsdato: 8 Kan 2024
Anonim
Poly API: Henter 3D-aktiver til dine VR- og AR Android-apps - Apps
Poly API: Henter 3D-aktiver til dine VR- og AR Android-apps - Apps

Indhold


Har du en god ide til en mobilapp til Virtual Reality (VR) eller Augmented Reality (AR), men har du ingen idé om, hvordan du får din vision til live?

Medmindre du er en Android-udvikler, der også tilfældigvis er en erfaren 3D-kunstner, kan det være en skræmmende proces at oprette alle de aktiver, der kræves for at levere en fordybende 360-graders oplevelse.

Bare fordi du ikke har den tid, ressourcer eller erfaring, der er nødvendig til at oprette 3D-modeller, ikke betyder, at du ikke kan bygge en fantastisk VR- eller AR-mobilapp! Der er en enorm vifte af 3D-ressourcer, der er frit tilgængelige på World Wide Web, plus alle de API'er, rammer og biblioteker, du har brug for for at downloade og gengive disse aktiver i dine Android-applikationer.

Læs næste: Du kan nu besøge ethvert websted ved hjælp af Daydream VR. Selv den ene.

I denne artikel skal vi se på Poly, et online depot og API, der sætter tusinder af 3D-aktiver inden for dine hånden. I slutningen af ​​denne artikel har du oprettet en app, der henter et 3D Poly-aktiv under kørsel og derefter gengiver det ved hjælp af det populære Processing for Android-bibliotek.


Viser 3D-aktiver med Poly

Hvis du nogensinde har fordybet dig i Unity-udviklingen, er Poly-arkivet svarende til Unity Asset Store - bortset fra at alt i Poly er gratis!

Mange af Polys 3D-modeller offentliggøres under Creative Commons-licensen, så du er fri til at bruge, ændre og remix disse aktiver, så længe du giver skaberen passende kredit.

Alle Polys 3D-modeller er designet til at være kompatible med Googles VR- og AR-platforme, såsom Daydream og ARCore, men du kan bruge dem, hvor og hvor du vil - potentielt kan du endda bruge dem med Apples ARKit!

Når det kommer til at hente og vise Poly-aktiver, har du to muligheder. For det første kan du downloade aktiverne til din computer og derefter importere dem til Android Studio, så de leveres med din applikation og bidrage til dens APK-størrelse, eller du kan hente disse aktiver under kørsel ved hjælp af Poly API.

Den tværplatformede, REST-baserede Poly API giver programmatisk, læseles adgang til Polys enorme samling af 3D-modeller. Dette er mere kompliceret end at samle aktiver med din APK, men der er flere fordele ved at hente Poly-aktiver under kørsel, især at det hjælper med at holde din APK-størrelse under kontrol, hvilket kan påvirke, hvor mange mennesker, der downloader din applikation.


Du kan også bruge Poly API til at give dine brugere mere valg, for eksempel hvis du udvikler et mobilspil, kan du lade dine brugere vælge fra en række karaktermodeller.

Da du er fri til at ændre Poly-modellerne, kan du endda lade dine brugere finpusse deres valgte karakter, for eksempel ved at ændre hår- eller øjenfarve, eller ved at kombinere det med andre Poly-aktiver, såsom forskellige våben og rustninger. På denne måde kan Poly API hjælpe dig med at levere en imponerende række 3D-aktiver med masser af muligheder for at tilpasse oplevelsen - og alt sammen til relativt lidt arbejde. Dine brugere vil være overbeviste om, at du har brugt et ton tid og omhyggeligt udformet alle disse 3D-modeller!

Oprettelse af et 3D-modelleringsprojekt

Vi vil oprette en applikation, der henter et bestemt Poly-aktiv, når applikationen først lanceres, og derefter viser dette aktiv i fuldskærmstilstand, på brugerens anmodning.

For at hjælpe os med at hente dette aktiv bruger jeg Fuel, som er et HTTP-netværksbibliotek til Kotlin og Android. Start med at oprette et nyt projekt med de valgte indstillinger, men vælg "Inkluder Kotlin support", når du bliver bedt om det.

Alle opkald, du foretager til Poly API, skal indeholde en API-nøgle, der bruges til at identificere din app og håndhæve brugsgrænser. Under udvikling og test bruger du ofte en ubegrænset API-nøgle, men hvis du har nogen planer om at frigive denne app, skal du bruge en Android-begrænset API-nøgle.

Hvis du vil oprette en begrænset nøgle, skal du kende dit projekts SHA-1-underskrivelsescertifikat, så lad os få disse oplysninger nu:

  • Vælg Android Studios fane "Gradle" (hvor markøren er placeret i følgende skærmbillede). Dette åbner et "Gradle projects" -panel.

  • I panelet "Gradle-projekter" skal du dobbeltklikke for at udvide projektets 'rod' og derefter vælge 'Opgaver> Android> Signeringsrapport.' Dette åbner et nyt panel nederst i vinduet Android Studio.
  • Vælg knappen 'Skift udførelse af opgaver / teksttilstand' (hvor markøren er placeret i følgende skærmbillede).

Panelet “Kør” opdateres nu for at vise masser af oplysninger om dit projekt, inklusive dets SHA-1 fingeraftryk.

Opret en Google Cloud Platform-konto

For at få den nødvendige API-nøgle skal du have en Google Cloud Platform (GPC) -konto.

Hvis du ikke har en konto, kan du tilmelde dig en gratis prøveperiode på 12 måneder ved at gå over til siden Try Cloud Platform for gratis og følge instruktionerne. Bemærk, at der kræves et kreditkort eller betalingskort, men i henhold til siden med ofte stillede spørgsmål bruges dette blot til at bekræfte din identitet, og "du vil ikke blive debiteret eller faktureret under din gratis prøveperiode."

Hent din Poly API-nøgle

Når du alle er tilmeldt, kan du aktivere Poly API og oprette din nøgle:

  • Gå over til GCP-konsollen.
  • Vælg det forede ikon i øverste venstre hjørne, og vælg "API'er & tjenester> Dashboard."
  • Vælg "Aktivér API'er og tjenester."
  • I menuen til venstre skal du vælge “Andet”.
  • Vælg "Poly API" -kortet.
  • Klik på knappen "Aktiver".
  • Efter nogle få øjeblikke føres du til en ny skærm; åbn sidemenuen og vælg "API'er og tjenester> Tilladelsesoplysninger."

  • I den efterfølgende popup skal du vælge "Begræns nøgle."
  • Giv din nøgle et karakteristisk navn.
  • Vælg "Android-apps" under "Applikationsbegrænsninger".
  • Vælg "Tilføj pakkenavn og fingeraftryk."
  • Kopier / indsæt dit projekt SHA-1 fingeraftryk i feltet "Signing-certifikat fingeraftryk".
  • Indtast dit projekts pakkenavn (det vises i dit manifest og øverst i hver klassefil).
  • Klik på “Gem”.

Du føres nu til dit projekts skærmbillede "Credentials", der indeholder en liste over alle dine API-nøgler - inklusive den Poly-aktiverede API-nøgle, du lige har oprettet.

Projektafhængighed: Fuel, P3D og Kotlin extensions

For at hente og vise Poly-aktiver, har vi brug for en hjælp fra nogle yderligere biblioteker:

  • Brændstof. Poly har i øjeblikket ikke et officielt Android-værktøjssæt, så du bliver nødt til at arbejde med API'en direkte ved hjælp af dens REST-interface. For at gøre denne proces enklere bruger jeg Fuel HTTP-netværksbiblioteket.
  • Behandler til Android. Jeg bruger dette biblioteks P3D-renderer til at vise Poly-aktivet.

Åbn dit projekts build.gradle-fil, og tilføj disse to biblioteker som projektafhængighed:

afhængigheder {implementeringsfilTree (inkluderer:, dir: libs) implementering "org.jetbrains.kotlin: kotlin-stdlib-jre7: $ kotlin_version" implementering com.android.support:appcompat-v7:27.1.1 // Tilføj brændstofbiblioteket / / implementering com.github.kittinunf.fuel: fuel-android: 1.13.0 // Tilføj Processing for Android-motor // implementering org.p5android: processor-core: 4.0.1}

For at gøre vores kode mere kortfattet bruger jeg også Kotlin Android-udvidelser, så lad os tilføje dette plugin, mens vi har build.gradle-filen åben:

anvend plugin: kotlin-android-extensions

Endelig, da vi henter aktivet fra Internettet, har vores app brug for internettilladelse. Åbn dit manifest, og tilføj følgende:

Tilføjelse af din API-nøgle

Hver gang vores app anmoder om et aktiv fra Poly, skal den indeholde en gyldig API-nøgle. Jeg bruger tekstholdertekst, men du skal udskift denne pladsholder med din egen API-nøgle, hvis applikationen nogensinde vil arbejde.

Jeg tilføjer også en check, så applikationen viser en advarsel, hvis du glemmer at 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"} tilsidesætter sjov onCreate (gemtInstanceState: Bundle?) { super.onCreate (gemtInstanceState) setContentView (R.layout.activity_main) // Hvis API-nøglen begynder med "INSERT" ... // if (APIKey.startsWith ("INSERT")) {//, vises derefter følgende toast ... .// Toast.makeText (dette, "Du har ikke opdateret din API-nøgle", Toast.LENGTH_SHORT) .show ()} andet {... ... ...

Henter aktivet

Du kan vælge ethvert aktiv på Google Poly-webstedet, men jeg bruger denne model af planeten Jorden.

Du henter et aktiv ved hjælp af dets ID, der vises i slutningen af ​​URL-sneglen (fremhævet i det forrige skærmbillede). Vi kombinerer dette aktiv-ID med Poly API-værten, der 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.httpGet 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 "} tilsidesætter sjov onCreate (gemtInstanceState: Bundle?) {Super.onCreate (gemtInstanceState) setContentView (R.layout.activity_main) hvis ( APIKey.startsWith ("INSERT")) {Toast.makeText (dette, "Du har ikke opdateret din API-nøgle", Toast.LENGTH_SHORT) .show ()} andet {

Dernæst skal vi fremsætte en GET-anmodning til aktivets URL ved hjælp af metoden httpGet (). Jeg specificerer også, at responstypen skal 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.httpGet 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 "} tilsidesætter sjov onCreate (gemtInstanceState: Bundle?) {Super.onCreate (gemtInstanceState) setContentView (R.layout.activity_main) hvis ( APIKey.startsWith ("INSERT")) {Toast.makeText (dette, "Du har ikke opdateret din API-nøgle", Toast.LENGTH_SHORT) .show ()} andet {// Foretag et serveropkald, og send derefter dataene vha. "ListOf" metode // assetURL.httpGet (listOf ("nøgle" til APIKey)). ResponsJson {anmodning, svar, resultat -> // Gør noget med svaret // result.fold ({val som sæt = it.obj ()

Aktivet kan have flere formater, såsom OBJ, GLTF og FBX. Vi er nødt til at bestemme, at aktivet er i OBJ-format.

I dette trin henter jeg også navnet og URL'en på alle de filer, vi har brug for at downloade,
inklusive aktivets primære fil ("root") plus eventuelle tilknyttede materiale- og teksturfiler ("ressourcer").

Hvis vores applikation ikke er i stand til at hente aktivet korrekt, viser det en skål, der fortæller brugeren.

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.httpGet 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 "} tilsidesætter sjov onCreate (gemtInstanceState: Bundle?) {Super.onCreate (gemtInstanceState) setContentView (R.layout.activity_main) hvis ( APIKey.startsWith ("INSERT")) {Toast.makeText (dette, "Du har ikke opdateret din API-nøgle", Toast.LENGTH_SHORT) .show ()} andet {// Lav en GET-anmodning til aktivets URL // assetURL. httpGet (listOf ("nøgle" til APIKey)). responseJson {anmodning, svar, resultat -> // Gør noget med svaret // result.fold ({val asset = it.obj () var objectURL: String? = null var materialLibraryName: String? = null var materialLibraryURL: String? = null // Kontroller aktivets format ved hjælp af “formater” -feltet // val assetFormats = asset.getJSONArray ("formater") // Gå igennem alle formater // for (i i 0 indtil assetFormats.length ()) { val currentFormat = assetFormats.getJSONObject (i) // Brug formattype til at identificere denne ressources formattype. Hvis formatet er OBJ… .// if (currentFormat.getString ("formatType") == "OBJ") {//...hent hent denne ressource 'root' -fil, dvs. OBJ-filen // objectURL = currentFormat. getJSONObject ("root") .getString ("url") // Hent alle rodfils afhængigheder // materialLibraryName = currentFormat.getJSONArray ("ressourcer") .getJSONObject (0) .getString ("relativePath") materialLibraryURL = aktuelleFormat.getJSONAray ("ressourcer") .getJSONObject (0) .getString ("url") break}} objectURL !!. httpDownload (). destination {_, _ -> File (filesDir, "globeAsset.obj")}. svar {_ , _, result -> result.fold ({}, {// Hvis du ikke kan finde eller downloade OBJ-filen, skal du vise en fejl // Toast.makeText (dette, "Kan ikke hente ressource", Toast.LENGTH_SHORT ) .show ()})} materialLibraryURL !!. httpDownload (). destination {_, _ -> File (filesDir, materialLibraryName)}. svar {_, _, result -> result.fold ({}, {Toast. makeText (dette, "Kan ikke hente ressource", Toast.LENGTH_SHORT) .show ()})}}, { Toast.makeText (dette, "Kan ikke hente ressource", Toast.LENGTH_SHORT) .show ()})}}}

På dette tidspunkt, hvis du installerer projektet på din Android-smartphone eller tablet eller Android Virtual Device (AVD), downloades aktivet med succes, men appen viser det faktisk ikke. Lad os løse dette nu!

Oprettelse af en anden skærm: Tilføjelse af navigation

Vi vil vise aktivet i fuldskærmstilstand, så lad os opdatere vores main_activity.xml-fil med en knap, der, når der er tappet, vil starte fuldskærmsaktivitet.

Lad os nu tilføje onClickListener til slutningen af ​​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.httpGet 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 "} tilsidesætter sjov onCreate (gemtInstanceState: Bundle?) {Super.onCreate (gemtInstanceState) setContentView (R.layout.activity_main) hvis ( APIKey.startsWith ("INSERT")) {Toast.makeText (dette, "Du har ikke opdateret din API-nøgle", Toast.LENGTH_SHORT) .show ()} andet {assetURL.httpGet (listOf ("key" til APIKey)). responseJson {anmodning, svar, 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 indtil assetFormats.length ()) {val currentFormat = assetFormats.getJSONObject (i) if (currentFormat.getString ("formatType") == "OBJ" ) {objectURL = currentFormat.getJSONObject ("root") .getString ("url") materialLibraryName = currentFormat.getJSONArray ("ressourcer") .getJSONObject (0) .getString ("relativePath") materialLibraryURL = currentFormat.getJSONArray ) .getJSONObject (0) .getString ("url") break}} objectURL !!. httpDownload (). destination {_, _ -> Fil (filesDir, "globeAsset.obj")}. svar {_, _, resultat -> result.fold ({}, {Toast.makeText (dette, "Kan ikke hente ressource", Toast.LENGTH_SHORT). show ()})} materialLibraryURL !!. httpDownload (). destination {_, _ -> Fil (filesDir, materialLibraryName)}. svar {_, _, result -> result.fold ({}, {Toast.makeText (dette, "Kan ikke hente ressource", Toast.LENGTH_SHORT) .show ()})}}, {Toast.makeText (dette, "Kan ikke hente ressource", Toast.LENGTH_SHORT) .sh ow ()})} // Implementér en knap // displayButton.setOnClickListener {val intention = Intent (dette, SecondActivity :: class.java) startActivity (intention); }}}

Bygning af et 3D lærred

Lad os nu oprette den aktivitet, hvor vi viser vores aktiv i fuldskærmstilstand:

  • Kontrol-klik på dit projekt MainActivity.kt-fil, og vælg "Ny> Kotlin fil / klasse."
  • Åbn rullemenuen "Kind", og vælg "Class."
  • Giv denne klasse navnet "SecondActivity", og klik derefter på "OK."

For at tegne et 3D-objekt har vi brug for et 3D lærred! Jeg vil bruge Processing for Android's biblioteks P3D-renderer, hvilket betyder at udvide PApplet-klassen, tilsidesætte metoden indstillinger () og derefter sende P3D som et argument til metoden FullScreen (). Vi er også nødt til at oprette en egenskab, der repræsenterer Poly-aktivet som et PShape-objekt.

privat sjov displayAsset () {val canvas3D = objekt: PApplet () {var polyAsset: PShape? = null tilsidesætter sjove indstillinger () {fullScreen (PConstants.P3D)}

Derefter skal vi initialisere PShape-objektet ved at tilsidesætte metoden setup (), kalde metoden loadShape () og derefter passere den absolutte sti for .obj-filen:

tilsidesætte sjov opsætning () {polyAsset = loadShape (File (filesDir, "globeAsset.obj"). absolutePath)}

Tegning på P3Ds lærred

For at tegne på dette 3D-lærred skal vi tilsidesætte metoden Draw ():

tilsidesætte sjovtegning () {baggrund (0) form (polyAsset)}}

Som standard er mange af de aktiver, der hentes fra Poly API, på den mindre side, så hvis du kører denne kode nu, kan du muligvis ikke engang se aktivet, afhængigt af din skærmkonfiguration. Når du opretter 3D-scener, opretter du typisk et brugerdefineret kamera, så brugeren kan udforske scenen og se dine 3D-aktiver fra hele 360 ​​grader. Dette er dog uden for denne artikels rækkevidde, så jeg ændrer aktivets størrelse og placering manuelt for at sikre, at det passer komfortabelt på skærmen.

Du kan øge aktivets størrelse ved at overføre en negativ værdi til metoden skala ():

skala (-10f)

Du kan justere aktivets position i det virtuelle 3D-rum ved hjælp af translate () -metoden og følgende koordinater:

  • X. Placerer aktivet langs den vandrette akse.
  • Y. Placerer aktivet langs den lodrette akse.
  • Z. Dette er "dybde / højde" akse, der omdanner et 2D-objekt til et 3D-objekt. Positive værdier skaber indtryk af, at objektet kommer mod dig, og negative værdier skaber indtryk af, at objektet bevæger sig væk fra dig.

Bemærk, at transformationer er kumulative, så alt, hvad der sker efter funktionen, akkumulerer effekten.

Jeg bruger følgende:

oversætte (-50f, -100f, 10f)

Her er den udfyldte kode:

tilsidesætte sjovtegn () {baggrund (0) skala (-10f) oversætte (-50f, -100f) // Tegn aktivet ved at kalde metoden form () // form (polyAsset)}}

Dernæst skal vi oprette den tilsvarende layoutfil, hvor vi tilføjer 3D-lærredet som en FrameLayout-widget:

  • Kontrol-klik på dit projekt “res> layout” -mappe.
  • Vælg "Layout-ressourcefil."
  • Giv denne fil navnet "aktivitet_sekund", og klik derefter på "OK."

Nu har vi vores "asset_view" FrameLayout, vi er nødt til at lade vores SecondActivity vide om det! Vend tilbage til filen SecondActivity.kt, opret en ny PFragment-forekomst, og peg den i retning af vores "asset_view"-widget:

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 () {tilsidesætte sjov onCreate (gemtInstanceState: Bundle?) {Super.onCreate (gemtInstanceState) setContentView (R.layout.activity_second) displayAsset ()} privat sjov displayAsset () {val canvas3D = objekt: PApplet () {var polyAsset: PShape? = null tilsidesætter sjove indstillinger () {fullScreen (PConstants.P3D)} tilsidesætter sjove opsætning () {polyAsset = loadShape (File (filesDir, "globeAsset.obj"). absolutePath)} tilsidesætter sjovtegning () {baggrund (0) skala (-10f) oversætte (-50f, -100f) form (polyAsset)}} // Tilføj følgende // val assetView = PFragment (canvas3D) assetView.setView (asset_view, dette)}}

Det sidste trin er at tilføje SecondActivity til dit manifest:

// Tilføj følgende //

Test dit projekt

Vi er nu klar til at teste det færdige projekt! Installer den på din Android-enhed eller AVD, og ​​sørg for, at du har en aktiv internetforbindelse. Så snart appen er startet, downloader den aktivet, og du kan derefter se det ved at trykke på knappen "Display Asset".

Du kan downloade dette komplette projekt fra GitHub.

Afslutter

I denne artikel kiggede vi på, hvordan man bruger Poly API til at hente et 3D-aktiv under kørsel, og hvordan man viser det aktiv ved hjælp af biblioteket Processing for Android. Tror du, at Poly API har potentialet til at gøre VR og AR-udvikling tilgængelig for flere mennesker? Fortæl os det i kommentarerne herunder!

Relaterede

  • Google bringer AR-apps til “hundreder af millioner” Android-enheder i 2018
  • Google lærer dig gratis om AI og maskinlæring gratis
  • 15 bedste VR-spil til Google Papp
  • 10 bedste VR-apps til Google Papp
  • Hvad er Google Fuchsia? Er dette den nye Android?
  • Hvad er Google Duplex? - funktioner, udgivelsesdato og mere
  • Sådan opretter du en VR-app til Android på kun 7 minutter
  • Mobil VR-headset - hvad er dine bedste muligheder?

Google er blevet lået med en bøde på 1,49 milliarder euro for reklamerelaterede overtrædeleovertrædeler.Virkomheden forbød rivalierende øgeannoncører fra at vie...

Den virtuelle virkelighed genererer muligvi overkrifterne i pc og mobilrum, men er et lige å, hvi ikke mere, pændende udigt, der ogå får fodfæte i her og nu. På Google I ...

Se