Обертання камери від третьої людини до цілі


10

У мене є камера третьої людини, яка дивиться не прямо на плеєра, а десь перед ним.

Коли користувач переходить у режим зйомки, я хочу, щоб камера повернулася до плеєра, щоб стикатися з ціллю.

приклад того, про що я говорю

На зображенні вище. "O" - гравець (походження), "L" - це вигляд, "C" - положення камери, "T" - ціль. Я хочу обертати вигляд лінії C-> L, щоб вона проходила повз T (C '-> L' -> T ') навколо Походження ("O").

В основному мені потрібно знайти альфа кута, який я поставив червоним кольором на малюнку.

Я зберігаю положення своєї камери в такій структурі:

struct CameraTarget {
     Quaternion absoluteRotation;
     Vec3 absolutePosition;
     Vec3 cameraOffset;
     Vec3 lookatOffset;
     float FOV;
}

Тож якби я міг знайти кут, який шукаю, я міг би зробити щось на кшталт:

cam->absoluteRotation = cam->absoluteRotation * alpha;

Щоб гравець завжди дивився на ціль.

Якби огляд проходив повз Походження, я міг би просто зробити

Vec3 origDir = cam->lookAtOffset - cam->absolutePosition;
origDir.normalize();
Vec3 newDir = cam->target - cam->absolutePosition;
newDir.normalize();
Quaternion q(origDir, newDir); // from->to
cam->absoluteRotation = cam->absoluteRotation * q;

Однак на діаграмі вище це не дуже спрацьовує, оскільки обертання зміщене від Походження.

Відповіді:


1

Відповідаючи на себе, чи допоможе хтось комусь іншим:

SFDKT має правильне уявлення про проекцію цільової точки в поточний напрямок погляду камери.

Однак моєю найбільшою проблемою був пошук цього пункту П. Виявилося, що трохи тригонометрії вдалося вирішити це.

Розглядаючи трикутник, утворений трьома точками CPO:

  1. Оскільки я знаю довжини LO, OC та CL, я можу обчислити кут при C.

  2. Тепер я знаю кут C і довжину OC і PO. Використовуючи закон синусів, ви можете знайти кут на O. (я вважав цей веб-сайт дуже корисним для пошуку відсутніх кутів)

  3. Тоді я можу знайти останній відсутній кут P і знову використати закон Синеса, щоб знайти довжину CP.

  4. Візьміть напрямок огляду posC + нормалізований (CL) * lengthCP дає мені позицію P.

  5. Після того, як я отримав PI, можна обчислити найкоротший обертання між ОП та ОТ, що дає мені кватерніон, який мені потрібно обертати камерою.

У мене були проблеми з небажаним коченням в 3D, але я просто вирішив проблему з Z = 0, потім розраховував обертання відсутнього кроку, щоб підтримувати вектор камери прямо.


0

ця картина додає симетрії, необхідної для вирішення питання простіше.

введіть тут опис зображення

Просто проектуйте Lуздовж вектора CLтак, щоб |P-O|=|T-O|.

Тепер це, очевидно, лише два однакових трикутника ( CPOі C'TO), обернених на потрібний кут. IEang(OT)-ang(OP)

C'і L'обидва такі ж, як Cі Lпісля обертання, приблизно O, на однакову кількість.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.