Я пытаюсь реализовать камеру в стиле FPS, обновив три вектора: EYE, DIR, UP. Эти векторы совпадают с используемыми gluLookAt (поскольку gluLookAt определяется положением камеры, направлением, на которое она смотрит, и вектором вверх).
Я уже реализовал движения влево-вправо и вверх-вниз, но у меня большие проблемы с пониманием математики, стоящей за тем, чтобы камера оглядывалась, оставаясь неподвижной. В этом случае вектор EYE остается прежним, а я должен обновить DIR и UP.
Ниже приведен код, который я пробовал, но он не работает должным образом. Какие-либо предложения?
void Transform::left(float degrees, vec3& dir, vec3& up) {
vec3 axis;
axis = glm::normalize(up);
mat3 R = rotate(-degrees, axis);
dir = R*dir;
up = R*up;
};
void Transform::up(float degrees, vec3& dir, vec3& up) {
vec3 axis;
axis=glm::normalize(glm::cross(dir,up));
mat3 R = rotate(-degrees, axis);
dir = R*dir;
up = R*up;
};
Метод rotate создает матрицу вращения, которая поворачивает на количество градусов вокруг оси.
--
РЕДАКТИРОВАТЬ: я отредактировал это (также переключив «dir» на «center»), но это все равно не сработало. При попытке повернуть влево/вправо ничего не происходит. Когда я пытаюсь повернуть вверх/вниз, объект исчезает.
void Transform::left(float degrees, vec3& center, vec3& up) {
center = center*rotate(-degrees,glm::normalize(up));
}
void Transform::up(float degrees, vec3& center, vec3& up) {
vec3 axis = glm::normalize(glm::cross(center,up));
center = center*rotate(-degrees, axis);
}