Glut glLoadMatrixf эквивалент камеры
В моем приложении перенасыщения я моделирую самолет с камерой. Когда скорость самолетов низкая, я намерен заставить нос начать указывать на землю, когда камера падает. Моим первым инстинктом было просто сменить высоту, пока она не была направлена вниз на -90 градусов. Однако я не могу просто изменить высоту тона, потому что, если самолет наклонен в сторону или вверх ногами, он будет отмечать изменение направления движения к земле.
Теперь я пытаюсь сделать грубую симуляцию этого, смещая lookAt.y вниз. Для этого я пытаюсь получить все текущие координаты камеры, которые я использую для установки камеры (eye.x, eye.y, eye.z, look.x, look.y, look.z, up.x, up.y, up.z). Затем вызовите набор с новыми измененными значениями.
Я работал с Camera.cpp и Camera.h, чтобы контролировать функции моей камеры. Их можно найти здесь
после добавления методов для получения всех значений только значения глаз фактически обновляются при выполнении различных движений камеры. Я думаю, мой вопрос, как мне получить эти значения.
Вызов 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);
}
Есть ли способ получить значения 'eye', 'lookAt' и 'up' из матрицы здесь? Или я должен сделать что-то еще, чтобы получить эти значения?
-Заранее спасибо за помощь
1 ответ
Класс камеры, на который вы ссылаетесь, не является классом OpenGL, но он должен быть достаточно простым для работы.
Указанная функция просто берет текущие значения объекта камеры и отправляет их в OpenGL. Если вы посмотрите на функцию установки камеры, вы увидите, как программа вычисляет значения, которые она на самом деле хранит.
Значение глаза сохраняется напрямую. Значение lookAt - это просто значение (eye - n) по векторной математике. Значение up является самым сложным, но если я правильно помню векторную математику, я считаю, что up = (n пересекают u).