Главная » Программирование игр под Android » КАМЕРА В 2D – РАЗРАБОТКА ИГР ДЛЯ ОС ANDROID

0

 

До этого момента у нас не было понятия камеры в нашем коде; мы только определили область видимости камеры (конус отображения) при помощи glOrthof :

Вы знаете, что первые два параметра определяют х-координаты левого и правого краев конуса отображения в нашем мире, следующие два параметра задают у-координаты нижнего и верхнего краев конуса отображения, а последние два параметра указывают ближнюю и дальнюю плоскости отсечения. На рис. 8.19 показана область видимости камеры.

Таким образом, мы видим только область от (0; 0; 1) до (FRUSTUMWIDTH; FRUSTUM  HEIGHT; -1) нашего мира. Как думаете, хорошо было бы иметь возможность сдвинуть область видимости, скажем, влево? Конечно, это было бы неплохо, а это ведь очень просто:

В данном случае х – это просто какая-то начальная точка, которую мы можем определить. Мы также можем произвести сдвиги по х- и у-осям:

На рис. 8.20 показано, что имеется в виду.

Так, мы просто обозначаем нижний левый угол конуса отображения нашей камеры в пространстве мира. Этого уже достаточно для реализации свободно движущейся 20-камеры. Но мы можем сделать ее еще лучше. Как насчет определения не нижнего левого угла области видимости точками хиу, а центра области видимости?

Рис. 8.19. Область видимости камеры для нашего 2Р-мира

Рис. 8.20. Сдвиг области видимости камеры

Таким образом мы могли бы просто размещать центр нашей области видимости на объекте в специфическом положении – скажем, пушечном ядре из предыдущего примера:

На рис. 8.21 показано, как это выглядит.

Рис. 8.21. Определение центра конуса отображения через его центр

И это еще не все, что можно сделать с gl Orthof . Как насчет изменения масштаба? Мы знаем, что благодаря gl Viewportf  мы можем сообщить OpenGL ES, на какую часть экрана демонстрировать содержимое нашего конуса отображения. OpenGL ES автоматически растянет и изменит масштаб итогового изображения, согласовывая его с областью просмотра (viewport). Если мы сделаем ширину и длину нашего конуса отображения меньше, мы просто покажем меньшую область мира на экране. Это увеличение масштаба. Если мы делаем область больше, мы показываем большую часть нашего мира – это уменьшение масштаба. Таким образом, мы можем ввести переменную масштаба и умножать ее на ширину и длину нашего конуса отображения для увеличения или уменьшения масштаба. При множителе, равном 1, мир будет показан, как на рис. 8.21, при использовании нормальных ширины и длины области видимости. При множителе меньше 1 будет происходить уменьшение масштаба к центру конуса отображения. А при множителе больше 1 масштаб будет уменьшаться, показывая большую часть мира (например, при множителе, равном 2, будет видно в 2 раза больше мира). Вот как мы можем использовать glOrthof О, чтобы сделать это:

Проще простого. Теперь мы можем создать класс камеры с точкой, к которой камера обращена (центр конуса отображения), стандартными шириной и длиной области видимости и переменной масштаба, которая делает конус отображения больше или меньше, таким образом показывая нам меньшую (увеличение масштаба) или большую (уменьшение масштаба) часть мира. На рис. 8.22 изображена область видимости при множителе масштаба, равном 0,5 (внутренний серый прямоугольник), и та же область при множителе, равном 1 (внешний прозрачный прямоугольник).

Рис. 8.22. Изменение масштаба с помощью изменения размеров конуса отображения

Для полноты картины нужно сделать еще одну вещь. Представьте, что мы касаемся экрана и хотим выяснить, какой точки в нашем 2D-MHpe мы коснулись. Мы уже делали такое несколько раз в наших постоянно совершенствующихся примерах с пушкой. При конфигурации конуса отображения, которая не учитывает положение камер и масштаб, как на рис. 8.19, мы имеет следующие уравнения (смотрите метод update в наших примерах с пушкой):

Сначала нормализуем координаты х и у, полученные при касании, до промежутка от 0 до 1 путем деления их на ширину и длину экрана. Затем изменяем их масштаб так, чтобы они выражались через пространство нашего мира, умножая их на ширину и длину области видимости. Нам необходимо учесть позицию конуса отображения и переменную масштаба. Вот как мы это делаем:

-х и у здесь – положение камеры в пространстве мира.

Источник: Mario Zechner / Марио Цехнер, «Программирование игр под Android», пер. Егор Сидорович, Евгений Зазноба, Издательство «Питер»

По теме:

  • Комментарии