Det finns en stor efterfrågan de här dagarna för Android-appar som erbjuder nedsänkt virtuell verklighet eller förstärkta verklighetsupplevelser. Som utvecklare finns det många olika ramar som du kan använda för att skapa sådana appar.
Men, om du inte är en skicklig 3D-artist, hur ska du skapa 3D-objekten som du skulle visa i dessa appar? Är du redo att spendera månader att lära dig hur man arbetar med 3D-modelleringsprogram som Blender eller Maya? Om du inte är det bör du överväga att använda Google Poly, ett onlineförråd som innehåller tusentals 3D-tillgångar som följer med Creative Commons licenser.
De flesta av de tillgångar som du hittar på Poly idag är låga poly med enkla material. Detta beror på att den genomsnittliga mobila GPUen ännu inte blir tillräckligt kraftfull för att visa 3D-objekt med hög polygontal i realtid.
I denna handledning introducerar jag dig till Poly API. Jag visar dig också hur du använder Processing for Android för att göra 3D-tillgångarna du laddar ner.
För att få ut det mesta av denna handledning behöver du:
Alla HTTP-förfrågningar som du gör till Poly API måste åtföljas av en API-nyckel som tillhör dig. För att förvärva nyckeln börjar du med att logga in i Google Cloud-konsolen och navigera till instrumentpanelen i API: n.
Tryck sedan på Aktivera API och tjänster knappen, expandera Andra kategori och välj Poly API.
Du kan nu trycka på Gör det möjligt knappen för att aktivera Poly API.
När API: n är aktiverad genereras en uppsättning API-nycklar för den automatiskt. Du kan öppna Referenser fliken för att titta på dem.
För den här handledningen behöver du bara Android-nyckel. Notera det så att du kan använda det senare.
Eftersom Poly för närvarande inte har en officiell verktygslåda för Android-plattformen, måste du arbeta med Poly API direkt med dess REST-gränssnitt. Genom att använda Fuel Networking Library, som är optimerat för Kotlins språket, kan du spara mycket tid och ansträngning. Så lägg till följande genomförande
beroendet i app
modulens build.gradle fil:
implementering "com.github.kittinunf.fuel: fuel-android: 1.13.0 '
För att kunna visa 3D-tillgångarna som du hämtar från Poly-arkivet behöver du också en återgivningsmotor. Bearbetning för Android levereras med en, så lägg till det som ett annat beroende.
implementation 'org.p5android: bearbetningskärna: 4.0.1'
Slutligen glöm inte att begära INTERNET
tillstånd i manifestfilen för ditt projekt.
För att kunna ladda ner en Poly-tillgång måste du känna till sitt unika ID. Genom att använda en webbläsare, en som stöder WebGL, kan du enkelt bestämma ID för någon tillgång. Det är rätt i adressfältet.
Men om du vill tillåta dina användare att dynamiskt, vid körning, bestämma vilka tillgångar de vill använda, kan du använda assets.list
REST-metod för att bestämma ID-erna för dessa tillgångar. Metoden låter dig leta efter tillgångar med olika parametrar, till exempel sökord, kategorier och 3D-filformat.
För ett realistiskt exempel, låt oss nu försöka hitta ID: erna för några tillgångar som tillhör djur
kategori. Du är självklart fritt att välja någon annan giltig kategori, till exempel arkitektur
, mat
, eller människor
.
Innan du komponerar din HTTP-begäran är det en bra idé att deklarera din API-nyckel och basadressen till Poly API som konstanter i din aktivitet.
kompanionsobjekt const valnyckel = "Abcdefghabcdefgh1234567810" const val baseURL = "https://poly.googleapis.com/v1"
Med hjälp av basadressen kan du bygga URL: en till assets.list
REST-metod som visas nedan:
val listURL = "$ baseURL / assets"
Vid denna tidpunkt kan du skapa en giltig HTTP GET-begäran genom att ringa httpGet ()
metod och skickar din API-nyckel och önskad kategori som sökparametrar till den. Eventuellt kan du använda formatera
frågeparameter för att ange önskat format för tillgångarna. Poly stöder OBJ, FBX, TILT och flera andra populära 3D-format.
Eftersom metoden går asynkront och resultatet är ett JSON-dokument måste du bifoga en händelsehanterare till det med hjälp av responseJSON ()
metod. Följande kod visar hur:
listURL.httpGet (listOf ("kategori" till "djur", "nyckel" till nyckel, "format" till "OBJ")) svarJson _, _, resultat -> // Mer kod här
Inom händelsehanteraren, om din förfrågan lyckades har du tillgång till en lista över Tillgång
objekt. De namn
fältet för varje sådant objekt anger sitt ID.
Dessutom kommer varje objekt att ha fält som display
, licens
, och författarens namn
, som du kanske tycker är användbar. För nu, låt oss helt enkelt skriva ut namn
och display
av alla föremål. Följande kod visar hur:
result.fold (// Få tillgångar array val assets = it.obj (). getJSONArray ("tillgångar") // Loop through array för (i i 0 tills assets.length ()) // Få id och displayName val id = assets.getJSONObject (i) .getString ("namn") val displayName = assets.getJSONObject (i) .getString ("displayName") // Skriv ut ID och displayName Log.d ("POLY", "(ID: $ id) - (NAME: $ displayName) "), // Vid ett fel Log.e (" POLY "," Ett fel inträffade "))
Om du kör din app nu borde du kunna se följande utmatning i logcat fönstret i Android Studio.
När du har det unika ID-en för en tillgång kan du direkt lägga till den till basadressen för Poly API för att skapa en tillgångsadress.
// någon tillgång id val assetID = "assets / 3yiIERrKNQr" // dess url val assetURL = "$ baseURL / $ assetID"
När du gör en HTTP GET-förfrågan till tillgångsadressen med hjälp av httpGet ()
metod igen får du ett JSON-dokument som innehåller bara en Tillgång
objekt.
assetURL.httpGet (listOf ("key" till nyckel)) .responseJson _, _, result -> result.fold (val asset = it.obj () // Mer kod här, Log.e ("POLY ", "Ett fel uppstod") )
Som du kanske har märkt i ovanstående kod måste också denna förfrågan ha en frågeparameter som anger din API-nyckel.
Du har redan lärt dig hur du använder några av de fält som finns i Tillgång
objekt i föregående steg. Allt du behöver göra är att använda format
array närvarande i objektet för att bestämma webbadresserna och namnen på filerna som är associerade med tillgången. Varje objekt i matrisen har tre viktiga fält:
formatType
, som låter dig bestämma typen av tillgångenrot
, som innehåller namn och URL för den primära filen som är associerad med tillgångenMedel
, som innehåller detaljer om alla sekundära filer som är associerade med tillgången, såsom material och texturerOm du arbetar med OBJ-formatet kommer den primära filen att vara en .obj filen innehåller hörn och ansikten data, och de sekundära filerna brukar vara .mtl filer som innehåller data om material som används. Följande kod visar hur du bestämmer webbadresserna för både primära och sekundära filer:
var objFileURL: String? = null var mtlFileURL: String? = null var mtlFileName: String? = null valformat = asset.getJSONArray ("format") // Gå igenom alla format för (i i 0 till formats.length ()) val currentFormat = formats.getJSONObject (i) // Kontrollera om nuvarande format är OBJ om (currentFormat.getString ("formatType") == "OBJ") // Hämta .obj fil detaljer objFileURL = currentFormat.getJSONObject ("root") .getString ("url") // Hämta de första .mtl fil detaljerna mtlFileURL = currentFormat.getJSONArray ("resurser") .getJSONObject (0) .getString ("url") mtlFileName = currentFormat.getJSONArray ("resurser") .getJSONObject (0) .getString ("relativePath") brytning
I ovanstående kod, förutom URL: en till .mtl fil, bestämmer vi också dess namn med hjälp av relativePath
fält. Att göra det är viktigt eftersom namnet är hårdkodat i mtllib
del av .obj fil och bör inte ändras.
När du har webbadresserna till båda filerna kan du använda Httpdownload ()
Metoden för bränslebiblioteket att ladda ner dem. Så här kan du hämta dem till din apps privata lagringskatalog, vars absoluta sökväg kan bestämmas med hjälp av FilesDir
fast egendom:
// hämta och spara obj fil som asset.obj objFileURL !!. httpDownload (). destination _, _ -> Fil (filesDir, "asset.obj") .response _, _, resultat -> result.fold (, Log.e ("POLY", "Ett fel inträffade")) // ladda ner och lagra mtl-filen utan // ändra namnet mtlFileURL !!. HttpDownload (). Destination _, _ -> File (filesDir, mtlFileName) .response _, _, result -> result.fold (, Log.e ("POLY", "Ett fel inträffade"))
Du behöver en 3D-duk för att rita den Poly-tillgång du laddat ner. För att skapa en måste du förlänga PApplet
klass som erbjuds av databasen Processing for Android. En kanfas som skapas på detta sätt kommer dock som standard att stödja endast 2D-former. För att konfigurera det för att rita 3D-former, åsidosätta inställningar()
metod och passera P3D
som ett argument till fullskärm()
metod som också gör duken så stor som användarens skärm.
val canvas = objekt: PApplet () överride fun inställningar () fullScreen (PConstants.P3D) // Mer kod här
Skapa sedan en ny egendom i klassen för att representera Poly-tillgången som en PShape
objekt.
var myPolyAsset: PShape? = null
För att initiera egenskapen, åsidosätta inrätta()
metod och ringa till loadShape ()
metod som passerar den absoluta vägen för .obj filen du laddade ner som ett argument för det.
åsidosätta roliga inställningar () myPolyAsset = loadShape (File (filesDir, "asset.obj"). absolutePath)
Du kan nu börja dra på duken genom att överstyra dra()
metod. Inuti metoden är det första du behöver göra att ringa bakgrund()
metod för att säkerställa att du alltid ritar på en blank duk.
åsidosätta roligt tecken () bakgrund (0) // Mer kod här
När de dras direkt ser de flesta poly-tillgångarna sig väldigt små och inverterade. Du kan fixa det antingen genom att använda en anpassad kamera eller genom att använda kanfasomvandlingar. För att hålla denna handledning enkel och intuitiv, låt oss använda kanfasomvandlingar.
För att öka storleken på tillgången, använd skala()
metod och ge ett stort negativt värde till det. Värdet måste vara negativt för att säkerställa att tillgången vänds vertikalt. Eventuellt kan du använda Översätt()
Metod för att justera sin position längs X- och Y-axlarna. Följande kod visar hur:
skala (-50f) translate (-4f, -14f)
Nu kan du gå och dra tillgången genom att ringa form()
metod.
form (myPolyAsset)
Duken är för närvarande inte en del av din aktivitets synhierarki. Om du försöker köra din app nu kan du därför inte se tillgången. För att åtgärda detta, lägg till en ny FrameLayout
widget till aktivitets layout XML-fil.
Skapa sedan en ny PFragment
exempel med hjälp av duken och peka den på FrameLayout
widget.
val fragment = PFragment (kanfas) fragment.setView (canvas_holder, detta)
Vid denna tidpunkt kan du köra appen igen för att se tillgången.
Du vet nu hur du använder Poly API för att söka efter och ladda ner 3D-tillgångar. I den här handledningen lärde du dig också hur man gör och manipulerar de tillgångarna genom att använda Processing for Android.
Det är värt att notera att många av de tillgångar som finns på Poly skapades med hjälp av Google Blocks, en applikation som är tillgänglig för användare av HTC Vive och Oculus Rift. Om du äger dessa VR-headset, överväg att skapa och skicka in dina egna modeller.
För att lära dig mer om Poly API, kan du referera till den officiella dokumentationen.