LXF167:Android
|
|
|
Android » Программирование Работа с сенсорным экраном при помощи библиотек OpenGL
Текстуры и OpenGL: На сенсорном экране
OpenGL в Android позволяет создавать улучшенную графику и использовать гибкий открытый подход к трехмерной графике. В предыдущей статье мы работали с фигурами, цветами, камерами и проекциями экрана и познакомились с перемещением фигуры; теперь мы продолжим работу с примером и будем перемещать фигуру по экрану в ответ на касания сенсорного экрана, а также познакомимся с умеренно сложной, но полезной технологией наложения текстур. Как и прежде, мы пользуемся OpenGL ES2.0, который поддерживается в Android 2.2 и выше. Помните, что код нельзя будет проверить в эмуляторе, так как он не работает с OpenGL 2, и для отладки вам потребуется реальное устройство. Преобразования и порядок множителей
Чтобы получить правильный результат при перемещении, как в onSurfaceCreated(), таковое нужно выполнять (то есть домножать на матрицу перемещения iMatrix) после умножения на проекционную матрицу и матрицу проекции камеры. В противном случае оси X и Z меняют направления на противоположные, и куб перемещается не туда, куда вы хотели. Чтобы понять, почему это происходит, нам нужно обратиться к математике умножения матриц, а я не хочу углубляться в детали.
Однако домножать на матрицу поворота mMatrix нужно до умножения на проекционную матрицу и матрицу проекции камеры, иначе вы столкнетесь с другими проблемами.
Можно было бы воспользоваться одной матрицей mMatrix для перемещения и поворота. Однако в этом случае после поворота при перемещении будет использоваться не стандартная система координат XYZ, которую мы представляем на экране (где ось X – горизонтальная, Y – вертикальная, а Z выходит из экрана по направлению к вам), а повернутая система координат: изначально куб находится в исходной системе, но при повороте матрицы система координат поворачивается вместе с ней. Таким образом, перенос на 0.2 координаты в направлении X и на 0.2 координаты в направлении Y будет производиться относительно повернутого куба, а не относительно абсолютных координат экрана.
Это может быть удобно при перемещении объектов по экрану. Чтобы это не приводило к проблемам, здесь мы пользуемся отдельными матрицами для поворота и перемещения и внимательно следим за порядком умножения матриц. Мы вернемся к этому позже, начав работу с сенсорным экраном.
В развитие предыдущей статьи Джульетта Кемп переходит к текстурам и сенсорному экрану для перемещения фигур.
Перемещение и сенсорный экран
Прежде всего кратко ознакомимся с перемещением (объекта по экрану), не касаясь работы с сенсорным экраном. Это просто еще одна операция с матрицей, translateM(). Добавьте следующие две строки после поворота в CISGLRenderer.onSurfaceCreated():
Matrix.setIdentityM(iMatrix, 0);
Matrix.translateM(iMatrix, 0, 0.2f, 0.2f, 0f);
Также понадобится создать переменную класса iMatrix и добавить в onDrawFrame() строку
Matrix.multiplyMM(uMVPMatrix, 0, tMatrix, 0, uMVPMatrix, 0);
после других операций умножения матриц.
Эти вызовы переместят куб на 0.2 координаты влево и на 0.2 координаты вверх по экрану.
Помните, что порядок множителей при умножении матриц имеет значение! Подробности см. во врезке.
В качестве альтернативного варианта можно немного перемещать куб в каждом кадре, добавив следующую строку в onDrawFrame():
Matrix.translateM(iMatrix, 0, 0.001f, 0.001f, 0);
Скомпилируйте и запустите программу, и вы увидите, как куб медленно движется по экрану.