Векторы 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» на «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);
}

person Community    schedule 27.10.2012    source источник
comment
Я думаю, что обновления вектора DIR должно быть достаточно. Вектор ВВЕРХ может быть (0,1,0), он автоматически разрешается в направлении, перпендикулярном вектору между ГЛАЗОМ и НАПРАВЛЕНИЕМ.. тем не менее, поправьте меня, если я ошибаюсь.   -  person max    schedule 28.10.2012
comment
Итак, вы говорите, что я должен оставить код как есть, но удалить обновления для вектора вверх? Я попробую и дам вам знать, что произойдет. Спасибо, Макс.   -  person    schedule 28.10.2012
comment
@Max Спасибо за предложение, но оно не сработало. Я обновил его до этого (я переключил каталог с центром): просмотрите редактирование выше.   -  person    schedule 28.10.2012
comment
Параметр градусов указывает, насколько вы хотите повернуться относительно того места, где вы сейчас находитесь?   -  person Vaughn Cato    schedule 28.10.2012
comment
Здесь у меня есть ссылки, объясняющие, что я имел в виду - вам не нужно настраивать вектор ВВЕРХ. stackoverflow.com/questions/3427379/ Кроме того, погуглите и прочитайте результаты gamedev.net. Надеюсь, это ясно для вас.   -  person max    schedule 28.10.2012
comment
@VaughnCato yes — градусы указывают угол поворота.   -  person    schedule 28.10.2012
comment
Какое поведение вы видите?   -  person Vaughn Cato    schedule 28.10.2012
comment
@VaughnCato После моего последнего редактирования попытка повернуть влево/вправо ничего не делает с моей сценой, а попытка повернуть вверх/вниз приводит к исчезновению объекта. Вам подходит трехмерная математика?   -  person    schedule 28.10.2012
comment
Да я не вижу в этом ничего плохого. Пробовали ли вы распечатать свои векторы, чтобы увидеть, как они меняются?   -  person Vaughn Cato    schedule 28.10.2012


Ответы (1)


метод rotate() не определен, кажется, вы забыли его реализовать. И вроде бы вращение вокруг произвольной оси, можно реализовать из уравнения http://upload.wikimedia.org/math/f/b/a/fbaee547c3c65ad3d48112502363378a.png
(матрица вращения относительно оси и угла) из Wiki 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;}
person Hossam El-Rewaidy    schedule 20.11.2012