Научитесь разрабатывать приложения виртуальной реальности для Android с нуля
Опубликовано: 2015-11-16В этой статье вы узнаете, как разрабатывать приложения виртуальной реальности для Android с нуля, при условии, что вы уже знакомы с основами разработки приложений для Android.
Требования
- Android Studio 1.0 или выше
- Android SDK версии 19
- Физическое устройство Android под управлением Android 16 (Jelly Bean) или выше.
Файл манифеста
<манифест... <uses-permission android:name="android.permission.NFC" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.VIBRATE" /> ... <uses-sdk android:minSdkVersion="16" android:targetSdkVersion="19"/> <uses-feature android:glEsVersion="0x00020000" android:required="true" /> <приложение ... <активность андроид: имя = ".MainActivity" Android: screenOrientation="пейзаж"> ... <намерение-фильтр> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> <category android:name="com.google.intent.category.CARDBOARD" /> </интент-фильтр> </активность> </приложение> </манифест>
Объяснение разрешений:
- <uses-sdk android:minSdkVersion=”16″/> указывает, что устройство должно работать под управлением API уровня 16 (Jellybean) или выше.
- <uses-sdk android:targetSdkVersion="19"/> указывает, что наше приложение нацелено на уровень API 19 (KitKat).
- <uses-feature android:glEsVersion=”0x00020000″ android:required=”true” /> указывает, что приложение использует графику и поэтому должно поддерживать OpenGL ES 2.0.
- android:screenOrientation="landscape" указывает, что для действия требуется ориентация экрана "альбомная". Это ориентация, которую вы должны установить для приложений VR. Представление, используемое Cardboard SDK, CardboardView, отображается только в полноэкранном и альбомном режимах (альбомный, reverseLandscape, sensorLandscape).
- Параметр android:configChanges="orientation|keyboardHidden" также рекомендуется, но не обязателен.
- Разрешение android.permission.NFC требуется Cardboard SDK для доступа к тегу Cardboard NFC.
- android.permission.READ_EXTERNAL_STORAGE и android.permission.WRITE_EXTERNAL_STORAGE . Эти разрешения требуются Cardboard SDK для сопряжения телефона пользователя со средством просмотра виртуальной реальности.
- Разрешение android.permission.VIBRATE требуется нашему демонстрационному приложению, чтобы заставить телефон вибрировать, чтобы сообщить пользователю, что что-то произошло.
- Фильтр намерений и, в частности, com.google.intent.category.CARDBOARD заявляют, что это действие совместимо со средствами просмотра, подобными Cardboard. Эта категория используется приложением Cardboard для списка совместимых приложений, установленных на телефоне пользователя.
Продлить активность картона:
CardboardActivity — это отправная точка для написания кода картонного приложения. CardboardActivity — это базовое действие, обеспечивающее простую интеграцию с устройствами Cardboard. Он предоставляет события для взаимодействия с Cardboards и обрабатывает многие детали, которые обычно требуются при создании действия для рендеринга виртуальной реальности.
Обратите внимание, что CardboardActivity использует липкий иммерсивный режим, в котором системный пользовательский интерфейс скрыт, а содержимое занимает весь экран. Это требование для VR-приложения, поскольку CardboardView будет отображаться только тогда, когда действие находится в полноэкранном режиме.
Android 4.4 (уровень API 19) представляет новый флаг SYSTEM_UI_FLAG_IMMERSIVE для setSystemUiVisibility(), который позволяет вашему приложению работать в полноэкранном режиме. Этот флаг в сочетании с флагами SYSTEM_UI_FLAG_HIDE_NAVIGATION и SYSTEM_UI_FLAG_FULLSCREEN скрывает навигацию и строки состояния и позволяет вашему приложению фиксировать все сенсорные события на экране.
Определите CardBoardView:
Все элементы пользовательского интерфейса в приложении для Android создаются с использованием представлений. Cardboard SDK для Android предоставляет собственное представление CardboardView, удобное расширение GLSurfaceView, которое можно использовать для рендеринга виртуальной реальности. CardboardView отображает содержимое в стереофоническом режиме. Вы можете увидеть, как демонстрационное приложение определяет aCardboardView в XML-файле макета активности следующим образом:
<com.google.vrtoolkit.cardboard.CardboardView андроид: fill_parent" android:layout_height="fill_parent" />
Затем в основном классе активности он инициализирует CardboardView в методе onCreate():
** * Устанавливает представление в наш CardboardView и инициализирует матрицы преобразования, которые мы будем использовать * для визуализации нашей сцены. * @param saveInstanceState */ @Override public void onCreate (Bundle saveInstanceState) { super.onCreate(savedInstanceState); setContentView (R.layout.common_ui); CardboardView cardboardView = (CardboardView) findViewById(R.id.cardboard_view); // Свяжите CardboardView.StereoRenderer с картонным представлением. картонView.setRenderer(этот); // Свяжите картонView с этой активностью. setCardboardView (картонный вид); // Здесь инициализируем другие объекты .... }
Рендеринг вида
Получив CardboardView, вы связываете его с средством визуализации, а затем связываете CardboardView с активностью. Cardboard поддерживает два типа визуализаторов, но самый быстрый способ начать работу — использовать CardboardView.StereoRenderer, который используется в демонстрационном приложении.
CardboardView.StereoRenderer включает следующие ключевые методы:
- onNewFrame(), вызываемый каждый раз, когда это приложение отрисовывается.
- onDrawEye(), вызываемый для каждого глаза с разными параметрами глаза.
Их реализация аналогична тому, что вы обычно делаете для приложения OpenGL. Эти методы более подробно обсуждаются в следующих разделах.
Реализовать onNewFrame
Используйте метод onNewFrame() для кодирования логики рендеринга перед рендерингом отдельных глаз. Здесь должны выполняться любые операции с кадром, не относящиеся к одному представлению. Это хорошее место для обновления вашей модели. В этом фрагменте переменная mHeadView содержит положение головы. Это значение необходимо сохранить, чтобы использовать его позже, чтобы узнать, смотрит ли пользователь на сокровище:
/** * Подготавливает OpenGL ES, прежде чем мы нарисуем кадр. * @param headTransform Трансформация головы в новом кадре. */ @Override public void onNewFrame (HeadTransform headTransform) { ... headTransform.getHeadView (mHeadView, 0); ... }
Реализовать наDrawEye
Реализуйте onDrawEye() для выполнения конфигурации для каждого глаза.
Это основная часть кода рендеринга, очень похожая на создание обычного приложения OpenGL ES2. В следующем фрагменте показано, как получить матрицу преобразования вида, а также матрицу преобразования перспективы. Вам нужно убедиться, что вы выполняете рендеринг с низкой задержкой. Объект Eye содержит матрицы преобразования и проекции для глаза. Это последовательность событий:
- Сокровище попадает в пространство глаз.
- Применяем матрицу проекции. Это обеспечивает визуализацию сцены для указанного глаза.
- Cardboard SDK автоматически применяет искажение для рендеринга финальной сцены.
/** * Рисует рамку для глаза. * * @param eye Глаз для рендеринга. Включает в себя все необходимые преобразования. */ @Override public void onDrawEye (глаз глаз) { GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT); ... // Применяем преобразование глаза к камере. Matrix.multiplyMM(mView, 0, eye.getEyeView(), 0, mCamera, 0); // Устанавливаем положение источника света Matrix.multiplyMV(mLightPosInEyeSpace, 0, mView, 0, LIGHT_POS_IN_WORLD_SPACE, 0); // Строим матрицы ModelView и ModelViewProjection // для расчета положения куба и света. float [] перспектива = eye.getPerspective (Z_NEAR, Z_FAR); Matrix.multiplyMM(mModelView, 0, mView, 0, mModelCube, 0); Matrix.multiplyMM(mModelViewProjection, 0, перспектива, 0, mModelView, 0); нарисоватьКуб(); // Рисуем остальную часть сцены. ... }
Обработка входных данных
Средство просмотра Cardboard включает в себя кнопку, в которой используется магнит. Когда вы нажимаете на магнит, магнитное поле изменяется и регистрируется магнитометром вашего телефона. Эти магнитные события обнаруживаются Cardboard SDK.
Чтобы обеспечить пользовательское поведение, когда пользователь тянет магнит, переопределите CardboardActivity.onCardboardTrigger() в активности вашего приложения. В приложении поиска сокровищ, если вы нашли сокровище и потянули магнит, вы можете сохранить сокровище:
/** * Увеличивайте счет, скрывайте объект и давайте обратную связь, если пользователь тянет магнит во время * глядя на объект. В противном случае напомните пользователю, что делать. */ @Override public void onCardboardTrigger() { если (ищет объект()) { mScore++; mOverlayView.show3DToast("Нашел! Поищите еще один.\nScore = " + mScore); ... } еще { mOverlayView.show3DToast("Оглянитесь, чтобы найти объект!"); } // Всегда давать обратную связь пользователю mVibrator.vibrate(50); }
Начните свой собственный проект
Теперь, когда вы лучше знакомы с Cardboard SDK для Android, пришло время создавать собственные приложения.
Будь то новый проект, который вы начинаете с нуля, или уже существующий, вот что вам следует сделать.
1) Загрузите два файла JAR. Нажмите сюда для того, чтобы скачать
2) Скопируйте и вставьте его в папку app/libs (найдите это в представлении проекта структуры проекта Android Studio)
3) Щелкните правой кнопкой мыши библиотеки и выберите «Добавить как библиотеку».
Затем убедитесь, что в файле app/build.gradle вашего проекта присутствуют следующие строки:
зависимости { … скомпилировать дерево файлов (каталог: 'libs', включить: ['*.jar']) }
Вы готовы дать толчок разработке приложений для виртуальной реальности!