Полі API: Отримання 3D-ресурсів для ваших програм VR та AR Android

Автор: Peter Berry
Дата Створення: 14 Lang L: none (month-012) 2021
Дата Оновлення: 4 Травень 2024
Anonim
Leap Motion SDK
Відеоролик: Leap Motion SDK

Зміст


У вас є чудова ідея мобільного додатка Virtual Reality (VR) або Augmented Reality (AR), але ви не знаєте, як реалізувати своє бачення?

Якщо ви не розробник Android, який також є досвідченим 3D-художником, то створення всіх активів, необхідних для занурення в 360 градусів, може бути непростим процесом.

Просто тому, що у вас немає часу, ресурсів чи досвіду, необхідних для створення 3D-моделей, не означає, що ви не можете створити чудовий мобільний додаток VR або AR! У Всесвітній павутині доступний величезний діапазон 3D-ресурсів, а також усі API, рамки та бібліотеки, які потрібно завантажити та винести ці ресурси у ваші програми Android.

Читайте далі: Тепер ви можете відвідати будь-який веб-сайт за допомогою Daydream VR. Навіть той.

У цій статті ми розглянемо Poly, онлайн-сховище та API, який розміщує тисячі тривимірних активів у вас під рукою. Наприкінці цієї статті ви створили додаток, який отримує активізацію 3D Poly під час виконання, а потім виводить його за допомогою популярної бібліотеки Processing for Android.


Відображення 3D-об’єктів за допомогою Poly

Якщо ви коли-небудь замислювалися над розробкою Unity, то сховище Poly схоже на магазин Unity Asset Store - за винятком того, що все в Poly безкоштовно!

Багато 3D-моделей Poly публікуються під ліцензією Creative Commons, тому ви можете користуватися, змінювати та реміксувати ці активи, якщо ви надасте творцю належний кредит.

Усі 3D-моделі Poly розроблені так, щоб вони були сумісні з VR та AR платформами Google, такими як Daydream та ARCore, але ви можете використовувати їх куди завгодно і як завгодно - можливо, ви навіть можете використовувати їх з ARKit Apple!

Щодо пошуку та відображення Poly-активів, у вас є два варіанти. По-перше, ви можете завантажити активи на свій комп’ютер, а потім імпортувати їх в Android Studio, щоб вони надсилалися разом із вашим додатком та сприяли його розміру APK, або ви можете отримати ці активи під час виконання за допомогою API API Poly.

Полісплатний API на основі REST забезпечує програмний доступ, доступний лише для читання, до величезної колекції 3D-моделей Poly. Це складніше, ніж об’єднання активів з вашим APK, але є кілька переваг для отримання полі-активів під час виконання, зокрема, що це допомагає тримати під контролем розмір APK, що може вплинути на те, скільки людей завантажить вашу заявку.


Ви також можете використовувати API API, щоб дати своїм користувачам більше вибору, наприклад, якщо ви розробляєте мобільну гру, тоді ви можете дозволити своїм користувачам вибирати з різних моделей символів.

Оскільки ви можете змінювати моделі Poly, ви можете навіть дозволити вашим користувачам підлаштовувати обраний персонаж, наприклад, змінюючи колір волосся чи очей або комбінуючи його з іншими полі-активами, такими як різні зброї та обладунки. Таким чином, Poly API може допомогти вам поставити вражаючий діапазон об'єктів 3D, маючи багато можливостей для персоналізації досвіду - і все для порівняно невеликої роботи. Ваші користувачі переконаються, що ви витратили тонну часу, ретельно розробивши всі ці тривимірні моделі!

Створення проекту 3D-моделювання

Ми створимо програму, яка отримує певний актив Poly під час першого запуску програми, а потім відображатиме цей ресурс у повноекранному режимі на вимогу користувача.

Щоб допомогти нам отримати цей ресурс, я буду використовувати пальне, яке є мережевою бібліотекою HTTP для Kotlin та Android. Почніть зі створення нового проекту з налаштуваннями на ваш вибір, але коли з’явиться запит, виберіть "Включити підтримку Kotlin".

Усі дзвінки, здійснені до API API, повинні містити ключ API, який використовується для ідентифікації вашого додатка та забезпечення обмежень на використання. Під час розробки та тестування ви часто будете використовувати необмежений ключ API, але якщо у вас є плани випустити цю програму, ви повинні використовувати ключ API для Android.

Щоб створити ключ з обмеженням, вам потрібно знати сертифікат підписання SHA-1 вашого проекту, тому давайте отримаємо цю інформацію зараз:

  • Виберіть вкладку «Gradle» Android Studio (де курсор розташований на наступному знімку екрана). Це відкриває панель "Проекти Gradle".

  • На панелі "Проекти Gradle" двічі клацніть, щоб розгорнути корінь вашого проекту, а потім виберіть "Завдання> Android> Звіт про підписання". Це відкриє нову панель у нижній частині вікна Android Studio.
  • Виберіть кнопку "Увімкнути виконання завдань / текстовий режим" (де курсор розташований на наступному знімку екрана).

Тепер панель "Виконати" оновиться, щоб відобразити багато інформації про ваш проект, включаючи його відбиток SHA-1.

Створіть обліковий запис Google Cloud Platform

Щоб придбати необхідний ключ API, вам знадобиться обліковий запис Google Cloud Platform (GPC).

Якщо у вас немає облікового запису, ви можете зареєструватися на 12-місячну безкоштовну пробну версію, перейшовши на безкоштовну сторінку "Спробуйте хмарну платформу" та дотримуючись інструкцій. Зауважте, що потрібна кредитна картка або дебетова картка, але згідно зі сторінками, що часто задаються, вона використовується лише для підтвердження вашої особи, і "з вас не буде стягнуто плата або рахунок за час безкоштовної пробної версії".

Отримайте ключ API API

Після того, як ви всі зареєстровані, ви можете ввімкнути API API і створити свій ключ:

  • Перейдіть до консолі GCP.
  • Виберіть піктограму підкладки у верхньому лівому куті та виберіть “APIs & Services> Dashboard”.
  • Виберіть "Увімкнути API та послуги".
  • У меню зліва виберіть "Інше".
  • Виберіть картку "Poly API".
  • Натисніть кнопку «Увімкнути».
  • Через кілька моментів ви перейдете на новий екран; відкрийте бічне меню та виберіть "API та послуги> Акредитиви".

  • У наступному спливаючому вікні виберіть "Клавіша обмеження".
  • Дайте своєму ключу відмітне ім’я.
  • У розділі "Обмеження програм" виберіть "Програми для Android".
  • Виберіть "Додати ім'я пакета та відбиток пальця".
  • Скопіюйте / вставте відбиток пальця SHA-1 вашого проекту в поле «Відбиток сертифіката підпису».
  • Введіть назву пакета вашого проекту (воно з’являється у вашому Маніфесті та вгорі кожного файлу класу).
  • Натисніть «Зберегти».

Відтепер ви перейдете на екран "Повноваження" вашого проекту, який містить перелік усіх ваших ключів API - включаючи ключ, щойно створений API, що підтримується Poly.

Залежності проекту: розширення палива, P3D та Kotlin

Щоб отримати та відобразити Poly-активи, нам знадобиться допомога з кількох додаткових бібліотек:

  • Паливо. Наразі Poly не має офіційного набору інструментів Android, тому вам доведеться працювати з API безпосередньо за допомогою інтерфейсу REST. Щоб зробити цей процес простішим, я буду використовувати мережеву бібліотеку Fuel HTTP.
  • Обробка для Android. Я буду використовувати рендерінг P3D цієї бібліотеки для відображення активу Poly.

Відкрийте файл build.gradle вашого проекту та додайте ці дві бібліотеки як залежність проекту:

залежності ({file fileTree (включають:, реж .: libs) реалізація "org.jetbrains.kotlin: kotlin-stdlib-jre7: $ kotlin_version" виконання com.android.support:appcompat-v7:27.1.1 // Додати бібліотеку палива / / реалізація com.github.kittinunf.fuel: топливо-android: 1.13.0 // Додайте Processing for Android engine // впровадження org.p5android: Process-core: 4.0.1}

Щоб зробити наш код більш коротким, я також буду використовувати розширення Kotlin Android, тому додамо цей плагін, поки у нас відкритий файл build.gradle:

застосувати плагін: kotlin-android-розширення

Нарешті, оскільки ми отримуємо об’єкт з Інтернету, нашому додатку потрібен дозвіл Інтернету. Відкрийте свій Маніфест і додайте наступне:

Додавання ключа API

Кожен раз, коли наша програма вимагає ресурс від Poly, він повинен містити дійсний ключ API. Я використовую текст заповнення, але ви повинен замініть цей заповнювач на свій власний ключ API, якщо програма коли-небудь запрацює.

Я також додаю чек, щоб програма додала попередження, якщо ви забудете замінити текст "INSERT-YOUR-API-KEY":

import android.os.Bundle import android.support.v7.app.AppCompatActivity клас MainActivity: AppCompatActivity () {супутній об'єкт {const val APIKey = "INSERT-YOUR-API-KEY"} переосмислити забаву onCreate (збереженийInstanceState: Bundle?) { super.onCreate (saveInstanceState) setContentView (R.layout.activity_main) // Якщо ключ API починається з "INSERT" ... // if (APIKey.startsWith ("INSERT")) {//, відображається наступний тост… .// Toast.makeText (це "Ви не оновили свій ключ API", Toast.LENGTH_SHORT) .show ()} else {... ... ...

Отримання активу

Ви можете вибрати будь-який актив на сайті Google Poly, але я буду використовувати цю модель планети Земля.

Ви отримуєте об'єкт за допомогою його ідентифікатора, який відображається в кінці URL-коду (виділений на попередньому скріншоті). Ми поєднуємо цей ідентифікатор об’єкта з хостом Poly API, який є "https://poly.googleapis.com/v1".

імпорт android.content.Intent імпорт android.os.Bundle імпорт android.support.v7.app.AppCompatActivity імпорт android.widget.Toast import com.github.kittinunf.fuel.android.extension.responseJson import com.github.kittinunf.fuel .httpDownload імпорт com.github.kittinunf.fuel.httpGet імпорт kotlinx.android.synthetic.main.activity_main. * import java.io.File class MainActivity: AppCompatActivity () {супровідний об'єкт {const val APIKey = "ВСТУПИТИ-ВАШ-API -KEY "val assetURL =" https://poly.googleapis.com/v1/assets/94XG1XUy10q "} переосмислити забаву onCreate (збереженеInstanceState: Bundle?) {Super.onCreate (savedInstanceState) setContentView (R.layout.activity_main) if ( APIKey.startsWith ("INSERT")) {Toast.makeText (це "Ви не оновили ключ API", Toast.LENGTH_SHORT) .show ()} else {

Далі нам потрібно зробити GET-запит до URL-адреси ресурсу, використовуючи метод httpGet (). Я також уточнюю, що тип відповіді повинен бути JSON:

імпорт android.content.Intent імпорт android.os.Bundle імпорт android.support.v7.app.AppCompatActivity імпорт android.widget.Toast import com.github.kittinunf.fuel.android.extension.responseJson import com.github.kittinunf.fuel .httpDownload імпорт com.github.kittinunf.fuel.httpGet імпорт kotlinx.android.synthetic.main.activity_main. * import java.io.File class MainActivity: AppCompatActivity () {супровідний об'єкт {const val APIKey = "ВСТУПИТИ-ВАШ-API -KEY "val assetURL =" https://poly.googleapis.com/v1/assets/94XG1XUy10q "} переосмислити забаву onCreate (збереженеInstanceState: Bundle?) {Super.onCreate (savedInstanceState) setContentView (R.layout.activity_main) if ( APIKey.startsWith ("INSERT")) {Toast.makeText (це "Ви не оновили свій ключ API", Toast.LENGTH_SHORT) .show ()} else {// Зробіть серверний дзвінок, а потім передайте дані за допомогою Метод "listOf" // активURL.httpGet (listOf ("ключ" до APIKey)). ReplyJson {запит, відповідь, результат -> // Зробити щось з відповіддю // result.fold ({val as set = it.obj ()

Актив може мати декілька форматів, таких як OBJ, GLTF та FBX. Нам потрібно визначити, що актив у форматі OBJ.

На цьому кроці я також отримую ім’я та URL-адресу всіх файлів, які нам потрібно завантажити,
включаючи основний файл об’єкта ("корінь"), а також будь-які пов'язані з ними матеріали та текстурні файли ("ресурси").

Якщо наша програма не в змозі відновити актив належним чином, він відобразить тост, який повідомляє користувача.

імпорт android.content.Intent імпорт android.os.Bundle імпорт android.support.v7.app.AppCompatActivity імпорт android.widget.Toast import com.github.kittinunf.fuel.android.extension.responseJson import com.github.kittinunf.fuel .httpDownload імпорт com.github.kittinunf.fuel.httpGet імпорт kotlinx.android.synthetic.main.activity_main. * import java.io.File class MainActivity: AppCompatActivity () {супровідний об'єкт {const val APIKey = "ВСТУПИТИ-ВАШ-API -KEY "val assetURL =" https://poly.googleapis.com/v1/assets/94XG1XUy10q "} переосмислити забаву onCreate (збереженеInstanceState: Bundle?) {Super.onCreate (savedInstanceState) setContentView (R.layout.activity_main) if ( APIKey.startsWith ("INSERT")) {Toast.makeText (це "Ви не оновили свій ключ API", Toast.LENGTH_SHORT) .show ()} else {// Зробити GET запит на URL-адресу активу // активURL. httpGet (listOf ("ключ" до APIKey)). responseJson {запит, відповідь, результат -> // Зробити щось з відповіддю // result.fold ({val актив = it.obj () var objectURL: String? = null var materialLibraryName: Рядок? = null var materialLibraryURL: Рядок? = null // Перевірте формат активу, використовуючи масив "формати" // val assetFormats = asset.getJSONArray ("формати") // Проведіть цикл через усі формати // для (i в 0 до активу Formats.length ()) { val currentFormat = assetFormats.getJSONObject (i) // Використовуйте formatType для ідентифікації типу формату цього ресурсу. Якщо формат OBJ… .// if (currentFormat.getString (“formatType”) == “OBJ”) {//..., тоді виберіть файл “root” цього ресурсу, тобто файл OBJ // objectURL = currentFormat. getJSONObject ("root") .getString ("url") // Отримайте всі залежності кореневого файлу // materialLibraryName = currentFormat.getJSONArray ("ресурси") .getJSONObject (0) .getString ("relaPath") materialLibraryURL = currentFormat.getJSON ("ресурси") .getJSONObject (0) .getString ("url") перерва}} об'єктURL !!. httpDownload (). призначення {_, _ -> файл (filesDir, "globeAsset.obj")}. відповідь {_ , _, результат -> result.fold ({}, {// Якщо ви не можете знайти або завантажити файл OBJ, тоді відобразиться помилка // Toast.makeText (це "Неможливо завантажити ресурс", Toast.LENGTH_SHORT ) .show ()})} materialLibraryURL !!. httpDownload (). призначення {_, _ -> файл (filesDir, materialLibraryName)}. Response {_, _, результат -> result.fold ({}, {Toast. makeText (це "Неможливо завантажити ресурс", Toast.LENGTH_SHORT) .show ()})}}, { Toast.makeText (це "Неможливо завантажити ресурс", Toast.LENGTH_SHORT) .show ()})}}}

На даний момент, якщо ви встановите проект на свій смартфон або планшет Android або віртуальний пристрій Android (AVD), цей актив буде завантажено успішно, але програма фактично його не відображатиме. Давайте зараз це вирішимо!

Створення другого екрана: Додавання навігації

Ми будемо відображати об’єкт у повноекранному режимі, тож оновимо наш файл main_activity.xml, щоб включити кнопку, яка при натисканні запустить активність на повноекранному екрані.

Тепер додамо onClickListener в кінець файлу MainActivity.kt:

імпорт android.content.Intent імпорт android.os.Bundle імпорт android.support.v7.app.AppCompatActivity імпорт android.widget.Toast import com.github.kittinunf.fuel.android.extension.responseJson import com.github.kittinunf.fuel .httpDownload імпорт com.github.kittinunf.fuel.httpGet імпорт kotlinx.android.synthetic.main.activity_main. * import java.io.File class MainActivity: AppCompatActivity () {супровідний об'єкт {const val APIKey = "ВСТУПИТИ-ВАШ-API -KEY "val assetURL =" https://poly.googleapis.com/v1/assets/94XG1XUy10q "} переосмислити забаву onCreate (збереженеInstanceState: Bundle?) {Super.onCreate (savedInstanceState) setContentView (R.layout.activity_main) if ( APIKey.startsWith ("INSERT")) {Toast.makeText (це "Ви не оновили свій ключ API", Toast.LENGTH_SHORT) .show ()} else {imovURL.httpGet (listOf ("ключ" до APIKey)). responseJson {запит, відповідь, результат -> result.fold ({val актив = it.obj () var objectURL: String? = null var materialLibraryName: String? = null var materialLibraryURL: Str ing? = null val assetFormats = asset.getJSONArray ("формати") для (i в 0 до активуFormats.length ()) {val currentFormat = imovinaFormats.getJSONObject (i) if (currentFormat.getString ("formatType") == "OBJ" ) {objectURL = currentFormat.getJSONObject ("корінь") .getString ("url") materialLibraryName = currentFormat.getJSONArray ("ресурси") .getJSONObject (0) .getString ("relaPath") materialLibraryURL = currentFormat.getJSONArray ) .getJSONObject (0) .getString ("url") перерва}} об'єктURL !!. httpDownload (). призначення {_, _ -> файл (filesDir, "globeAsset.obj")} .відповідь {_, _, результат -> result.fold ({}, {Toast.makeText (це "Неможливо завантажити ресурс", Toast.LENGTH_SHORT) .show ()})} materialLibraryURL !!. httpDownload (). призначення {_, _ -> Файл (filesDir, materialLibraryName)}. Response {_, _, result -> result.fold ({}, {Toast.makeText (це, "Неможливо завантажити ресурс", Toast.LENGTH_SHORT) .show ()})}}, {Toast.makeText (це "Неможливо завантажити ресурс", Toast.LENGTH_SHORT) .sh ow ()})} // Реалізувати кнопку // displayButton.setOnClickListener {val intent = Намір (це, SecondActivity :: class.java) startActivity (intennt); }}}

Побудова 3D-полотна

Тепер давайте створимо Активність, де ми будемо відображати наш актив у повноекранному режимі:

  • Клацніть клавішею MainActivity.kt свого проекту та натисніть «Створити> Файл / клас Котліна».
  • Відкрийте спадне меню "Вид" та виберіть "Клас".
  • Дайте цьому класу назву "SecondActivity" та натисніть "OK".

Для того, щоб намалювати 3D-об’єкт, нам потрібно 3D-полотно! Я буду використовувати рендерінг P3D бібліотеки Android, що означає розширення класу PApplet, переопределення методу settings (), а потім передачу P3D як аргумент методу fullScreen (). Нам також потрібно створити властивість, яка представляє актив Poly як об'єкт PShape.

private fun displayAsset () {val canvas3D = object: PApplet () {var polyAsset: PShape? = нульові зміни параметрів веселощів () {fullScreen (PConstants.P3D)}

Далі нам потрібно ініціалізувати об’єкт PShape, замінивши метод setup (), викликаючи метод loadShape (), а потім пропустивши абсолютний шлях файлу .obj:

переосмислити налаштування веселощів () {polyAsset = loadShape (Файл (filesDir, "globeAsset.obj"). absolPath)}

Малюнок на полотні P3D

Щоб намалювати це 3D-полотно, нам потрібно переосмислити метод draw ():

переосмислити веселе малювання () {фон (0) форма (polyAsset)}}

За замовчуванням багато активів, отриманих з API API, знаходяться на меншій стороні, тож якщо ви зараз запустите цей код, ви, можливо, навіть не побачите об’єкт, залежно від конфігурації екрана. Створюючи тривимірні сцени, ви зазвичай створюєте власну камеру, щоб користувач міг досліджувати сцену та переглядати ваші 3D-об’єкти з повних 360 градусів. Однак це виходить за межі цієї статті, тому я зміню розмір та положення активу вручну, щоб переконатися, що він зручно розміщується на екрані.

Ви можете збільшити розмір активу, передавши негативне значення методу шкали ():

масштаб (-10f)

Ви можете змінити позицію об’єкта у віртуальному тривимірному просторі, використовуючи метод translate () та наступні координати:

  • X. Розташуйте актив уздовж горизонтальної осі.
  • Y. Розташуйте актив уздовж вертикальної осі.
  • З. Це вісь «глибина / висота», яка перетворює 2D об’єкт у 3D-об’єкт. Позитивні значення створюють враження, що об’єкт наближається до вас, а негативні значення створюють враження, що об’єкт віддаляється від вас.

Зауважте, що перетворення є кумулятивними, тому все, що відбувається після функції, акумулює ефект.

Я використовую таке:

перекласти (-50f, -100f, 10f)

Ось заповнений код:

переосмислити забавне малювання () {background (0) шкала (-10f) translate (-50f, -100f) // Намалюй об’єкт, викликавши метод shape () // shape (polyAsset)}}

Далі нам потрібно створити відповідний файл макета, куди ми додамо 3D-полотно як віджет FrameLayout:

  • Натисніть папку "res> layout" вашого проекту, натисніть клавішу управління.
  • Виберіть "Файл ресурсу макета".
  • Дайте цьому файлу ім'я "activity_second", а потім натисніть "OK".

Тепер у нас є наш FrameLayout „resource_view”, нам потрібно повідомити про це SecondActivity! Поверніться до файла SecondActivity.kt, створіть новий екземпляр PFragment і вкажіть його у напрямку нашого віджета "resource_view":

імпорт android.os.Bundle імпорт android.support.v7.app.AppCompatActivity імпорт kotlinx.android.synthetic.main.activity_second. * імпорт обробка.android.PFragment імпорт обработка.core.PApplet імпорт обработка.core.PConstants імпорт обработка.core .PShape імпорт java.io.File клас SecondActivity: AppCompatActivity () {переосмислити забаву onCreate (збереженийInstanceState: Bundle?) {Super.onCreate (saveInstanceState) setContentView (R.layout.activity_second) displayAsset ()} приватний розважальний показAsset () {val canvas3D = об'єкт: PApplet () {var polyAsset: PShape? = null override fun settings () {fullScreen (PConstants.P3D)} настройка розваг веселощів () {polyAsset = loadShape (Файл (filesDir, "globeAsset.obj"). абсолютний шлях)} переосмислити весело малювати () {фон (0) шкала (-10f) перевести (-50f, -100f) форму (polyAsset)}} // Додати наступне // val assetView = PFragment (canvas3D) assetView.setView (resource_view, this)}}

Останнім кроком є ​​додавання SecondActivity до Вашого Маніфесту:

// Додайте наступне //

Тестування вашого проекту

Ми готові випробувати готовий проект! Встановіть його на свій пристрій Android або AVD та переконайтеся, що у вас є активне підключення до Інтернету. Як тільки програма запуститься, вона завантажить об’єкт, і ви зможете переглянути його, натиснувши кнопку "Відобразити актив".

Ви можете завантажити цей повний проект з GitHub.

Підведенню

У цій статті ми розглянули, як використовувати API API для отримання тривимірного об’єкта під час виконання та як відобразити цей ресурс за допомогою бібліотеки Processing for Android. Чи вважаєте ви, що API API має потенціал, щоб зробити розробку VR та AR доступною для більшої кількості людей? Повідомте нас у коментарях нижче!

Пов'язані

  • Google принесе програми AR на «сотні мільйонів» пристроїв Android у 2018 році
  • Google навчить вас про ІС та машинне навчання безкоштовно
  • 15 кращих VR-ігор для Google Cardboard
  • 10 найкращих програм VR для картону Google
  • Що таке Google Fuchsia? Це новий Android?
  • Що таке Google Duplex? - функції, дата випуску тощо
  • Як створити VR-додаток для Android всього за 7 хвилин
  • Мобільні гарнітури VR - які найкращі варіанти?

OnePlu - це дуже ефективна компанія, що стосується створення запасів своїх смартфонів. Коли з'являється новий пристрій, компанія, як правило, вже продається за попередній пристрій, що запобігає ви...

Якщо ви дійсно хотіли Thunder Purple видання OnePlu 6T, але пропустили вашу можливість під час першого запуску, ми отримали хороші новини: у вас є ще один шанс. Thunder Purple OnePlu 6T знову є на скл...

Ми Радимо Читати