Константа 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
, что является максимально допустимой угловой разницей между двумя векторами ...