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


Интерфейсы и классы - часть 18


C3dFrame* pRef) f

ASSERT(m_pIFrame) ;

// Создать передний вектор C3dVector d(dx, dy, dz);

80

Глава З. Интерфейсы и классы

// Сгенерировать верхний вектор C3dVector u = d.GenerateUpO;

SetDirection(d.x, d.y, d.z, u.x, u.y, u.z, pRef);

}

Класс C3dVector содержит ряд функции для генерации верхних векторов, благодаря которым работа с классом упрощается до предела. Мне это нравится.

Во всех функциях для определения положения и ориентации присутствует обязательный аргумент — эталонный фрейм (pRef в приведенном выше примере). Он чрезвычайно важен, поскольку ваш фрейм может находиться в произвольном месте иерархии фреймов, а его положение определяется его собственным преобразованием вместе с преобразованиями всех родительских фреймов. Это напоминает бег по кухне; если перенести ваш дом из Вашингтона в Колорадо, вы все равно сможете бегать по кухне, но ваше положение на планете при этом изменится. Другими словами, любые перемещения происходят по отношению к некоторому эталонному фрейму. Для удобства можно передать вместо эталонного фрейма NULL, и тогда за эталон будет принят фрейм-родитель. Примером использования эталонного фрейма служит функция из файла SdlnCtlr.cpp, которая позиционирует объекты в макете по мере того, как пользователь перемещает их с помощью клавиатуры, мыши или джойстика:

void C3dPosCtlr::OnUpdate(_3DINPUTSTATE& st,

C3dFrame* pFrame) {

// Получить указатель на сцену, которая будет

// использоваться

// в качестве эталона при определении положений

// фреймов и т. д.

ASSERT(m_pWnd) ;

C3dStage* pStage = m_pWnd-»GetStage () ;

ASSERT(pStage) ;

double x, y, z;

pFrame-»GetPosition (x, y, z, pStage);

x += st.dX * 0.1;

y += st.dY * 0.1;

z += st.dZ * 0.1;

pFrame-»SetPosition (x, y, z, pStage);

C3dVector d, u;

pFrame-»GetDirection (d, u, pStage);

// Повернуть вектор направления и верхний вектор double a = 3.0;

C3dMatrix r;

r.Rotatef-st.dR * a, -st.dU * a, -st.dV * a) ;

d = r * d;

u = r * u;

pFrame-»SetDirection (d, u, pStage);

}

Библиотека классов SdPlus '^Ш 81




Начало  Назад  Вперед



Книжный магазин