2009-04-29 3 views
1

В моем приложении перенасыщения я имитирую самолет с камерой. Когда скорость самолета низкая, я намереваюсь, чтобы нос начал указывать на землю, когда камера падает. Моим первым инстинктом было просто изменить шаг, пока он не был направлен вниз на -90 градусов. Однако я не могу просто изменить высоту тона, потому что, если плоскость наклонена на бок или вверх ногами, это будет означать изменение направления к земле.Эквивалент камеры glut glLoadMatrixf

Теперь я пытаюсь сделать грубое моделирование этого, сдвинув «lookAt.y» вниз. Для этого я пытаюсь получить все текущие координаты камеры, которые я использую, чтобы установить камеру (eye.x, eye.y, eye.z, look.x, look.y, look.z, up.x, выше.y, выше.z). Затем вспомните набор с новыми измененными значениями.

Я работал с Camera.cpp и Camera.h, чтобы управлять функциями моей камеры. Их можно найти: here

после добавления методов для получения всех значений, фактически обновляются только значения глаз, когда сделаны различные движения камеры. Я думаю, мой вопрос в том, как получить эти значения.

glLoadMaxtrix вызов этой функции

void Camera :: setModelViewMatrix(void) 

{ // load model view matrix with existing camera values 

    float m[16]; 

    Vector3 eVec(eye.x, eye.y, eye.z); 

    m[0] = u.x; m[4] = u.y; m[8] = u.z; m[12] = -eVec.dot(u); 

    m[1] = 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[11] = 0; m[15] = 1.0; 

look.x = u.y; look.y = v.y; look.z = n.y; 

    glMatrixMode(GL_MODELVIEW); 

    glLoadMatrixf(m); 

} 

Есть ли способ, чтобы получить «глаз», «LookAt» и «до» значений из матрицы здесь? Или я должен сделать что-то еще, чтобы получить эти ценности?

-Спасибо заранее за вашу помощь

+0

Как раз для записи, нос самолета гораздо более вероятно будет направлен вверх, когда скорость будет низкой (вместо того, чтобы указывать вниз). Самолеты используют шаг для управления скоростью и дросселируют, чтобы контролировать высоту (как контрастивные, как это звучит). –

ответ

1

Класса камеры связывание не является фактическим класс OpenGL, но она должна быть достаточно простой, чтобы работать.

Функция цитирует только текущие значения объекта камеры и отправляет их в OpenGL. Если вы посмотрите на функцию набора камеры, вы увидите, как программа вычисляет значения, которые она фактически хранит.

Значение глаза хранится непосредственно. Значение lookAt - это просто значение (eye-n), векторная математика. Значение up является самым сложным, но если я правильно помню свою векторную математику, я считаю, что up = (n cross u).

+0

Это намного ближе, чем раньше. Я написал функцию, которая получает текущую позицию камеры, а затем устанавливает камеру на ту же самую вещь. Когда я использую это, кажется, мерцает между правильным представлением и некоторым представлением, которое, по-видимому, находится прямо за ним. –

+0

Er, oops. Сделал ошибку в значении lookAt. –

+0

Удивительно, это лучше, но теперь оно перевернуто. 180 градусов от правильной ориентации. –