Come utilizzare modelli 3D gratuiti da Google Poly nelle app Android

Al giorno d'oggi c'è un'enorme domanda per le app Android che offrono una realtà virtuale immersiva o esperienze di realtà aumentata. Come sviluppatore, ci sono molti diversi framework che puoi usare per creare tali app. 

Ma, a meno che tu non sia anche un abile artista 3D, come riuscirai a creare gli oggetti 3D che visualizzerai in quelle app? Sei pronto per trascorrere mesi a imparare a lavorare con programmi di modellazione 3D come Blender o Maya? In caso contrario, dovresti prendere in considerazione l'utilizzo di Google Poly, un repository online contenente migliaia di risorse 3D fornite con licenze Creative Commons.

La maggior parte delle risorse che puoi trovare su Poly oggi sono low poly con materiali semplici. Questo perché la GPU media mobile deve ancora diventare abbastanza potente da visualizzare oggetti 3D con conteggi di poligoni elevati in tempo reale.

In questo tutorial, ti presenterò all'API Poly. Ti mostrerò anche come utilizzare Processing for Android per il rendering degli asset 3D che scarichi.

Prerequisiti

Per sfruttare al massimo questo tutorial, avrai bisogno di:

  • l'ultima versione di Android Studio
  • un dispositivo con livello API Android 21 o versione successiva
  • e un account Google Cloud 

1. Acquisizione di una chiave API

Tutte le richieste HTTP che fai all'API Poly devono essere accompagnate da una chiave API che ti appartiene. Per acquisire la chiave, inizia accedendo alla console di Google Cloud e passando alla dashboard delle API.

Quindi, premere il tasto Abilita API e servizi pulsante, espandere il Altro categoria e selezionare API Poly.


Ora puoi premere il tasto Abilitare pulsante per abilitare l'API Poly.

Una volta che l'API è abilitata, viene generata automaticamente una serie di chiavi API. È possibile aprire il Credenziali scheda per dare un'occhiata a loro.

Per questo tutorial, avrai bisogno solo del Chiave Android. Prendi nota di ciò in modo che tu possa usarlo più tardi.

2. Impostazione del progetto

Poichè Poly al momento non ha un toolkit ufficiale per la piattaforma Android, dovrai lavorare con la Poly API direttamente usando la sua interfaccia REST. Usando la libreria di rete Fuel, che è ottimizzata per il linguaggio Kotlin, puoi risparmiare un sacco di tempo e fatica. Quindi aggiungi il seguente implementazione dipendenza nel App modulo di build.gradle file:

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

Per poter visualizzare le risorse 3D scaricate dal repository Poly, avrai anche bisogno di un motore di rendering. L'elaborazione per Android viene fornita con una, quindi aggiungila come un'altra dipendenza.

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

Infine, non dimenticare di richiedere il INTERNET permesso nel file manifest del tuo progetto.

3. Elenco delle risorse

Per poter scaricare una risorsa Poly, devi conoscere il suo ID univoco. Utilizzando un browser, uno che supporta WebGL, è possibile determinare facilmente l'ID di qualsiasi risorsa. È giusto nella barra degli indirizzi.

Tuttavia, se si desidera consentire agli utenti di eseguire in modo dinamico, in fase di esecuzione, le risorse che desiderano utilizzare, è possibile utilizzare assets.list Metodo REST per determinare gli ID di tali risorse. Il metodo consente di cercare risorse utilizzando una varietà di parametri, come parole chiave, categorie e formati di file 3D.

Per fare un esempio realistico, proviamo ora a trovare gli ID di alcune risorse che appartengono al animali categoria. Ovviamente, sei libero di scegliere qualsiasi altra categoria valida, come ad esempio architettura, cibo, o persone.

Prima di comporre la tua richiesta HTTP, è una buona idea dichiarare la tua chiave API e l'URL di base dell'API Poly come costanti all'interno della tua attività.

oggetto companion const val key = "Abcdefghabcdefgh1234567810" const val baseURL = "https://poly.googleapis.com/v1"

Utilizzando l'URL di base, è possibile creare l'URL del assets.list Metodo REST come mostrato di seguito:

val listURL = "$ baseURL / assets"

A questo punto, è possibile creare una richiesta HTTP GET valida chiamando il HttpGet () metodo e passando la chiave API e la categoria desiderata come parametri di query ad essa. Facoltativamente, puoi usare il formato parametro di query per specificare il formato desiderato delle risorse. Poly supporta OBJ, FBX, TILT e molti altri formati 3D popolari.

Poiché il metodo viene eseguito in modo asincrono e il suo risultato è un documento JSON, è necessario allegare un gestore di eventi ad esso utilizzando il responseJSON () metodo. Il seguente codice mostra come:

listURL.httpGet (listOf ("category" in "animals", "key" in key, "format" in "OBJ")). responseJson _, _, result -> // Altro codice qui

All'interno del gestore eventi, se la tua richiesta ha avuto successo, avrai accesso a un elenco di Bene oggetti. Il nome il campo di ciascun oggetto specifica il suo ID.

Inoltre, ogni oggetto avrà campi come nome da visualizzare, licenza, e nome dell'autore, che potresti trovare utile. Per ora, stampiamo semplicemente il nome e nome da visualizzare di tutti gli oggetti. Il seguente codice mostra come:

result.fold (// Ottieni asset array val assets = it.obj (). getJSONArray ("assets") // Loop through array for (i in 0 until assets.length ()) // Ottieni id e displayName val id = assets.getJSONObject (i) .getString ("name") val displayName = assets.getJSONObject (i) .getString ("displayName") // Stampa id e displayName Log.d ("POLY", "(ID: $ id) - (NOME: $ displayName) "), // In caso di errore Log.e (" POLY "," Si è verificato un errore "))

Se esegui la tua app ora, dovresti essere in grado di vedere il seguente output in logcat finestra di Android Studio.

4. Download di risorse

Una volta ottenuto l'ID univoco di un asset, è possibile aggiungerlo direttamente all'URL di base dell'API Poly per creare un URL di asset.

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

Quando si effettua una richiesta HTTP GET all'URL della risorsa utilizzando il HttpGet () di nuovo, otterrai un documento JSON contenente solo uno Bene oggetto.

assetURL.httpGet (listOf ("chiave" per chiave)) .responseJson _, _, result -> result.fold (val asset = it.obj () // Più codice qui, Log.e ("POLY ", "Si è verificato un errore") ) 

Come avrai notato nel codice precedente, anche questa richiesta deve avere un parametro di query che menziona la tua chiave API.

Hai già imparato come utilizzare alcuni dei campi presenti nel Bene oggetto nel passaggio precedente. Ora, tutto ciò che devi fare è usare il formati array presente nell'oggetto per determinare gli URL e i nomi dei file associati alla risorsa. Ogni elemento nell'array avrà tre campi importanti: 

  • formatType, che ti consente di determinare il tipo di risorsa
  • radice, che contiene il nome e l'URL del file primario associato alla risorsa
  • risorse, che contiene dettagli su tutti i file secondari associati alla risorsa, come materiali e trame

Se stai lavorando con il formato OBJ, il file primario sarà a .obj file contenente vertici e facce di dati e di solito saranno i file secondari .mtl file contenenti dati relativi ai materiali utilizzati. Il codice seguente mostra come determinare gli URL di entrambi i file primario e secondario:

var objFileURL: String? = null var mtlFileURL: String? = null var mtlFileName: String? = null val formats = asset.getJSONArray ("formats") // Passa in rassegna tutti i formati per (i in 0 until formats.length ()) val currentFormat = formats.getJSONObject (i) // Controlla se il formato corrente è OBJ se (currentFormat.getString ("formatType") == "OBJ") // Visualizza i dettagli del file .obj objFileURL = currentFormat.getJSONObject ("root") .getString ("url") // Visualizza i primi dettagli del file .mtl mtlFileURL = currentFormat.getJSONArray ("resources") .getJSONObject (0) .getString ("url") mtlFileName = currentFormat.getJSONArray ("resources") .getJSONObject (0) .getString ("relativePath") interruzione

Nel codice sopra, oltre all'URL del .mtl file, stiamo anche determinando il suo nome usando il percorso relativo campo. Ciò è importante perché il nome è codificato in modo rigido nel mtllib elemento del .obj file e non dovrebbe essere cambiato.

Una volta che hai gli URL di entrambi i file, puoi usare il opzioni httpdownload () metodo della libreria Carburante per scaricarli. Ecco come puoi scaricarli nella directory di archiviazione privata della tua app, il cui percorso assoluto può essere determinato utilizzando il file FILESDIR proprietà:

// scarica e salva il file obj come asset.obj objFileURL !!. httpDownload (). destination _, _ -> File (filesDir, "asset.obj") .response _, _, result -> result.fold (, Log.e ("POLY", "Si è verificato un errore")) // scarica e memorizza il file mtl senza // cambiandone il nome mtlFileURL !!. HttpDownload (). Destination _, _ -> File (filesDir, mtlFileName) .response _, _, result -> result.fold (, Log.e ("POLY", "Si è verificato un errore"))

5. Visualizzazione delle risorse

Avrai bisogno di una tela 3D per disegnare la risorsa Poly che hai scaricato. Per crearne uno, devi estendere il PApplet classe offerta dalla libreria Processing per Android. Tuttavia, una tela creata in questo modo, per impostazione predefinita, supporta solo forme 2D. Per configurarlo per disegnare anche forme 3D, sovrascrivere il impostazioni() metodo e passare P3D come argomento per il a schermo intero() metodo, che rende anche la tela grande quanto lo schermo dell'utente.

val canvas = object: PApplet () override fun settings () fullScreen (PConstants.P3D) // Altro codice qui

Successivamente, crea una nuova proprietà all'interno della classe per rappresentare la risorsa Poly come a PShape oggetto.

var myPolyAsset: PShape? = null

Per inizializzare la proprietà, sovrascrivere il impostare() metodo e chiama il loadShape () metodo, passando il percorso assoluto del .obj file scaricato come argomento.

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

È ora possibile iniziare a disegnare sulla tela sovrascrivendo il disegnare() metodo. All'interno del metodo, la prima cosa che devi fare è chiamare il sfondo() metodo per assicurarti di disegnare sempre su una tela bianca.

override fun draw () background (0) // Più codice qui

Quando vengono disegnate direttamente, la maggior parte delle risorse Poly appare molto piccola e invertita. È possibile risolvere questo problema utilizzando una telecamera personalizzata o utilizzando le trasformazioni di canvas. Per mantenere questo tutorial semplice e intuitivo, utilizziamo le trasformazioni di canvas.

Per aumentare la dimensione della risorsa, usa il scala() metodo e passare un grande valore negativo ad esso. Il valore deve essere negativo per assicurarsi che l'asset sia invertito verticalmente. Facoltativamente, puoi usare il tradurre() metodo per regolare la sua posizione lungo gli assi X e Y. Il seguente codice mostra come:

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

Ora puoi andare avanti e disegnare la risorsa chiamando il forma() metodo.

forma (myPolyAsset)

La tela non fa attualmente parte della gerarchia di visualizzazione della tua attività. Pertanto, se provi a eseguire la tua app ora, non sarai in grado di vedere la risorsa. Per risolvere il problema, aggiungi prima un nuovo FrameLayout widget per il file XML di layout dell'attività.

 

Quindi, creane uno nuovo PFragment istanza usando la tela e puntarla verso FrameLayout widget di.

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

A questo punto, puoi eseguire nuovamente l'app per visualizzare la risorsa.

Conclusione

Ora sai come utilizzare l'API Poly per cercare e scaricare risorse 3D. In questo tutorial, hai anche imparato come eseguire il rendering e manipolare tali risorse utilizzando Processing for Android.

Vale la pena notare che molte delle risorse disponibili su Poly sono state create utilizzando Google Blocks, un'applicazione disponibile per gli utenti di HTC Vive e Oculus Rift. Se possiedi questi auricolari VR, considera la possibilità di creare e inviare i tuoi modelli.

Per ulteriori informazioni sull'API Poly, è possibile fare riferimento alla documentazione ufficiale.