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