Heutzutage besteht eine große Nachfrage nach Android-Apps, die immersive Virtual Reality- oder Augmented-Reality-Erlebnisse bieten. Als Entwickler gibt es viele verschiedene Frameworks, mit denen Sie solche Apps erstellen können.
Aber, wenn Sie nicht auch ein erfahrener 3D-Künstler sind, wie werden Sie dann die 3D-Objekte erstellen, die Sie in diesen Apps anzeigen würden? Sind Sie bereit, Monate zu lernen, um mit 3D-Modellierungsprogrammen wie Blender oder Maya zu arbeiten? Andernfalls sollten Sie Google Poly in Betracht ziehen, ein Online-Repository mit Tausenden von 3D-Assets, die mit Creative Commons-Lizenzen geliefert werden.
Die meisten Assets, die Sie heute auf Poly finden können, sind Low-Poly mit einfachen Materialien. Dies liegt daran, dass die durchschnittliche mobile GPU noch nicht leistungsfähig genug ist, um 3D-Objekte mit hohen Polygonzählwerten in Echtzeit anzuzeigen.
In diesem Tutorial werde ich Ihnen die Poly-API vorstellen. Ich zeige Ihnen auch, wie Sie mit Processing für Android die 3D-Assets rendern können, die Sie herunterladen.
Um dieses Tutorial bestmöglich nutzen zu können, benötigen Sie:
Alle HTTP-Anforderungen, die Sie an die Poly-API richten, müssen von einem API-Schlüssel begleitet werden, der Ihnen gehört. Melden Sie sich zum Abrufen des Schlüssels an der Google Cloud-Konsole an und navigieren Sie zum APIs-Dashboard.
Drücken Sie anschließend die Aktivieren Sie APIs und Dienste Schaltfläche, erweitern Sie die Andere Kategorie und wählen Sie Poly-API.
Sie können jetzt die Taste drücken Aktivieren Schaltfläche, um die Poly-API zu aktivieren.
Sobald die API aktiviert ist, wird automatisch ein Satz API-Schlüssel generiert. Sie können das öffnen Referenzen Tab, um einen Blick darauf zu werfen.
Für dieses Tutorial benötigen Sie nur das Android-Taste. Notieren Sie es, damit Sie es später verwenden können.
Da Poly derzeit über kein offizielles Toolkit für Android verfügt, müssen Sie mit der Poly-API direkt über die REST-Schnittstelle arbeiten. Mit der Fuel Network Library, die für die Sprache Kotlin optimiert ist, können Sie viel Zeit und Mühe sparen. Fügen Sie also folgendes hinzu Implementierung
Abhängigkeit in der App
Modul build.gradle Datei:
Implementierung 'com.github.kittinunf.fuel: fuel-android: 1.13.0'
Um die 3D-Assets anzeigen zu können, die Sie aus dem Poly-Repository herunterladen, benötigen Sie auch eine Rendering-Engine. Die Verarbeitung für Android wird mit einem geliefert, fügen Sie es also als weitere Abhängigkeit hinzu.
Implementierung 'org.p5android: Processing-Core: 4.0.1'
Vergessen Sie nicht, das zu fordern INTERNET
Erlaubnis in der Manifestdatei Ihres Projekts.
Um ein Poly-Asset herunterladen zu können, müssen Sie dessen eindeutige ID kennen. Mit einem Browser, der WebGL unterstützt, können Sie leicht die ID eines Assets ermitteln. Es ist direkt in der Adressleiste.
Wenn Sie jedoch zulassen möchten, dass Ihre Benutzer zur Laufzeit dynamisch entscheiden, welche Assets sie verwenden möchten, können Sie das verwenden vermögensliste
REST-Methode zur Ermittlung der IDs dieser Assets. Mit dieser Methode können Sie mit einer Reihe von Parametern wie Schlüsselwörtern, Kategorien und 3D-Dateiformaten nach Assets suchen.
Um ein realistisches Beispiel zu erhalten, versuchen wir nun, die IDs einiger Assets zu finden, die zu der Gruppe gehören Tiere
Kategorie. Sie können natürlich auch eine andere gültige Kategorie auswählen, wie z die Architektur
, Lebensmittel
, oder Menschen
.
Bevor Sie Ihre HTTP-Anforderung erstellen, sollten Sie Ihren API-Schlüssel und die Basis-URL der Poly-API als Konstanten in Ihrer Aktivität deklarieren.
Begleitobjekt const val key = "Abcdefghabcdefgh1234567810" const val baseURL = "https://poly.googleapis.com/v1"
Mit der Basis-URL können Sie die URL von erstellen vermögensliste
REST-Methode wie unten gezeigt:
val listURL = "$ baseURL / assets"
An diesem Punkt können Sie eine gültige HTTP-GET-Anforderung erstellen, indem Sie die httpGet ()
Methode und Übergeben Ihres API-Schlüssels und der gewünschten Kategorie als Abfrageparameter. Optional können Sie das verwenden Format
Abfrageparameter, um das gewünschte Format der Assets anzugeben. Poly unterstützt OBJ, FBX, TILT und einige andere gängige 3D-Formate.
Da die Methode asynchron ausgeführt wird und das Ergebnis ein JSON-Dokument ist, müssen Sie einen Event-Handler mit dem Befehl anhängen responseJSON ()
Methode. Der folgende Code zeigt Ihnen wie:
listURL.httpGet (listOf ("category" an "animals", "key" an key, "format" an "OBJ")). responseJson _, _, result -> // hier mehr Code
Wenn Ihre Anforderung erfolgreich war, haben Sie innerhalb des Ereignishandlers Zugriff auf eine Liste von Asset
Objekte. Das Name
Feld jedes solchen Objekts gibt seine ID an.
Außerdem hat jedes Objekt Felder wie Anzeigename
, Lizenz
, und Autorenname
, das könnte dir nützlich sein. Jetzt drucken wir einfach die Name
und Anzeigename
von allen Objekten. Der folgende Code zeigt Ihnen wie:
result.fold (// Abrufen von Assets array val assets = it.obj (). getJSONArray ("assets") // Schleife durch das Array für (i in 0 bis assets.length ()) // Abrufen von id und displayName val id = assets.getJSONObject (i) .getString ("name") val displayName = assets.getJSONObject (i) .getString ("displayName") // Drucke id und displayName Log.d ("POLY", "(ID: $ id) - (NAME: $ displayName) "), // Im Fehlerfall Log.e (" POLY "," Ein Fehler ist aufgetreten "))
Wenn Sie Ihre App jetzt ausführen, sollten Sie die folgende Ausgabe in sehen können Logcat Fenster von Android Studio.
Wenn Sie die eindeutige ID eines Assets haben, können Sie diese direkt an die Basis-URL der Poly-API anhängen, um eine Asset-URL zu erstellen.
// einige Asset-ID val assetID = "assets / 3yiIERrKNQr" // seine URL val assetURL = "$ baseURL / $ assetID"
Wenn Sie eine HTTP-GET-Anforderung an die Asset-URL erstellen, verwenden Sie die httpGet ()
Wieder erhalten Sie ein JSON-Dokument, das nur eines enthält Asset
Objekt.
assetURL.httpGet (listOf ("key" to key)) .responseJson _, _, result -> result.fold (val asset = it.obj () // Mehr Code hier, Log.e ("POLY.) ", "Ein Fehler ist aufgetreten") )
Wie Sie möglicherweise im obigen Code bemerkt haben, muss auch diese Anforderung über einen Abfrageparameter verfügen, der Ihren API-Schlüssel angibt.
Sie haben bereits gelernt, wie Sie einige der im Feld vorhandenen Felder verwenden Asset
Objekt im vorherigen Schritt. Jetzt brauchen Sie nur noch die Formate
Array im Objekt vorhanden, um die URLs und Namen der mit dem Asset verknüpften Dateien zu bestimmen. Jedes Element im Array hat drei wichtige Felder:
formatType
, So können Sie den Typ des Assets bestimmenWurzel
, Diese enthält den Namen und die URL der primären Datei, die dem Asset zugeordnet istRessourcen
, Enthält Details zu allen sekundären Dateien, die mit dem Asset verbunden sind, z. B. Materialien und TexturenWenn Sie mit dem OBJ-Format arbeiten, ist die Primärdatei eine .obj Datei, die Scheitelpunkt- und Gesichtsdaten enthält, und die Sekundärdateien werden normalerweise erstellt .mtl Dateien mit Daten zu den verwendeten Materialien. Der folgende Code zeigt, wie Sie die URLs der primären und der sekundären Datei ermitteln:
var objFileURL: Zeichenfolge? = null var mtlFileURL: Zeichenfolge? = null var mtlFileName: String? = null val Formate = asset.getJSONArray ("Formate") // Alle Formate für (i in 0 bis format.length ()) durchlaufen. val currentFormat = format.getJSONObject (i) // Überprüfen, ob das aktuelle Format OBJ ist, wenn (currentFormat.getString ("formatType") == "OBJ") // .obj-Dateidetails abrufen objFileURL = currentFormat.getJSONObject ("root") .getString ("url") // Die ersten .mtl-Dateidetails abrufen mtlFileURL = currentFormat.getJSONArray ("resources") .getJSONObject (0) .getString ("url") mtlFileName = currentFormat.getJSONArray ("resources") .getJSONObject (0) .getString ("relativePath") break
Im obigen Code zusätzlich zur URL der .mtl Datei, wir bestimmen auch ihren Namen mit der relativePath
Feld. Dies ist wichtig, da der Name hart in das eingegeben wird mtllib
Element der .obj Datei und sollte nicht geändert werden.
Sobald Sie die URLs der beiden Dateien haben, können Sie die httpDownload ()
Methode der Brennstoffbibliothek, um sie herunterzuladen. So können Sie sie in das private Speicherverzeichnis Ihrer App herunterladen, dessen absoluter Pfad mithilfe von festgelegt werden kann filesDir
Eigentum:
// Laden Sie die obj-Datei herunter und speichern Sie sie als asset.obj objFileURL !!. httpDownload (). destination _, _ -> Datei (filesDir, "asset.obj") .response _, _, result -> result.fold (, Log.e ("POLY", "Ein Fehler ist aufgetreten") // Herunterladen und Speichern der mtl-Datei, ohne // ihren Namen zu ändern mtlFileURL !!. HttpDownload (). Destination _, _ -> Datei (filesDir, mtlFileName) .response _, _, result -> result.fold (, Log.e ("POLY", "Ein Fehler ist aufgetreten"))
Sie benötigen eine 3D-Leinwand, um das heruntergeladene Poly-Asset zu zeichnen. Um einen zu erstellen, müssen Sie die Erweiterung erweitern PApplet
Klasse, die von der Processing for Android-Bibliothek angeboten wird. Eine so erstellte Arbeitsfläche unterstützt jedoch standardmäßig nur 2D-Formen. Um es so zu konfigurieren, dass auch 3D-Formen gezeichnet werden, überschreiben Sie die Option die Einstellungen()
Methode und Pass P3D
als ein Argument an die Vollbildschirm()
Diese Methode macht auch die Leinwand so groß wie der Bildschirm des Benutzers.
val canvas = object: PApplet () Spaßeinstellungen überschreiben () fullScreen (PConstants.P3D) // Mehr Code hier
Erstellen Sie als Nächstes eine neue Eigenschaft in der Klasse, um das Poly-Asset als a darzustellen PShape
Objekt.
var myPolyAsset: PShape? = null
Um die Eigenschaft zu initialisieren, überschreiben Sie die Konfiguration()
Methode und rufen Sie die loadShape ()
Methode, den absoluten Pfad der .obj Datei, die Sie als Argument dazu heruntergeladen haben.
fun setup überschreiben () myPolyAsset = loadShape (File (filesDir, "asset.obj"). absolutePath)
Sie können jetzt mit dem Zeichnen auf der Leinwand beginnen, indem Sie das Symbol überschreiben zeichnen()
Methode. Innerhalb der Methode müssen Sie als erstes das aufrufen Hintergrund()
Methode, um sicherzustellen, dass Sie immer auf einer leeren Leinwand zeichnen.
Spaß überschreiben draw () background (0) // mehr Code hier
Direkt gezeichnet sehen die meisten Poly-Assets sehr klein und invertiert aus. Sie können dies entweder mithilfe einer benutzerdefinierten Kamera oder mithilfe von Leinwandumwandlungen beheben. Um dieses Tutorial einfach und intuitiv zu halten, verwenden wir Canvas-Transformationen.
Um die Größe des Assets zu erhöhen, verwenden Sie die Rahmen()
Methode und übergeben Sie einen großen negativen Wert. Der Wert muss negativ sein, um sicherzustellen, dass das Asset vertikal gespiegelt wird. Optional können Sie das verwenden Übersetzen()
Methode, um seine Position entlang der X- und Y-Achse anzupassen. Der folgende Code zeigt Ihnen wie:
Skala (-50f) übersetzen (-4f, -14f)
Sie können jetzt das Asset zeichnen, indem Sie die gestalten()
Methode.
Form (myPolyAsset)
Die Leinwand ist derzeit nicht Teil der Ansichtshierarchie Ihrer Aktivität. Wenn Sie nun versuchen, Ihre App jetzt auszuführen, können Sie das Asset nicht sehen. Um dies zu beheben, fügen Sie zuerst ein neues hinzu FrameLayout
Widget in die XML-Layout-Datei der Aktivität.
Dann erstellen Sie ein neues PFragment
Beispiel mit der Leinwand und zeigen Sie auf die FrameLayout
Widget.
val fragment = PFragment (Zeichenfläche) fragment.setView (canvas_holder, this)
An diesem Punkt können Sie die App erneut ausführen, um das Asset anzuzeigen.
Sie wissen jetzt, wie Sie mit der Poly-API 3D-Assets suchen und herunterladen können. In diesem Lernprogramm haben Sie außerdem erfahren, wie diese Assets mithilfe von Processing für Android gerendert und bearbeitet werden.
Es ist erwähnenswert, dass viele der auf Poly verfügbaren Assets mit Google Blocks erstellt wurden, einer Anwendung, die für Benutzer von HTC Vive und Oculus Rift verfügbar ist. Wenn Sie diese VR-Headsets besitzen, sollten Sie auch eigene Modelle erstellen und einreichen.
Weitere Informationen zur Poly-API finden Sie in der offiziellen Dokumentation.