ПРОГРАМИРУЕМ 3D ГРАФИКУ ИСПОЛЬЗУЯ DirectX



Перемещение объектов - часть 11


BOOL CMainFrame::SetScene() t

// Задать траекторию полета камеры m_vCamera = C3dVector(5, 5, 0);

m_dRadius = 5.0;

// Задать обзорное поле m_pScene-»SetCameraField (1.5) ;

}

Траектория выбирается таким образом, чтобы камера вращалась вокруг заданной точки. На Рисунок 6-7 изображено движение камеры в нашем макете.

Рисунок. 6-7. Траектория полета камеры


Все, что осталось сделать, — организовать совместное перемещение камеры и самолета при каждой итерации:

BOOL CMainFrame::Update(double d)

(

// Обновить положение камеры C3dMatrix r;

r.Rotate(0, 2.0, 0) ;

m vCamera = r * m vCamera;

m_pScene-»SetCameraPosition (m_vCamera) ;

// Задать верхний вектор C3dVector vu(0, 1, 0) ;

// Построить вектор направления C3dVector vf = m_vCamera * vu;

m_p3cene-»SetCameraDirection (vf, vu) ;

// Задать положение самолета относительно камеры r.Rotate(0, 20, 0);

C3dVector vp = r * m vCamera;

m_pPlane-»SetPosition(vp) ;

// Задать направление C3dMatrix rp;

rp.Rotate(0, 0, 10); // Слегка покачаем крьшьями vu = rp * vu;

vf = vp * vu;

m_pPlane-»SetDirection (vf, vu) ;

return m_wnd3d.Update(TRUE);

)

Текущее положение камеры хранится в объекте C3dVector. Для определения ее нового положения вектор умножается на матрицу поворота. Затем камера переносится на новое место — но это еще не все. Необходимо изменить ориентацию камеры, чтобы она по-прежнему была направлена по касательной к окружности. Чтобы вычислить новое направление камеры, мы умножаем (векторно) верхний вектор (vu) на вектор положения камеры (m_vCamera). Вектор-результат совпадает с вектором направления камеры (Рисунок 6-8).

Вычисление вектора направления камеры 148 SUSy Глава 6. Пеоемешение объеет-ов в мякртр


Векторное произведение оказывается очень полезным, когда требуется найти вектор, перпендикулярный плоскости, которая определена двумя другими векторами, как в нашем случае.

Последнее, что осталось сделать, — вычислить положение и направление маленького самолета, летящего перед камерой. Самолет перемещается по той же траектории, что и камера, однако он на несколько градусов опережает камеру. Чтобы определить положение самолета, мы берем вектор положения камеры и поворачиваем его чуть дальше, пользуясь для этого другой матрицей (г). При определении ориентации самолета я сначала вычислял векторное произведение точно так же, как и для камеры. Однако мне показалось, что смотреть на самолет, который идеально ровно летит впереди камеры, довольно скучно. Я слегка повернул вектор вверх, чтобы создать иллюзию покачивания самолета. Эффект не очень впечатляющий, но зато легко реализуемый.




Содержание  Назад  Вперед