Научитесь разрабатывать приложения виртуальной реальности для 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']) }
Вы готовы дать толчок разработке приложений для виртуальной реальности!
Вы Android-разработчик? Присоединяйтесь к Truelancer сегодня и начните работать фрилансером
