void roll(float angle): // roll it // накреняем камеру
void pitch(float angle): // increase the pitch // увеличиваем тангаж камеры
void yaw(float angle): // yaw it
// рыскаем камерой
void slide(float delU. float delV. float delN): // slide it
// передвигаем камеру (скользим)
void setShape(float vAng. float asp. float nearD, float farD):
}:
В листинге 7.1 приведено основное определение класса Camera. В этом определении содержатся поля для точки eye и направлений u, v, п. Point3 и Vector3 - это базовые типы данных, определенные в приложении В. Кроме того, там имеются поля для описания формы отображаемого объема: viewAngle, aspect, nearDist, farDist.
Листинг 7.2. Служебные подпрограммы set() и setModelViewMatrixO void Camera :: setModelViewMatrix(void) {
// load model view matrix with existing camera values // загружаем матрицу моделирования-вида // существующими для камеры величинами float m[16 ]:
Vector3 eVec(eye.x. eye.у. eye.z): // a vector version of eye // векторная форма eye
m[0] - u.x: m[4] - u.y; m[8] - u.z: m[12] --eVec.dot(u):
m[l] - v.x: m[5] - v.y; m[9] - v.z: m[13] --eVec.dot(v):
m[2] - n.x: m[6] - n.y: m[10] - n.z: m[14] --eVec.dot(n):
m[3] - 0: m[7] - 0: m[ll] - 0: m[15] - 1.0;
продолжение^
Трехмерный просмотр
Листинг 7.2 (продолжение)
glMatrixMode(GL_MODELVIEW):
glLoadMatrixf(m): // load OpenGL's model view matrix // загружаем матрицу моделирования-вида OpenGL }
void Camera:: set(Point3 Eye. Point3 look. Vector3 up) {
// create a model view matrix and send it to OpenGL // создаем матрицу моделирования-вида // и отправляем ее в OpenGL
eye.set(Eye): // store the given eye position // записываем полученную позицию eye
n.set(eye.x - look.x. eye.y - look.y, eye.z - look.z): //make n
// устанавливаем n
u.set(up.crossCn)): // make u -up X n // устанавливаем u =up X n
n.normalizeO: u.normalize(): //make them unit length // нормируем n и u
v.set(n.crossCu)): // make v =n X u // устанавливаем v =n X u
setModelViewMatrixO: // tell OpenGL // сообщаем OpenGL }
Служебная подпрограмма setModelViewMatrixO связывает матрицу моделирования-вида с OpenGL. Она используется только функциями-членами данного класса и ее 1гужно вызывать после каждого изменения в положении или ориентации камеры. Листинг 7.2 показывает возможную реализацию этой подпрограммы. Она вычисляет матрицу (7.2) на базе текущих значений eye, u, v, n и загружает ее непосредственно в матрицу моделирования-вида с помощью функции glLoadMatrixfO.