Відповіді:
Ви можете розкласти кватерніон на кут нахилу / нахилу / нахилу кутів, але це зазвичай надмірно.
Замість того, щоб складати свої кватерніони так:
cameraOrientation = cameraOrientation * framePitch * frameYaw;
Спробуйте це:
cameraOrientation = framePitch * cameraOrientation * frameYaw;
Тоді він ніколи не створюватиме нахил / нахил і є рівносильним для зберігання посіву та нахилу окремо
framePitch
і frameYaw
float
типи? Також я буду вдячний вам за деякі роз’яснення щодо вашого першого речення.
cameraOrientation
, framePitch
і frameYaw
всі кватерніони (кожен кватерніон - 4 поплавця або парні).
Це проблема, яку я мав деякий час, і я не зміг знайти відповіді, тому думав, що опублікую її тут.
Це насправді досить просто. Як ви, швидше за все, робите обертання, так:
currentDirection * newRotation;
Але робити це так не працює.
newRotation * currentDirection;
Що вам потрібно зробити, це зробити це в першому порядку для обертання вгору і вниз, а в другому порядку для бокових обертань.
Для мене це було так:
if (keyboard.IsKeyDown(Keys.Up))
Direction = Direction * Quaternion.CreateFromAxisAngle(new Vector3(1, 0, 0), TurnSpeed);
if (keyboard.IsKeyDown(Keys.Down))
Direction = Direction * Quaternion.CreateFromAxisAngle(new Vector3(-1, 0, 0), TurnSpeed);
if (keyboard.IsKeyDown(Keys.Left))
Direction = Quaternion.CreateFromAxisAngle(new Vector3(0, 0, 1), TurnSpeed) * Direction;
if (keyboard.IsKeyDown(Keys.Right))
Direction = Quaternion.CreateFromAxisAngle(new Vector3(0, 0, -1), TurnSpeed) * Direction;
З причини цієї причини перший спосіб має обертання відносно поточного напрямку в бік, яке потрібно вгору і вниз, але ви не бажаєте цього для бокових обертів, тому потрібен другий порядок.
Для камери FPS ви, як правило, не хочете котитися і обмежуються +/- 90 градусами крок, тому я просто слідкуватиму за поточним станом, використовуючи кути нахилу та нахилу. Повна потужність кватерніонів не дуже допомагає для цього.
Ви все ще можете перетворити кути нахилу / нахилу в кватерніони та з них, якщо ви хочете перейти між камерою FPS та анімованими камерами, використовуючи інтерполяцію кватерніонного кадра або щось подібне.