Векторы камеры определяют ее ориентацию и местоположение в мировой системе координат
Рисунок 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, что будет показано в последующих разделах.