Как повернуть вид камеры вокруг точки в OpenGL с помощью gluLookAt - PullRequest
0 голосов
/ 26 сентября 2019

Я пытаюсь использовать функцию gluLookAt, чтобы настроить правильное преобразование вида для положения и ориентации камеры.В моей программе есть сфера с центром в начале координат, и когда нажимаются клавиши со стрелками, камера перемещается (сферически (влево, вправо, вверх и вниз)) вокруг сферы.

Я попытался использовать это преобразование: gluLookAt (xc, yc, zc, 0,0, 0,0, 0,0, 0,0, 1,0, 0,0);

Для проверки его правильности я распечатал три оси.Кажется, это не работает должным образом.Когда я двигаюсь вверх и вниз, кажется, что ось y не двигается.

Можете ли вы помочь понять, что не так с этим преобразованием?

1 Ответ

0 голосов
/ 26 сентября 2019

Константа up вектор неверен!

Когда ваш xc=0,yc=?,zc=0 (то есть когда вы двигаетесь вверх / вниз по оси y), тогда ваш вектор вверх параллелен (анти)в направлении вашего взгляда, что означает, что gluLookAt не может создать 3 перпендикулярных базисных вектора с использованием перекрестного произведения, которое необходимо для построения матрицы преобразования .

В таком случае вектор повышения должен быть другим ... Я обычно использую скалярное произведение

if (dot(a,b)/(|a|.|b|)>0.9)

, чтобы обнаружить близкие (анти) параллельные векторы и установить другой в вашем случае, это упрощеннокак это:

if (fabs(yc*yc)/(xc*xc+yc*yc+zc*zc)>(0.9*0.9)) use different up vector

Вы можете использовать (+/-1,0,0) или (0,0,+/-1), какой из них и какой знак зависит от соглашений вашей системы координат (поэтому ваш взгляд не поворачивается / не отражает / вращается при прохождении через эту особенность).

Порог 0.9 означает:

cos(da) = 0.9
da = acos(0.9)
da = 25.84 deg

, что является максимально допустимой угловой разницей между двумя векторами ...

...