netlib.narod.ru< Назад | Оглавление | Далее >

12.1. Проектирование класса камеры

Мы определяем местоположение и ориентацию камеры относительно мировой системы координат с помощью четырех векторов камеры (camera vectors): правого вектора (right vector), верхнего вектора (up vector), вектора взгляда (look vector) и вектора местоположения (position vector), как показано на рис. 12.1. Эти векторы образуют локальную систему координат камеры, описанную в мировой системе координат. Поскольку правый вектор, верхний вектор и вектор взгляда описывают ориентацию камеры в мировом пространстве, мы иногда будем называть их векторами ориентации (orientation vectors). Векторы ориентации должны быть ортонормальными. Набор векторов называется ортонормальным, если каждый вектор перпендикулярен остальным и длина всех векторов равна единице. Причина данного ограничения в том, что позже мы подставим эти векторы в строки матрицы, а матрица в которой векторы-строки являются ортонормальными будет ортогональной. Вспомните, что отличительной особенностью ортогональной матрицы является то, что результат ее транспонирования равен результату ее инвертирования. Пользу этой особенности мы увидим в разделе 12.2.1.2.


Рис. 12.1. Векторы камеры определяют ее ориентацию и местоположение в мировой системе координат

Рис. 12.1. Векторы камеры определяют ее ориентацию и местоположение в мировой системе координат


Эти четыре описывающих камеру вектора позволяют выполнять с камерой следующие шесть операций:

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

class Camera
{
public:
     enum CameraType { LANDOBJECT, AIRCRAFT };

     Camera();
     Camera(CameraType cameraType);
     ~Camera();

     void strafe(float units); // влево/вправо
     void fly(float units);    // вверх/вниз
     void walk(float units);   // вперед/назад

     void pitch(float angle); // вращение относительно правого вектора
     void yaw(float angle);   // вращение относительно верхнего вектора
     void roll(float angle);  // вращение относительно вектора взгляда

     void getViewMatrix(D3DXMATRIX* V);
     void setCameraType(CameraType cameraType);
     void getPosition(D3DXVECTOR3* pos);
     void setPosition(D3DXVECTOR3* pos);
     void getRight(D3DXVECTOR3* right);
     void getUp(D3DXVECTOR3* up);
     void getLook(D3DXVECTOR3* look);

private:
     CameraType  _cameraType;
     D3DXVECTOR3 _right;
     D3DXVECTOR3 _up;
     D3DXVECTOR3 _look;
     D3DXVECTOR3 _pos;
};

В этом определении класса есть одна вещь, которую мы до сих пор не обсуждали — перечисление CameraType. Дело в том, что наша камера поддерживает две модели поведения: LANDOBJECT и AIRCRAFT. Модель AIRCRAFT позволяет свободно перемещаться в пространстве и предоставляет шесть степеней свободы. В то же время в ряде игр с видом от первого лица персонаж не может летать, и нам надо ограничить перемещение по соответствующей оси. Чтобы внести эти ограничения, достаточно указать для камеры тип LANDOBJECT, что будет показано в последующих разделах.


netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz