Поворот камеры от третьего лица к цели


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 имеет правильное представление о проекции целевой точки в текущем направлении обзора камеры.

Тем не менее, моей самой большой проблемой было нахождение этой точки P. Оказалось, что тригонометрию удалось решить.

Учитывая треугольник, образованный тремя точками CPO:

  1. Поскольку я знаю длины LO, OC и CL, я могу рассчитать угол в C.

  2. Теперь я знаю угол C и длину OC и PO. Используя закон синусов, вы можете найти угол в О. (я нашел этот сайт очень полезным для поиска недостающих углов)

  3. Затем я могу найти последний отсутствующий угол P и снова использовать закон синусов, чтобы найти длину CP.

  4. Взять направление взгляда posC + нормализованный (CL) * длинаCP дает мне положение P.

  5. Когда у меня есть PI, я могу рассчитать кратчайшее вращение между OP и OT, что дает мне кватернион, необходимый для вращения моей камеры.

У меня была небольшая проблема с нежелательным креном в 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.