Те, про що ви просите, називається обертанням аркболу. Кватерніони - це просте рішення, лише якщо ви розумієте, як вони працюють. Однак ви можете домогтися того ж без кватерніонів.
Попередні реквізити
Ви знаєте, як взагалі обертати об'єкти? Скажімо, у вас є об'єкт біля джерела. Чи знаєте ви, як ви його обертаєте (підказка: помножте на якусь матрицю обертання)? Якщо так, то я припускаю, що ви знаєте, що буде, якщо спершу перекласти об’єкт, а потім повернути його?
Ви повинні знати, як обчислити матрицю обертання від кутової осі (просто, як пиріг, подивіться безліч рівнянь в Інтернеті, багато з них дають вам і код)
Рішення
- Отримайте камери вгору та вправо . Зауважте, що їх слід нормалізувати.
- Дістаньте вектор від точки фокусування до камери (camPosition - Фокус). Це вектор, який ви збираєтесь обертати. Назвемо цей camFocusVector .
- Вирішіть, наскільки ви хочете обертатись у відхиленні / нахилі по відношенню до камери
- Створіть дві матриці обертання. Матриця 1-го обертання використовуватиме камеру вгору як вісь та кут похилу, які ви вирішили. 2-а матриця обертання використовуватиме праворуч від камери як вісь та крок кута , який ви вирішили.
- Тепер оберніть camFocusVector за допомогою нових матриць обертання. Тепер це ваше нове положення камери щодо походження. Ми, звичайно, хочемо, щоб це було відносно точки фокусу ...
- Додайте положення точки фокусування до camFocusVector . Це тепер нове положення камери. Перекладіть відповідним чином свою камеру.
- Нарешті, попросіть камеру зосередитись на точці фокусування, зателефонувавши на функцію lookAt ()
Коваджі
Вам доведеться шукати певні випадки або особливості, коли ваша камера перестане працювати. Наприклад, дивлячись прямо вниз / вгору. Я дозволю вам зрозуміти, як з цим боротися.
EDIT1: Як перерахувати ортонормальні вектори камери
Ви вже знаєте напрямок камери ((cameraPos - focusPoint) .normalize ()). Тепер припустимо, що вгору вашої камери дорівнює + Y (або ж, якщо ваша поточна вісь у світі - це все, що залежить від вас). Тепер просто перетнути напрямок з вгору , щоб отримати право . Зроблено? Ні! Ваш вектор вгору більше не є ортогональним для двох інших. Щоб виправити це, перехресне право з керівництвом , і ви отримаєте свій новий план .
Зауважте, що Грам-Шмідт - це дійсно те, що слід використовувати для ортонормалізації векторів.
Знову зверніть увагу на застереження, оскільки в деяких випадках це не спрацює (наприклад , паралельний напрямку вгору ).