Введение в программирование трехмерных игр с DX9

       

Вращение, или поворот относительно вектора взгляда камеры



Рисунок 12.6. Вращение, или поворот относительно вектора взгляда камеры

Вращение, или поворот относительно вектора взгляда камеры

Как видите при наклоне камеры мы должны повернуть верхний вектор и вектор взгляда относительно правого вектора на заданный угол. Аналогично при рыскании мы поворачиваем правый вектор и вектор взгляда относительно верхнего вектора на указанный угол. А при вращении камеры мы поворачиваем на заданный угол верхний и правый векторы относительно вектора взгляда.

Теперь вы видите, почему нам необходима функция D3DXMatrixRotationAxis, ведь любой из трех векторов относительно которых выполняется поворот, в мировой системе координат может иметь произвольную ориентацию.

Реализация методов для наклона, рыскания и вращения соответствует приведенному выше описанию. Однако для типа камеры LANDOBJECT добавлен ряд ограничений. В частности, неестественно выглядит отклонение от заданного курса при наклоне или вращении наземного объекта. Поэтому при рыскании в модели LANDOBJECT мы выполняем поворот относительно оси Y мировой системы координат, а не относительно верхнего вектора камеры. Кроме того, мы полностью запрещаем вращение наземных объектов. Помните об этом, когда будете использовать класс Camera в своих собственных приложениях; мы предлагаем вам только пример.

Код реализующий наклон, рыскание и вращение камеры выглядит так:

void Camera::pitch(float angle) { D3DXMATRIX T; D3DXMatrixRotationAxis(&T, &_right, angle);

// Поворот векторов _up и _look относительно вектора _right D3DXVec3TransformCoord(&_up,&_up, &T); D3DXVec3TransformCoord(&_look,&_look, &T); }

void Camera::yaw(float angle) { D3DXMATRIX T;

// Для наземных объектов выполняем вращение // вокруг мировой оси Y (0, 1, 0) if(_cameraType == LANDOBJECT) D3DXMatrixRotationY(&T, angle);

// Для летающих объектов выполняем вращение // относительно верхнего вектора if(_cameraType == AIRCRAFT) D3DXMatrixRotationAxis(&T, &_up, angle);

// Поворот векторов _right и _look относительно // вектора _up или оси Y D3DXVec3TransformCoord(&_right, &_right, &T); D3DXVec3TransformCoord(&_look, &_look, &T); }

void Camera::roll(float angle) { // Вращение только для летающих объектов if(_cameraType == AIRCRAFT) { D3DXMATRIX T; D3DXMatrixRotationAxis(&T, &_look, angle);

// Поворот векторов _up и _right относительно // вектора _look D3DXVec3TransformCoord(&_right, &_right, &T); D3DXVec3TransformCoord(&_up, &_up, &T); } }



Содержание раздела