Poly API: Pobieranie zasobów 3D dla aplikacji VR i AR na Androida

Autor: Peter Berry
Data Utworzenia: 14 Lang L: none (month-012) 2021
Data Aktualizacji: 4 Móc 2024
Anonim
Poly API: Pobieranie zasobów 3D dla aplikacji VR i AR na Androida - Aplikacje
Poly API: Pobieranie zasobów 3D dla aplikacji VR i AR na Androida - Aplikacje

Zawartość


Czy masz świetny pomysł na aplikację mobilną Virtual Reality (VR) lub Augmented Reality (AR), ale nie wiesz, jak ożywić swoją wizję?

O ile nie jesteś programistą Androida, który również jest doświadczonym artystą 3D, tworzenie wszystkich zasobów wymaganych do zapewnienia wciągających wrażeń 360 stopni może być zniechęcającym procesem.

Tylko dlatego, że nie masz czasu, zasobów ani doświadczenia niezbędnego do tworzenia modeli 3D, nie oznacza, że ​​nie możesz zbudować wspaniałej aplikacji mobilnej VR lub AR! W sieci World Wide Web dostępnych jest wiele zasobów 3D, a także wszystkie interfejsy API, struktury i biblioteki potrzebne do pobrania i renderowania tych zasobów w aplikacjach na Androida.

Czytaj dalej: Możesz teraz odwiedzić dowolną stronę internetową za pomocą Daydream VR. Nawet ten.

W tym artykule przyjrzymy się Poly, repozytorium online i interfejsowi API, który daje tysiące zasobów 3D na wyciągnięcie ręki. Pod koniec tego artykułu utworzysz aplikację, która pobiera zasób 3D Poly w czasie wykonywania, a następnie renderuje go przy użyciu popularnej biblioteki Processing for Android.


Wyświetlanie zasobów 3D za pomocą Poly

Jeśli kiedykolwiek brałeś udział w tworzeniu Unity, to repozytorium Poly jest podobne do Unity Asset Store - z tym wyjątkiem, że wszystko w Poly jest darmowe!

Wiele modeli 3D Poly jest opublikowanych na licencji Creative Commons, więc możesz swobodnie używać, modyfikować i remiksować te zasoby, o ile tylko przyznasz twórcy odpowiedni kredyt.

Wszystkie modele 3D Poly są zaprojektowane tak, aby były kompatybilne z platformami VR i AR Google, takimi jak Daydream i ARCore, ale możesz ich używać gdziekolwiek i jak chcesz - potencjalnie możesz nawet użyć ich z ARKit firmy Apple!

Jeśli chodzi o pobieranie i wyświetlanie zasobów Poly, masz dwie opcje. Po pierwsze, możesz pobrać zasoby na swój komputer, a następnie zaimportować je do Android Studio, aby były dostarczane wraz z twoją aplikacją i zwiększały jej rozmiar APK, lub możesz odzyskać te zasoby w czasie wykonywania za pomocą Poly API.


Wieloplatformowy, oparty na REST interfejs API Poly zapewnia programowy, tylko do odczytu dostęp do ogromnej kolekcji modeli 3D Poly. Jest to bardziej skomplikowane niż łączenie zasobów z pakietem APK, ale istnieje kilka korzyści z pobierania zasobów Poly w czasie wykonywania, w szczególności pomaga utrzymać kontrolę nad rozmiarem pliku APK, co może mieć wpływ na liczbę osób pobierających aplikację.

Możesz również użyć interfejsu API Poly, aby dać użytkownikom większy wybór, na przykład jeśli tworzysz grę mobilną, możesz pozwolić użytkownikom wybierać spośród wielu modeli postaci.

Ponieważ możesz dowolnie modyfikować modele Poly, możesz nawet pozwolić swoim użytkownikom dostosować ich wybraną postać, na przykład zmieniając kolor włosów lub oczu lub łącząc je z innymi zasobami Poly, takimi jak inna broń i zbroja. W ten sposób Poly API może pomóc dostarczyć imponującą gamę zasobów 3D, z dużą ilością możliwości personalizacji doświadczenia - a wszystko to przy stosunkowo niewielkiej pracy. Twoi użytkownicy przekonają się, że poświęciłeś mnóstwo czasu na drobiazgowe tworzenie wszystkich tych modeli 3D!

Tworzenie projektu modelowania 3D

Stworzymy aplikację, która pobiera określony zasób Poly podczas pierwszego uruchomienia aplikacji, a następnie wyświetla ten zasób w trybie pełnoekranowym na żądanie użytkownika.

Aby pomóc nam odzyskać ten zasób, będę używać paliwa, które jest biblioteką sieciową HTTP dla Kotlin i Androida. Zacznij od utworzenia nowego projektu z wybranymi ustawieniami, ale po wyświetleniu monitu wybierz opcję „Dołącz obsługę Kotlin”.

Wszystkie połączenia do interfejsu API Poly muszą zawierać klucz API, który służy do identyfikowania aplikacji i egzekwowania ograniczeń użytkowania. Podczas programowania i testowania często używasz nieograniczonego klucza API, ale jeśli masz plany wydania tej aplikacji, musisz użyć klucza API zastrzeżonego dla Androida.

Aby utworzyć klucz zastrzeżony, musisz znać certyfikat podpisywania SHA-1 swojego projektu, więc uzyskajmy teraz te informacje:

  • Wybierz kartę „Gradle” w Android Studio (gdzie kursor znajduje się na poniższym zrzucie ekranu). Spowoduje to otwarcie panelu „Projekty stopniowe”.

  • W panelu „Gradle projects” kliknij dwukrotnie, aby rozwinąć „root” swojego projektu, a następnie wybierz „Tasks> Android> Signing Report”. Spowoduje to otwarcie nowego panelu u dołu okna Android Studio.
  • Wybierz przycisk „Przełącz wykonywanie zadań / tryb tekstowy” (gdzie kursor jest ustawiony na poniższym zrzucie ekranu).

Panel „Uruchom” zostanie teraz zaktualizowany, aby wyświetlić wiele informacji o projekcie, w tym jego odcisk palca SHA-1.

Utwórz konto Google Cloud Platform

Aby uzyskać niezbędny klucz API, potrzebujesz konta Google Cloud Platform (GPC).

Jeśli nie masz konta, możesz zarejestrować się na 12-miesięczny bezpłatny okres próbny, przechodząc na bezpłatną stronę Try Cloud Platform i postępując zgodnie z instrukcjami. Pamiętaj, że wymagana jest karta kredytowa lub debetowa, ale zgodnie ze stroną Często zadawanych pytań służy ona jedynie do weryfikacji Twojej tożsamości i „nie zostaniesz obciążony ani obciążony podczas bezpłatnego okresu próbnego”.

Zdobądź klucz Poly API

Po zakończeniu rejestracji możesz włączyć interfejs API Poly i utworzyć swój klucz:

  • Udaj się do konsoli GCP.
  • Wybierz ikonę z podszewką w lewym górnym rogu i wybierz „Interfejsy API i usługi> Pulpit nawigacyjny”.
  • Wybierz „Włącz interfejsy API i usługi”.
  • W menu po lewej stronie wybierz „Inne”.
  • Wybierz kartę „Poly API”.
  • Kliknij przycisk „Włącz”.
  • Po kilku chwilach nastąpi przejście do nowego ekranu; otwórz menu boczne i wybierz „Interfejsy API i usługi> Poświadczenia”.

  • W kolejnym wyskakującym okienku wybierz „Ogranicz klucz”.
  • Nadaj kluczowi charakterystyczną nazwę.
  • W sekcji „Ograniczenia aplikacji” wybierz „Aplikacje na Androida”.
  • Wybierz „Dodaj nazwę pakietu i odcisk palca”.
  • Skopiuj / wklej odcisk palca projektu SHA-1 do pola „Odcisk palca certyfikatu podpisującego”.
  • Wprowadź nazwę pakietu swojego projektu (pojawia się w Manifeście i na górze każdego pliku klasy).
  • Kliknij „Zapisz”.

Nastąpi przejście do ekranu „Referencje” projektu, który zawiera listę wszystkich kluczy API - w tym właśnie utworzonego klucza API z obsługą wielu funkcji.

Zależności projektu: Paliwo, rozszerzenia P3D i rozszerzenia Kotlin

Aby odzyskać i wyświetlić zasoby Poly, potrzebujemy pomocy z kilku dodatkowych bibliotek:

  • Paliwo. Poly nie ma obecnie oficjalnego zestawu narzędzi dla Androida, więc musisz pracować z interfejsem API bezpośrednio za pomocą interfejsu REST. Aby uprościć ten proces, będę korzystać z biblioteki sieciowej Fuel HTTP.
  • Przetwarzanie dla Androida. Będę używał renderera P3D z tej biblioteki, aby wyświetlić zasób Poly.

Otwórz plik build.gradle projektu i dodaj te dwie biblioteki jako zależności projektu:

zależności {implementacja fileTree (obejmują:, reż: libs) implementacja "org.jetbrains.kotlin: implementacja kotlin-stdlib-jre7: $ kotlin_version" com.android.support:appcompat-v7:27.1.1 // Dodaj bibliotekę paliwa / / Implementacja com.github.kittinunf.fuel: fuel-android: 1.13.0 // Dodaj silnik Processing for Android // implementacja org.p5android: processing-core: 4.0.1}

Aby nasz kod był bardziej zwięzły, będę również używać rozszerzeń Kotlin dla Androida, więc dodajmy tę wtyczkę, gdy mamy plik build.gradle:

zastosuj wtyczkę: rozszerzenia kotlin-android

Wreszcie, ponieważ pobieramy zasób z Internetu, nasza aplikacja potrzebuje pozwolenia na dostęp do Internetu. Otwórz swój manifest i dodaj:

Dodanie klucza API

Za każdym razem, gdy nasza aplikacja żąda zasobu od Poly, musi zawierać prawidłowy klucz API. Używam tekstu zastępczego, ale ty musi zastąp ten symbol zastępczy własnym kluczem API, jeśli aplikacja będzie kiedykolwiek działać.

Dodam również zaznaczenie, aby aplikacja wyświetliła ostrzeżenie, jeśli zapomnisz zastąpić tekst „WSTAW-TWÓJ-KLUCZ API”:

import android.os.Bundle import android.support.v7.app.AppCompatActivity Klasa MainActivity: AppCompatActivity () {obiekt towarzyszący {const val APIKey = "INSERT-YOUR-API-KEY"} zastępuje zabawę onCreate (zapisaneInstanceState: Pakiet?) { super.onCreate (saveInstanceState) setContentView (R.layout.activity_main) // Jeśli klucz API zaczyna się od „INSERT” ... // if (APIKey.startsWith („INSERT”)) {// to wyświetl następujący toast… .// Toast.makeText (to, „Nie zaktualizowałeś klucza API”, Toast.LENGTH_SHORT) .show ()} else {... ... ...

Odzyskiwanie zasobu

Możesz wybrać dowolny zasób w witrynie Google Poly, ale użyję tego modelu planety Ziemia.

Zasób pobierany jest za pomocą jego identyfikatora, który pojawia się na końcu informacji o adresie URL (wyróżniony na poprzednim zrzucie ekranu). Łączymy ten identyfikator zasobu z hostem Poly API, którym jest „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.http Pobierz import kotlinx.android.synthetic.main.activity_main. * import java.io.File klasa MainActivity: AppCompatActivity () {obiekt towarzyszący {const val APIKey = "INSERT-YOUR-API -KEY "val assetURL =" https://poly.googleapis.com/v1/assets/94XG1XUy10q "} zastępuje zabawę onCreate (saveInstanceState: Bundle?) {Super.onCreate (saveInstanceState) setContentView (R.layout.activity_main) jeśli ( APIKey.startsWith („INSERT”)) {Toast.makeText (to, „Nie zaktualizowałeś klucza API”, Toast.LENGTH_SHORT) .show ()} else {

Następnie musimy wysłać żądanie GET do adresu URL zasobu za pomocą metody httpGet (). Podaję również, że typ odpowiedzi musi być 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.http Pobierz import kotlinx.android.synthetic.main.activity_main. * import java.io.File klasa MainActivity: AppCompatActivity () {obiekt towarzyszący {const val APIKey = "INSERT-YOUR-API -KEY "val assetURL =" https://poly.googleapis.com/v1/assets/94XG1XUy10q "} zastępuje zabawę onCreate (saveInstanceState: Bundle?) {Super.onCreate (saveInstanceState) setContentView (R.layout.activity_main) jeśli ( APIKey.startsWith („INSERT”)) {Toast.makeText (to, „Nie zaktualizowałeś klucza API”, Toast.LENGTH_SHORT) .show ()} else {// Wykonaj połączenie z serwerem, a następnie przekaż dane, używając Metoda „listOf” // assetURL.httpGet (listOf („klucz” do APIKey)). ResponseJson {żądanie, odpowiedź, wynik -> // Zrób coś z odpowiedzią // result.fold ({val as set = it.obj ()

Zasób może mieć kilka formatów, takich jak OBJ, GLTF i FBX. Musimy ustalić, czy zasób ma format OBJ.

W tym kroku odzyskuję także nazwę i adres URL wszystkich plików, które musimy pobrać,
w tym główny plik zasobu („root”) oraz wszelkie powiązane pliki materiałów i tekstur („zasoby”).

Jeśli nasza aplikacja nie może poprawnie pobrać zasobu, wyświetli toast informujący użytkownika.

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.http Pobierz import kotlinx.android.synthetic.main.activity_main. * import java.io.File klasa MainActivity: AppCompatActivity () {obiekt towarzyszący {const val APIKey = "INSERT-YOUR-API -KEY "val assetURL =" https://poly.googleapis.com/v1/assets/94XG1XUy10q "} zastępuje zabawę onCreate (saveInstanceState: Bundle?) {Super.onCreate (saveInstanceState) setContentView (R.layout.activity_main) jeśli ( APIKey.startsWith („INSERT”)) {Toast.makeText (to, „Nie zaktualizowałeś klucza API”, Toast.LENGTH_SHORT) .show ()} else {// Wyślij żądanie GET do adresu URL zasobu // assetURL. httpGet (listOf („klucz” do APIKey)). responseJson {żądanie, odpowiedź, wynik -> // Zrób coś z odpowiedzią // result.fold ({val asset = it.obj () var objectURL: String? = null var materialLibraryName: String? = null var materialLibraryURL: String? = null // Sprawdź format zasobu, używając tablicy „formaty” // val assetFormats = asset.getJSONArray („formaty”) // Zapętl wszystkie formaty // dla (i w 0 aż do assetFormats.length ()) { val currentFormat = assetFormats.getJSONObject (i) // Użyj formatType, aby zidentyfikować typ formatu tego zasobu. Jeśli format to OBJ… .// if (currentFormat.getString („formatType”) == „OBJ”) {//... następnie pobierz plik „root” tego zasobu, tj. Plik OBJ // objectURL = currentFormat. getJSONObject („root”) .getString („url”) // Pobierz wszystkie zależności pliku głównego // materialLibraryName = currentFormat.getJSONArray („resources”) .getJSONObject (0) .getString („ścieżka względna”) materialLibraryURL = currentFormat.getJSArArray („resources”) .getJSONObject (0) .getString („url”) break}} objectURL !!. httpDownload (). destination {_, _ -> File (filesDir, „globeAsset.obj”)} .response {_ , _, wynik -> wynik.fold ({}, {// Jeśli nie możesz zlokalizować lub pobrać pliku OBJ, wyświetl błąd // Toast.makeText (to, „Nie można pobrać zasobu”, Toast.LENGTH_SHORT ) .show ()})} materialLibraryURL !!. httpDownload (). destination {_, _ -> Plik (filesDir, materialLibraryName)} .response {_, _, wynik -> wynik.fold ({}, {Toast. makeText (to, „Nie można pobrać zasobu”, Toast.LENGTH_SHORT) .show ()})}}, { Toast.makeText (to, „Nie można pobrać zasobu”, Toast.LENGTH_SHORT) .show ()})}}}

W tym momencie, jeśli zainstalujesz projekt na swoim smartfonie lub tablecie z Androidem lub Android Virtual Device (AVD), zasób zostanie pobrany pomyślnie, ale aplikacja go nie wyświetli. Naprawmy to teraz!

Tworzenie drugiego ekranu: Dodawanie nawigacji

Będziemy wyświetlać zasób w trybie pełnoekranowym, dlatego zaktualizuj nasz plik main_activity.xml, aby zawierał przycisk, który po dotknięciu uruchomi Aktywność na pełnym ekranie.

Dodajmy teraz onClickListener na końcu pliku 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.http Pobierz import kotlinx.android.synthetic.main.activity_main. * import java.io.File klasa MainActivity: AppCompatActivity () {obiekt towarzyszący {const val APIKey = "INSERT-YOUR-API -KEY "val assetURL =" https://poly.googleapis.com/v1/assets/94XG1XUy10q "} zastępuje zabawę onCreate (saveInstanceState: Bundle?) {Super.onCreate (saveInstanceState) setContentView (R.layout.activity_main) jeśli ( APIKey.startsWith („INSERT”)) {Toast.makeText (to, „Nie zaktualizowałeś swojego klucza API”, Toast.LENGTH_SHORT) .show ()} else {assetURL.httpGet (listOf („klucz” do APIKey)). responseJson {żądanie, odpowiedź, wynik -> wynik.fold ({val asset = it.obj () var objectURL: String? = null var materialLibraryName: String? = null var materialLibraryURL: Str ing? = null val assetFormats = asset.getJSONArray („formaty”) dla (i w 0 do assetFormats.length ()) {val currentFormat = assetFormats.getJSONObject (i) if (currentFormat.getString („formatType”) == „OBJ” ) {objectURL = currentFormat.getJSONObject („root”) .getString („url”) materialLibraryName = currentFormat.getJSONArray („resources”) .getJSONObject (0) .getString („relativePath”) materialLibraryURL = currentFormat.get „JSONArray” ) .getJSONObject (0) .getString ("url") break}} objectURL !!. httpDownload (). destination {_, _ -> File (filesDir, "globeAsset.obj")} .response {_, _, wynik -> wynik.fold ({}, {Toast.makeText (to, „Nie można pobrać zasobu”, Toast.LENGTH_SHORT) .show ()})} materialLibraryURL !!. httpDownload (). destination {_, _ -> Plik (filesDir, materialLibraryName)} .response {_, _, result -> result.fold ({}, {Toast.makeText (to, „Nie można pobrać zasobu”, Toast.LENGTH_SHORT) .show ()})}}, {Toast.makeText (to, „Nie można pobrać zasobu”, Toast.LENGTH_SHORT) .sh ow ()})} // Zaimplementuj przycisk // displayButton.setOnClickListener {val intent = Intent (this, SecondActivity :: class.java) startActivity (intent); }}}

Budowanie kanwy 3D

Teraz utwórzmy Aktywność, w której będziemy wyświetlać nasz zasób w trybie pełnoekranowym:

  • Kliknij z wciśniętym klawiszem Control plik MainActivity.kt i wybierz „Nowy> Plik / klasa Kotlin”.
  • Otwórz menu „Rodzaj” i wybierz „Klasa”.
  • Nadaj tej klasie nazwę „SecondActivity”, a następnie kliknij „OK”.

Aby narysować obiekt 3D, potrzebujemy płótna 3D! Użyję renderera P3D biblioteki Processing for Android, co oznacza rozszerzenie klasy PApplet, przesłonięcie metody settings (), a następnie przekazanie P3D jako argumentu do metody fullScreen (). Musimy również utworzyć właściwość reprezentującą zasób Poly jako obiekt PShape.

prywatna zabawa displayAsset () {val canvas3D = object: PApplet () {var polyAsset: PShape? = zerowanie zastępuje zabawne ustawienia () {fullScreen (PConstants.P3D)}

Następnie musimy zainicjować obiekt PShape, zastępując metodę setup (), wywołując metodę loadShape (), a następnie przekazując bezwzględną ścieżkę do pliku .obj:

przesłoń fun setup () {polyAsset = loadShape (File (filesDir, „globeAsset.obj”). absolutna ścieżka)}

Rysowanie na płótnie P3D

Aby narysować na tym kanwie 3D, musimy przesłonić metodę draw ():

przesłoń fun draw () {background (0) shape (polyAsset)}}

Domyślnie wiele zasobów pobranych z Poly API znajduje się po mniejszej stronie, więc jeśli uruchomisz ten kod teraz, możesz nawet nie zobaczyć zasobu, w zależności od konfiguracji ekranu. Podczas tworzenia scen 3D zazwyczaj tworzysz niestandardową kamerę, aby użytkownik mógł eksplorować scenę i wyświetlać zasoby 3D z pełnych 360 stopni. Jest to jednak poza zakresem tego artykułu, więc będę ręcznie zmieniać rozmiar i pozycję zasobu, aby upewnić się, że wygodnie mieści się na ekranie.

Możesz zwiększyć rozmiar zasobu, przekazując wartość ujemną do metody scale ():

skala (-10f)

Możesz dopasować pozycję zasobu w wirtualnej przestrzeni 3D za pomocą metody translate () i następujących współrzędnych:

  • X. Ustawia zasób wzdłuż osi poziomej.
  • Y. Ustawia zasób wzdłuż osi pionowej.
  • Z. Jest to oś „głębokość / wysokość”, która przekształca obiekt 2D w obiekt 3D. Wartości dodatnie powodują wrażenie, że obiekt zbliża się do Ciebie, a wartości ujemne powodują wrażenie, że obiekt się od Ciebie odsuwa.

Zauważ, że transformacje kumulują się, więc wszystko, co dzieje się po akumulacji efektu przez funkcję.

Używam następujących:

tłumaczyć (-50f, -100f, 10f)

Oto wypełniony kod:

przesłoń fun draw () {background (0) scale (-10f) translate (-50f, -100f) // Narysuj zasób, wywołując metodę shape () // shape (polyAsset)}}

Następnie musimy utworzyć odpowiedni plik układu, w którym dodamy płótno 3D jako widżet FrameLayout:

  • Kliknij z wciśniętym klawiszem Control folder „res> layout” swojego projektu.
  • Wybierz „Plik zasobów układu”.
  • Nadaj temu plikowi nazwę „activity_second”, a następnie kliknij „OK”.

Teraz mamy nasz „Frame_ay” FrameLayout, musimy poinformować o tym naszą SecondActivity! Wróć do pliku SecondActivity.kt, utwórz nową instancję PFragment i skieruj ją w stronę naszego widżetu „asset_view”:

import android.os.Bundle import android.support.v7.app.AppCompatActivity import kotlinx.android.synthetic.main.activity_second. * import processing.android.PFragment import processing.core.PApplet import processing.core.PConstants import processing.core .PShape import java.io.File klasa SecondActivity: AppCompatActivity () {przesłonić zabawę onCreate (saveInstanceState: Bundle?) {Super.onCreate (saveInstanceState) setContentView (R.layout.activity_second) displayAsset ()} prywatna zabawa displayAsset () {val canvas3D = object: PApplet () {var polyAsset: PShape? = null zastępuje zabawne ustawienia () {fullScreen (PConstants.P3D)} zastępuje zabawne setup () {polyAsset = loadShape (Plik (filesDir, „globeAsset.obj”). absolutna ścieżka)) zastępuje zabawną skalę draw () {background (0) (-10f) przetłumacz (-50f, -100f) kształt (polyAsset)}} // Dodaj następujący // val assetView = PFragment (canvas3D) assetView.setView (widok_zakresu, to)}}

Ostatnim krokiem jest dodanie SecondActivity do manifestu:

// Dodaj następujący //

Testowanie twojego projektu

Jesteśmy teraz gotowi do przetestowania ukończonego projektu! Zainstaluj go na urządzeniu z Androidem lub AVD i upewnij się, że masz aktywne połączenie z Internetem. Gdy tylko aplikacja się uruchomi, pobierze zasób, a następnie możesz go wyświetlić, naciskając przycisk „Wyświetl zasób”.

Możesz pobrać ten kompletny projekt z GitHub.

Podsumowując

W tym artykule przyjrzeliśmy się, jak korzystać z interfejsu API Poly w celu pobrania zasobu 3D w czasie wykonywania oraz jak wyświetlić ten zasób przy użyciu biblioteki Processing for Android. Czy uważasz, że Poly API ma potencjał, aby udostępnić rozwój VR i AR większej liczbie osób? Daj nam znać w komentarzach poniżej!

Związane z

  • Google wprowadzi aplikacje AR na „setki milionów” urządzeń z Androidem w 2018 roku
  • Google nauczy Cię o sztucznej inteligencji i uczeniu maszynowym za darmo
  • 15 najlepszych gier VR na Google Cardboard
  • 10 najlepszych aplikacji VR na Google Cardboard
  • Co to jest Google Fuchsia? Czy to nowy Android?
  • Co to jest Google Duplex? - funkcje, data premiery i inne
  • Jak stworzyć aplikację VR na Androida w zaledwie 7 minut
  • Mobilne zestawy słuchawkowe VR - jakie są twoje najlepsze opcje?

Razer Phone 2 był jedną z najlepzych ofert martfonów podcza Amazon Prime Day, gdzie zotał przedany z ogromną 50-procentową zniżką. Nie rozpaczaj, jeśli przegapiłeś, ponieważ telefon do gier jet t...

Aktualizacja Razer Phone 2 Android Pie już dawno ię pojawiła. Plotki zaczęły ię około litopada 2018 r., A my w końcu mamy odpowiedź. Razer przełał nam wczeną werję beta oprogramowania, aby pochwalić i...

Interesujący Dzisiaj.