Изящный способ справиться с этим - использовать кватернионы юнитов. Кватернион - это вектор из 4 значений, который кодирует ориентацию в трехмерном пространстве (а не вращение, как утверждают некоторые статьи), а единичный кватернион - это тот, где длина вектора sqrt (x ^ 2 + y ^ 2 + z ^ 2 + w ^ 2) составляет 1,0. Существует ряд математических операций для работы с кватернионами, которые аналогичны использованию матриц для кодирования вращений, с дополнительным бонусом, заключающимся в том, что кватернионы никогда не могут представлять вырожденную ориентацию. Вы можете свободно конвертировать кватернионы в матрицу 3x3 или 4x4, когда вам нужно передать результат в графический процессор.
Ваша проблема в том, что пока вы двигаете камеру, вы вносите небольшой поворот в направлении вверх камеры. Вынуждая камеру заново центрироваться на векторе (0,1,0) на каждой итерации, вы фактически вращаете камеру, а затем фиксируете ориентацию камеры, чтобы она оставалась на поверхности сферы, но когда ваша камера ударяется о На полюсе этой сферы нет хорошего направления, чтобы называть «вверх», и ваша матрица становится единственной и дает вам многоугольники нулевого размера (отсюда и черный экран). Кватернионы имеют возможность интерполировать через эти полюса и выходить на другую сторону очень хорошо, оставляя вас с действительной матрицей всегда. все, что вам нужно сделать, это контролировать "поворот".
Чтобы измерить этот поворот, вы должны прочитать статью Кена Шумейка «Сокращение изгиба волокна» в книге Graphics Gems 4. Он показывает хороший способ измерить этот накопленный поворот и как удалить его, когда он оскорбительный.