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



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


Контроллер полета используется для имитации «полета» объекта или камеры внутри макета. Параметры х и у служат для определения углов атаки и крена,

z определяет скорость, а и — угол тонгажа. Идея состоит в том, чтобы привести объект в прямолинейное движение и затем выбирать его траекторию посредством изменения углов атаки, крена и тонгажа. В исходном варианте программы углы крена и атаки умножались на скорость, чтобы имитация получалась более реалистичной. Однако вскоре выяснилось, что пилота из меня не выйдет, поэтому я пошел по более простому пути и допустил изменение ориентации даже для неподвижного объекта. Если вам это покажется нелогичным, попробуйте поработать с текущим вариантом и затем модифицировать его так, чтобы учитывать скорость полета. Что же именно модифицировать, спросите вы? Приведенную ниже функцию, которая находится в файле 3dlnCtlr:

void C3dFlyCtlr::OnUpdate(_3DINPUTSTATE& st,

C3dFrame* pFrame) t

// Определить скорость (по значению параметра z)

double v = st.dZ / 10;

// Получить углы атаки, крена и тонгажа // для осей х, у и и double pitch = st.dY / 3;

double roll = -st.dX / 3;

double yaw = 5t.dU / 5;

// Умножить угол атаки и крена на скорость // для повышения реализма // pitch *= v;

// roll *= v;

pFrame-»AddRotation(l, 0, 0, pitch, D3DRMCOMBINE_BEFORE) ;

pFrame-»AddRotation(0, 0, 1, roll, D3DRMCOMBINE BEFORE);

pPrame-»AddRotation(0, 1, 0, yaw, D3DRMCOMBINE^BEFORE) ;

// Получить вектор текущего направления double xl, yl, zl;

pFrame-»GetDirection (xl, -yl, zl);

// Умножить вектор направления на скорость xl *= v;

yl *= v;

zl *= v;

// Определить текущее положение double х, у, z;

pFrame-»GetPosition (х, у, z);

// Обновить текущее положение х += xl;

У += yl;

z += zl;

/b> ^Р? Глава 6. Перемещение объектов в макете

pFrame-»SetPosition (x, y, z

Функция C3dFlyCtrl::OnUpdate изменяет положение и ориентацию фрейма перемещаемого объекта на основании данных, полученных от устройства ввода. Эта функция вызывается каждый раз, когда требуется обновить положение объекта. Ее аргументами являются описание текущего состояния входного устройства (значения его параметров) и указатель на фрейм, с которым она должна работать. Из всего кода контроллеров и устройств ввода данная функция представляет наибольший интерес, поэтому мы подробно рассмотрим ее.




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