Cum să utilizați modele 3D gratuite de la Google Poly în aplicații Android

Există o mare cerere în aceste zile pentru aplicațiile Android care oferă realități virtuale imersive sau experiențe de realitate augmentate. Ca dezvoltator, există multe cadre diferite pe care le puteți utiliza pentru a crea astfel de aplicații. 

Dar, dacă nu sunteți, de asemenea, un artist 3D calificat, cum veți crea obiecte 3D pe care le afișați în acele aplicații? Sunteți gata să petreceți luni de învățare cum să lucrați cu programe de modelare 3D cum ar fi Blender sau Maya? Dacă nu sunteți, ar trebui să luați în considerare utilizarea Google Poly, un magazin online care conține mii de elemente 3D care apar cu licențe Creative Commons.

Cele mai multe dintre activele pe care le puteți găsi astăzi pe poli sunt poli de joasă presiune cu materiale simple. Acest lucru se datorează faptului că GPU-ul mediu mobil este încă suficient de puternic pentru a afișa obiecte 3D cu număr mare de poligoane în timp real.

În acest tutorial, vă prezint Poly API. De asemenea, vă vom arăta cum să utilizați Procesarea pentru Android pentru a face activele 3D pe care le descărcați.

Cerințe preliminare

Pentru a profita la maximum de acest tutorial, veți avea nevoie de:

  • cea mai recentă versiune de Android Studio
  • un dispozitiv care rulează Android API nivel 21 sau superior
  • și un cont Google Cloud 

1. Obținerea unei chei API

Toate cererile HTTP pe care le faceți la Poly API trebuie să fie însoțite de o cheie API care vă aparține. Pentru a obține cheia, începeți să vă conectați la consola Google Cloud și navigați la tabloul de bord API-uri.

Apoi, apăsați pe Activați API-urile și serviciile buton, extindeți Alte și selectați Poly API.


Acum puteți apăsa butonul Permite pentru a activa API-ul Poly.

Odată ce API-ul este activat, se generează automat un set de chei API. Puteți deschide scrisori de acreditare pentru a le arunca o privire.

Pentru acest tutorial, veți avea nevoie doar de Tasta Android. Faceți o notă de acest lucru, astfel încât să puteți folosi mai târziu.

2. Configurarea proiectului

Deoarece, în prezent, Poly nu are un set de instrumente oficiale pentru platforma Android, va trebui să lucrați direct cu Poly API folosind interfața sa REST. Folosind biblioteca de rețele de combustibil, optimizată pentru limba Kotlin, puteți economisi mult timp și efort. Adăugați următoarele punerea în aplicare dependența în aplicaţia ale modulului build.gradle fişier:

implementare "com.github.kittinunf.fuel: fuel-android: 1.13.0 '

Pentru a putea afișa materialele 3D pe care le descărcați din depozitul Poly, veți avea nevoie și de un motor de randare. Procesarea pentru Android vine cu una, deci adăugați-o ca o altă dependență.

implementarea "org.p5android: processing-core: 4.0.1 '

În cele din urmă, nu uitați să solicitați INTERNET permisiune în fișierul manifest al proiectului dvs..

3. Afișarea activelor

Pentru a putea descărca un element Poly, trebuie să cunoașteți codul său unic. Utilizând un browser care acceptă WebGL, puteți să determinați cu ușurință ID-ul oricăror elemente. Este exact în bara de adrese.

Cu toate acestea, dacă doriți să permiteți utilizatorilor dvs. dinamic, la momentul executării, să decideți ce active doresc să utilizeze, puteți utiliza assets.list REST pentru a determina ID-urile acestor active. Metoda vă permite să căutați materiale utilizând o varietate de parametri, cum ar fi cuvintele cheie, categoriile și formatele de fișiere 3D.

De dragul unui exemplu realist, să încercăm acum să găsim codurile de identificare a câtorva active care aparțin animale categorie. Sunteți, desigur, liberi să alegeți orice altă categorie valabilă, cum ar fi arhitectură, alimente, sau oameni.

Înainte de a vă compila solicitarea dvs. HTTP, este o idee bună să declarați cheia dvs. API și adresa URL de bază a API-ului Poly ca constante în interiorul activității dvs..

obiect însoțitor const val key = "Abcdefghabcdefgh1234567810" const val baseURL = "https://poly.googleapis.com/v1"

Folosind URL-ul de bază, puteți construi URL-ul assets.list Metoda REST după cum se arată mai jos:

val listURL = "$ baseURL / active"

În acest moment, puteți crea o solicitare validă HTTP GET apelând httpGet () și treceți cheia API și categoria dorită ca parametri de interogare. Opțional, puteți utiliza funcția format interogare pentru a specifica formatul dorit al activelor. Poly suportă OBJ, FBX, TILT și alte câteva formate populare 3D.

Deoarece metoda rulează în mod asincron și rezultatul ei este un document JSON, trebuie să atașați un handler de evenimente la acesta utilizând responseJSON () metodă. Următorul cod vă arată cum:

listURL.httpGet (listOf ("categorie" la "animale", "cheie" la cheie, "format" la "OBJ"

În cadrul procesului de tratare a evenimentului, dacă cererea dvs. a avut succes, veți avea acces la o listă de activ obiecte. Nume câmpul fiecărui obiect specifică ID-ul său.

În plus, fiecare obiect va avea câmpuri cum ar fi numele afisat, licență, și numele autorului, pe care ați putea fi de folos. Pentru moment, să tipărim pur și simplu Nume și numele afisat din toate obiectele. Următorul cod vă arată cum:

result.fold (// Obțineți activele array val assets = it.obj () getJSONArray ("active") // Loop through array pentru (i în 0 până la assets.length ()) // Get id și displayName val id = assets.getJSONObject (i) .getString ("nume") val displayName = assets.getJSONObject (i) .getString ("displayName" id) - (NAME: $ displayName) "), // În cazul unei erori Log.e (" POLY "," A apărut o eroare ")

Dacă rulați aplicația acum, ar trebui să puteți vedea următoarea ieșire în logcat fereastră de Android Studio.

4. Descărcarea de active

Odată ce aveți ID-ul unic al unui activ, îl puteți adăuga direct la adresa URL de bază a API-ului Poly pentru a crea o adresă URL a unui element.

// un anumit activ id val assetID = "assets / 3yiIERrKNQr" // valoarea activului urlURL = "$ baseURL / $ assetID"

Când faceți o solicitare HTTP GET la adresa URL a elementului utilizând httpGet () din nou, veți primi un document JSON care conține doar unul activ obiect.

()) .responseJson _, _, rezultat -> result.fold (val asset = it.obj () // Mai mult cod aici, Log.e ("POLY ", "A aparut o eroare") ) 

După cum probabil ați observat în codul de mai sus, această solicitare trebuie să aibă și un parametru de interogare care să menționeze cheia dvs. API.

Ați învățat deja cum să utilizați câteva din câmpurile prezente în activ obiect în etapa anterioară. Acum, tot ce trebuie să faceți este să utilizați formate array prezent în obiect pentru a determina adresele URL și numele fișierelor asociate cu materialul. Fiecare element din matrice va avea trei câmpuri importante: 

  • formatType, care vă permite să determinați tipul de activ
  • rădăcină, care conține numele și adresa URL a fișierului primar asociat cu materialul
  • resurse, care conține detalii despre toate fișierele secundare asociate cu materialul, cum ar fi materialele și texturile

Dacă lucrați cu formatul OBJ, fișierul principal va fi a .obj fișierul care conține date despre vârfuri și fețe, iar fișierele secundare vor fi de obicei .MTL fișiere care conțin date despre materialele utilizate. Următorul cod vă arată cum să determinați adresele URL ale fișierelor primare și secundare:

var objFileURL: String? = null var mtlFileURL: String? = null var mtlFileName: String? = null val formats = asset.getJSONArray ("formats") // Curea prin toate formatele pentru (i în 0 până la formats.length ()) val currentFormat = formats.getJSONObject (i) // Verificați dacă formatul curent este OBJ dacă (currentFormat.getString ("formatType") == "OBJ") // Obțineți detalii despre fișierul .obj objFileURL = currentFormat.getJSONObject ("root") .getString ("url") // Obțineți detaliile primului fișier .mtl mtlFileURL = currentFormat.getJSONArray ("resurse") .getJSONObject (0) .getString ("url") mtlFileName = actualFormat.getJSONArray ("resurse") .getJSONObject (0) .getString ("relativePath")

În codul de mai sus, în plus față de adresa URL a .MTL fișier, de asemenea, determinăm numele folosind relativePath camp. Acest lucru este important deoarece numele este greu codificat în mtllib element al sistemului .obj fișier și nu ar trebui să fie schimbat.

Odată ce aveți adresele URL ale ambelor fișiere, puteți utiliza funcția HTTPDownload () metoda bibliotecii de combustibil pentru a le descărca. Iată cum le puteți descărca în directorul de stocare privat al aplicației, a cărui cale absolută poate fi determinată utilizând filesDir proprietate:

// descărcați și stocați volumul obj ca asset.obj objFileURL !!. httpDownload () destinație _, _ -> Fișier (filesDir, "asset.obj") .response _, _, result -> result.fold , Log.e ("POLY", "A apărut o eroare")) // descărcați și stocați fișierul mtl fără a schimba numele lui mtlFileURL! HttpDownload () Fișier (fișiereDir, mtlFileName) .response _, _, rezultat -> result.fold (, Log.e ("POLY"

5. Afișarea activelor

Veți avea nevoie de o pânză 3D pentru a desena materialul Poly descărcat. Pentru a crea una, trebuie să extindeți PApplet clasa oferită de biblioteca Procesare pentru Android. Cu toate acestea, o pânză creată în acest fel va avea, în mod implicit, suport numai pentru formele 2D. Pentru ao configura pentru a desena forme 3D, suprascrieți (Setări) metodă și trecere P3D ca argument pentru ecran complet() , care face și pânza la fel de mare ca ecranul utilizatorului.

val canvas = obiect: PApplet () override fun settings () fullScreen (PConstants.P3D) // Mai mult cod aici

Apoi, creați o nouă proprietate în cadrul clasei pentru a reprezenta activul Poly ca a PShape obiect.

var myPolyAsset: PShape? = nul

Pentru a inițializa proprietatea, suprascrieți înființat() și apelați loadShape () metoda, trecând calea absolută a .obj fișierul pe care l-ați descărcat ca argument pentru el.

suprascrie distractiv setup () myPolyAsset = loadShape (fișier (filesDir, "asset.obj") absolutePath)

Acum puteți începe să desenați panza prin suprascrierea a desena() metodă. În interiorul metodei, primul lucru pe care trebuie să-l faceți este să apelați fundal() pentru a vă asigura că întotdeauna trageți pe o pânză necompletată.

suprascrie remiză distractivă () background (0) // Mai mult cod aici

Atunci când sunt trase direct, majoritatea averilor Poly apar foarte mic și inversat. Puteți remedia acest lucru fie prin utilizarea unei camere personalizate, fie prin utilizarea transformărilor de panza. Pentru a păstra acest tutorial simplu și intuitiv, hai să folosim transformările de panza.

Pentru a mări dimensiunea activului, utilizați scară() și să treacă o valoare negativă mare. Valoarea trebuie să fie negativă pentru a vă asigura că materialul este răsturnat vertical. Opțional, puteți utiliza funcția Traduceți() pentru a-și ajusta poziția de-a lungul axelor X și Y. Următorul cod vă arată cum:

scară (-50f) traduce (-4f, -14f)

Acum puteți merge și atrageți materialul apelând formă() metodă.

forma (myPolyAsset)

În prezent, pânza nu face parte din ierarhia de vizualizare a activității dvs. Prin urmare, dacă încercați să rulați aplicația acum, nu veți putea vedea activul. Pentru a rezolva aceasta, mai întâi adăugați un nou FrameLayout widget la fișierul XML al aranjamentului activității.

 

Apoi, creați un nou PFragment utilizând panza și îndreptați-o spre FrameLayout widget.

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

În acest moment, puteți rula aplicația din nou pentru a vedea activul.

Concluzie

Acum știți cum să utilizați API-ul Poly pentru a căuta și descărca elemente 3D. În acest tutorial, de asemenea, ați învățat cum să faceți și să manipulați aceste bunuri utilizând Procesarea pentru Android.

Merită menționat faptul că multe dintre activele disponibile pentru Poly au fost create utilizând Google Blocks, o aplicație disponibilă pentru utilizatorii HTC Vive și Oculus Rift. Dacă dețineți căștile VR, luați în considerare crearea și trimiterea propriilor modele.

Pentru a afla mai multe despre API-ul Poly, vă puteți referi la documentația oficială.

Cod