Журнал LinuxFormat - перейти на главную

LXF167:Android

Материал из Linuxformat
(Различия между версиями)
Перейти к: навигация, поиск
(Новая страница: «Категория:Постоянные рубрики '''Android''' '''» Программирование Работа с сенсорным экрано…»)

Версия 04:44, 8 ноября 2018

Android » Программирование Работа с сенсорным экраном при помощи библиотек OpenGL

Тек­сту­ры и OpenGL: На сен­сор­ном эк­ра­не

(thumbnail)
> Тут мы ос­та­но­ви­лись в про­шлой ста­тье (она есть на DVD). Те­перь до­ба­вим тек­сту­ры.
(thumbnail)
Наш эксперт Джуль­ет­та Кемп еще пом­нит вре­ме­на, ко­гда в фо­то­ап­па­ра­тах бы­ла на­стоя­щая плен­ка. Сей­час она де­ла­ет гораздо поболее сним­ков, чем то­гда.

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);

Ском­пи­ли­руй­те и за­пус­ти­те про­грам­му, и вы уви­ди­те, как куб мед­лен­но дви­жет­ся по эк­ра­ну.

Персональные инструменты
купить
подписаться
Яндекс.Метрика