Главная » Программирование игр под Android » Камера с видом от третьего лица – РАЗРАБОТКА ИГР ДЛЯ ОС ANDROID

0

Второй тип камеры, который часто можно встретить в играх, – это камера с видом от третьего лица. Она определяется следующими параметрами: позиция в пространстве; верхний вектор; рассматривайте его как стрелку, выходящую из вершины вашего черепа и указывающую в том же направлении, что и она; позиция взгляда в пространстве или в качестве альтернативы – вектор направления; мы будем использовать первый вариант; поле видимости в градусах; соотношение сторон окна просмотра; расстояния ближней и дальней плоскостей отсечения.

Единственное отличие от Эйлеровой камеры заключается в способе представления ориентации камеры. В этом случае мы определяем ее как верхний вектор и позиция взгляда.

Напишем вспомогательный класс для этого типа камеры (листинг 11.11).

Листинг 11.11. Класс LookAtCamera.java, простая камера с видом от третьего лица без особых изысков

Ничего удивительного. Мы просто сохраняем значения positi on, up и 1ookAt как  экземпляры класса Vector3 наряду с параметрами перспективной проекции, которые также использовались и для EulerCamera. В дополнение мы предоставляем несколько методов, возвращающих значения параметров, поэтому можем модифицировать атрибуты камеры. Единственный стоящий нашего внимания метод – это setMatrices. Но даже он нам уже знаком. Мы сначала устанавливаем матрицу проекции, основываясь на поле видимости, соотношении сторон и расстояний до ближней и дальней плоскостей отсечения. Далее устанавливаем модельно-видовую матрицу таким образом, чтобы она содержала позицию камеры и матрицу ориентации с помощью метода gl uLookAtC. Это сделает матрицу, очень похожую на ту, которую мы создали собственноручно в примере Eul erCamera. Это также повернет объекты вокруг камеры. Однако замечательный интерфейс метода gl uLookAt позволяет нам не делать такие глупые вещи, как инвертирование позиций или углов.

Фактически использование этой камеры похоже на применение камеры Эйлера. Все, что нам нужно, – создать вектор направления, вычтя позицию камеры от точки, на которую она направлена, и нормализовав полученный результат. Далее мы просто поворачиваем этот вектор на углы поворота вокруг осей хну.

Наконец, мы устанавливаем новую позицию взгляда на позицию камеры и добавляем вектор направления.

Оба способа создадут одинаковую матрицу трансформации. Эти способы отличаются лишь обработкой ориентации камеры.

Мы воздержимся от написания прямого примера с использованием класса LookAtCamera, поскольку его интерфейс идеально прост. Мы будем применять его в последней игре, которую рассмотрим в е, где камера будет следовать за небольшим милым космическим кораблем. Если же вы хотите узнать, на что способен этот класс, добавьте его в пример Li ghtTest, который мы написали ранее, или модифицируйте пример Eul erCameraTest таким образом, чтобы класс LookAtCamera использовался как камера от первого лица, что мы обозначили в предыдущем разделе.

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

По теме:

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