Первые шаги в 3D-пространство для iOS

Введение

Эта статья — вторая часть о том, как визуализировать 3D-модель на мобильном устройстве. Чтобы просмотреть предыдущую статью, в которой обсуждалась основная логика и шаги Android, нажмите здесь.

Мы представим шаги по созданию 3D-приложения LibGDX в iOS.

Для этого мы будем использовать RoboVM.

О РобоВМ

RoboVM — это компилятор Java, предназначенный для iOS, macOS и Linux. По сути, это позволяет нам скомпилировать наше JVM-приложение (в данном случае мы будем использовать Kotlin) на устройстве iOS.

RoboVM поставляется с плагином Gradle, чтобы упростить жизнь, когда нам нужно запустить, скомпилировать или заархивировать наш проект как приложение для iOS. Мы воспользуемся этим плагином, чтобы скомпилировать его в нашем симуляторе iOS. Здесь — официальная страница плагина Gradle.

Компилятор был официально выпущен восемь лет назад, но группа MobiDevelop взяла на себя инициативу поддерживать его работоспособность все эти годы. Последняя его версия на момент написания поста была вроде месячной давности (v2.3.18)

Вот ссылка на официальный сайт MobiDevelop RoboVM

Настройка RoboVM

Единственное, что нам нужно настроить здесь, — это плагин Gradle, поскольку основные библиотеки уже добавлены в проект, если мы выберем опцию «iOS» в инструменте настройки LibGDX:

...
project(":ios") {
    apply plugin: "kotlin"
    apply plugin: "robovm"


    dependencies {
        implementation project(":core")
        api "com.mobidevelop.robovm:robovm-rt:$roboVMVersion"
        api "com.mobidevelop.robovm:robovm-cocoatouch:$roboVMVersion"
...

Чтобы настроить плагин RoboVM Gradle, нам потребуется:

  1. Перейдите в меню Android Studio, затем в Preferences
  2. В разделе Plugins мы введем MobiVM — это имя плагина Gradle, который мы ищем.
  3. Мы нажимаем на Install, чтобы получить плагин в нашей Android Studio.

На момент написания этого поста последней версией была 2.3.18.

После завершения установки плагин предложит перезапустить IDE.

Мы приступаем к перезапуску IDE, а затем, если мы посмотрим на наше меню Android Studio, у нас будет новая опция RoboVM для использования:

Создание работающей конфигурации iOS

Теперь нам нужно создать конфигурацию iOS для компиляции в наш симулятор iOS из нашей Android Studio.

Для этого мы перейдем к Edit Configurations в нашей опции Run/Debug Configuration:

Затем здесь мы нажимаем кнопку «плюс» (+), чтобы добавить конфигурацию RoboVM iOS:

Мы можем настроить представление со следующими данными:

  • Имя: iOS
  • Модуль: LibGDX3DTest.ios
  • Устройство/Симулятор: мы выбираем опцию «Симулятор».
  • Тип устройства: может быть любым.
  • Архитектура: Должно быть x86_64. В настоящее время RoboVM не поддерживается на процессорах M1/Apple Silicon (arm64)

Мы нажали «ОК», и в наш список добавилась новая причудливая конфигурация iOS:

Компиляция проектов в нашем симуляторе

Для компиляции я изменил уровень проекта levelbuild.gradle, чтобы использовать следующие версии:

dependencies {
    classpath 'com.android.tools.build:gradle:7.0.4'
    classpath 'com.mobidevelop.robovm:robovm-gradle-plugin:2.3.18'
    classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion"
}

Мы сопоставляем подключаемый модуль IntelliJ Idea MobiVM с robovm-gradle-plugin версиями, то есть 2.3.18.

Также нам нужно установить переменную roboVMVersion с таким же номером в секции allprojects:

gdxVersion = '1.11.0'
roboVMVersion = '2.3.18'
box2DLightsVersion = '1.5'

Перед компиляцией я рекомендую запустить в терминале следующую команду:

xcrun simctl erase all

Это очистит кеш нашего симулятора. Я столкнулся с некоторыми проблемами со сбоем симулятора без предварительного удаления кеша при компиляции RoboVM.

Наконец, мы нажимаем на «Выполнить» (Control+R) и получаем что-то похожее на этот экран:

Мы запустили! Но вы можете заметить, что машина не отцентрована и кажется немного маленькой.

Мы выйдем из IOSLauncher.java и добавим следующие строки в метод createApplication():

double scale = UIScreen.getMainScreen().getScale();
return new IOSApplication(new LibGDX3DTest(scale), config);

Для части Android (AndroidLauncher.java) мы просто изменим последнюю строку метода onCreate на следующую:

initialize(new LibGDX3DTest(1), config);

Наконец, это изменения в нашем файле LibGDX3DTest.kt:

  • Мы добавляем переменную конструктора с именем scale:
class LibGDX3DTest(private var scale: Double) : ApplicationAdapter() {
  • Затем мы используем это свойство scale для умножения width и height, которые дает нам LibGDX API. Мы изменим следующее в нашем методе clearScreen для вызова Gdx.gl.glViewport:
val width = (Gdx.graphics.width * scale).toInt()
val height = (Gdx.graphics.height * scale).toInt()
Gdx.gl.glViewport(0, 0, width, height)

Если мы снова запустим наше приложение в iOS, мы получим следующий результат:

Вот и все! Мы получили визуализацию 3D-модели нашего автомобиля в симуляторе iOS.

Компиляция в устройстве

Прежде всего, если мы хотим скомпилировать на устройстве iOS, нам нужно изменить конфигурацию:

Таким образом, мы сообщаем компилятору о необходимости сборки для архитектуры arm64 вместо запуска на устройстве (у меня iPhone XR).

Но если мы попытаемся запустить его, мы, вероятно, получим сообщение, подобное следующему:

[ERROR] 18:57:06.534 AppLauncher failed with an exception:
[ERROR] 18:57:06.535 org.robovm.libimobiledevice.LibIMobileDeviceException: LOCKDOWN_E_INVALID_SERVICE
[ERROR] 18:57:06.535  at org.robovm.libimobiledevice.LockdowndClient.checkResult(LockdowndClient.java:133)
[ERROR] 18:57:06.535  at org.robovm.libimobiledevice.LockdowndClient.startService(LockdowndClient.java:83)
[ERROR] 18:57:06.535  at org.robovm.libimobiledevice.util.AppLauncher.launchInternal(AppLauncher.java:708)
[ERROR] 18:57:06.535  at org.robovm.libimobiledevice.util.AppLauncher.launch(AppLauncher.java:1057)
[ERROR] 18:57:06.535  at org.robovm.compiler.target.ios.AppLauncherProcess$1.run(AppLauncherProcess.java:67)

Это известная ошибка от RoboVM, и решение состоит в том, чтобы сначала собрать пустой проект из Xcode с тем же идентификатором пакета.

Итак, мы создаем пустой проект в Xcode с тем же BundleID. Чтобы получить BundleID, мы можем посмотреть файл robovm.properties. В данном случае это будет com.fedejordan.libgdx3dtest:

app.version=1.0
app.id=com.fedejordan.libgdx3dtest
app.mainclass=com.fedejordan.libgdx3dtest.IOSLauncher
app.executable=IOSLauncher
app.build=1
app.name=LibGDX3DTest

И мы храним его в папке под названием xcode-project в папке проекта LibGDX3DTest.

Мы запустили его из Xcode, останавливаем выполнение, а затем переключаемся обратно в Android Studio, чтобы запустить наш реальный проект LibGDX:

Заключение

LibGDX — это универсальный фреймворк, который позволяет нам компилировать на нескольких платформах. Мы можем компилировать многие темы в iOS, Android, Desktop и HTML, например, 2D-рисование и 3D-модели, и мы можем создавать игры или приложения, которые могут использовать интенсивный рендеринг графики.

При компиляции в iOS нам нужно выполнить некоторые настройки, чтобы заставить его работать, но как только мы его получим, мы можем продолжить итерацию основной логики (без подключенной платформы), чтобы продолжить работу над нашим проектом.

На мой взгляд, я обычно выбираю LibGDX в качестве основного фреймворка для создания любительских игр, так как это не так просто, как перетаскивание. Это позволяет нам участвовать во всей логике игры с точки зрения программирования. Такие темы, как рендеринг, изменение размера, анимация, спрайты, фон, игровая логика и пользовательский интерфейс, гибки в соответствии со своей парадигмой.

Источники

Не устаю рекомендовать форум MobiVM gitter; они постоянно активны и ответят на любой вопрос или проблему, которые могут возникнуть у вас с RoboVM! Спасибо, Томь-Ски и Дкимица за помощь.

Другие источники: