OpenGL - камера от первого лица

Боюсь, я испытываю Gimbal lock, когда пытаюсь реализовать камеру от первого лица в OpenGl.

rotateFPS_OY(float angle){
    forward = forward * cos(angle) + right * sin(angle);
    right = forward.CrossProduct(up);

}
rotateFPS_OX(float angle){
    up = up * cos(angle) + forward * sin(angle); 
    forward = up.CrossProduct(right);
}

Позже я вызываю gluLookAt:

    Vector3D center = position + forward;
    gluLookAt(position.x, position.y, position.z, 
              center.x, center.y, center.z,
              up.x, up.y, up.z);

При тестировании кажется, что после нескольких движений камера катится (меняет правый вектор). Расчеты кажутся правильными, я просто не могу сказать, что не так.


person Mihai Neacsu    schedule 01.12.2012    source источник


Ответы (2)


нормализовать векторы после вычисления

person kazatca    schedule 01.12.2012
comment
почему вверх = вверх * cos (угол) + вперед * sin (угол); вперед = вверх.CrossProduct (справа) ?; может быть вперед = forwad cos + up sin; up = forwardXright; но это не решает. - person kazatca; 01.12.2012
comment
Этот способ тоже не сработал, он фактически переворачивает изображение назад и по-прежнему имеет эффект прокрутки. - person Mihai Neacsu; 01.12.2012
comment
Ой. Не вращайте вверх. повернуть вокруг (0,0,1). - person kazatca; 01.12.2012
comment
Не могли бы вы объяснить, как я могу это сделать? - person Mihai Neacsu; 01.12.2012
comment
f1.x = f.x cos-f.y sin; f1.y = f.x sin + f.y cos; f1.z = f.z; f = f1; f вперед; то же самое для правого; вверх = вправоXforward; изменить только rotateFPS_OY - person kazatca; 01.12.2012

Мне удалось успешно реализовать камеру, оставив forward.y и right.y на 0 и вычислив вектор lookAt независимо от векторов вперед / вправо / вверх.

person Mihai Neacsu    schedule 18.12.2012