GluLookAt векторы и камера в стиле FPS
Я пытаюсь реализовать камеру в стиле 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' на 'центр', также), но это все еще не работало. Когда я пытаюсь повернуть влево / вправо, ничего не происходит. Когда я пытаюсь повернуть вверх / вниз, объект исчезает.
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);
}
1 ответ
Метод rotate() не определен, кажется, вы забыли его реализовать. И это, кажется, вращение вокруг произвольной оси, вы можете реализовать это из уравнения http://upload.wikimedia.org/math/f/b/a/fbaee547c3c65ad3d48112502363378a.png
(Матрица вращения от оси и угла) из вики http://en.wikipedia.org/wiki/Rotation_matrix
Код:
mat3 Transform::rotate(const float degrees, const vec3& axis) {
glm::mat3 m3;
glm::mat3 I(1.0f,0.0f,0.0f,0.0f,1.0f,0.0f,0.0f,0.0f,1.0f);
glm::mat3 T(axis.x*axis.x, axis.x*axis.y, axis.x*axis.z,axis.y*axis.x, axis.y*axis.y, axis.y*axis.z,axis.z*axis.x, axis.z*axis.y, axis.z*axis.z);
glm::mat3 A(0.0f,-axis.z, axis.y, axis.z, 0.0f, -axis.x,-axis.y,axis.x,0.0f);
m3 = glm::cos(degrees)*I + (1.0f-glm::cos(degrees))*T + glm::sin(degrees)*A; return m3;}