Я пытаюсь написать код с вращающимся объектом.
Я реализовал это как:
Вращение вокруг оси X определяется величиной изменения координат Y мыши, а вращение вокруг оси Y определяется величиной изменения координат X мыши.
Этот метод прост и работает нормально до тех пор, пока ось не совпадет с осью Z, короче говоря, происходит блокировка gimble.
Как я могу использовать вращение вокруг оси Z, чтобы избежать блокировки карданного подвеса.
Ответы:
Простое решение - не сохранять ориентацию объекта в виде углов вокруг осей (осей X, Y, Z), как, например, в углах Эйлера.
Сохраните ориентацию объекта в виде матрицы или кватерниона.
Это может вызвать блокировку карданного подвеса, используя углы Эйлера:
Нет карданного замка:
Также нет блокировки карданного подвеса:
Теперь, когда мышь изменяется, умножьте m_orientation на изменение ориентации, возникающее при движении мыши в каждом кадре.
источник
Эта книга (рендеринг в реальном времени) очень мне помогла! Смотрите на страницах 66 и 70. У него очень хорошая графика и объяснение. Кватернионы на странице 72 также! :)
Вращение вокруг произвольной оси
Это рендерит камеру с поворотом, сделанным с помощью мыши:
С помощью мыши вы изменяете рыскание (голову), тангаж и крен.
источник