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.


⇐ Предыдущая| |Следующая ⇒