Почему моя камера FPS катится?Использование эйлеровых углов (не кватернионов) Реализация в Python - PullRequest
0 голосов
/ 26 февраля 2019

Я пытаюсь сгенерировать матрицу вида, которая будет вести себя как камера FPS, но вместо этого я получаю результат.Я делюсь своим кодом на Python, если кто-то может определить, в чем проблема:

1 Ответ

0 голосов
/ 26 февраля 2019

Абстрактно, ваша проблема в том, что повороты, вызванные тангажом и рысканием, не замыкаются под композицией.

Более конкретно: представьте себе, что вы управляете камерой от первого лица.Посмотрите вниз, затем поверните налево и направо.Ваш взгляд будет двигаться совсем иначе, чем если бы вы поворачивались, глядя прямо перед собой.Ваши вычисления, однако, ведут себя так, как будто камера будет вести себя одинаково.

Каждый тик, вы умножаете view справа на матрицу рыскания, затем на матрицу высоты тона.Это означает, что через некоторое время ваша матрица вида станет чередующимся произведением множества матриц высоты и рыскания.Однако матрицы высоты тона и рыскания не коммутируют.На самом деле вы хотите, чтобы все матрицы высоты звука были слева от всех матриц рыскания (или справа, в зависимости от того, позволяете ли вы матрице вида работать слева или справа, и от того, представляет ли ваша матрица вид для представления).-global или глобальное преобразование для просмотра).

Так что быстрое решение этой проблемы - написать view = yrot @ view @ xrot.Таким образом, все ваши y-повороты заканчиваются слева от ваших x-поворотов, и все будет хорошо.Ну, по крайней мере, какое-то время, но тогда ваша матрица представления может в конечном итоге накапливать ошибки округления, и представление может стать свернутым или искаженным или хуже.

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

...