Вращение камеры третьего лица в направлении цели

У меня есть камера третьего лица, которая не смотрит прямо на игрока, а где-то впереди.

Когда пользователь переходит в режим съемки, я хочу, чтобы камера поворачивала проигрыватель, чтобы противостоять цели.

пример того, о чем я говорю

На изображении выше. «O» - это игрок (Origin), «L» - это lookat, «C» - позиция камеры, а «T» - цель. Я хочу повернуть линию поиска C-> L так, чтобы она проходила через T (C '-> L' -> T ') вокруг Origin ("O").

В принципе мне нужно найти угол альфа, который я нарисовал красным на картинке.

Я сохраняю положение камеры в такой структуре:

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

Итак, если бы я мог найти угол, который я ищу, я мог бы сделать что-то вроде:

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

Чтобы игрок всегда смотрел на цель.

Если lookat проходил мимо Origin, я мог просто сделать

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;

Однако на приведенной выше диаграмме это не совсем работает, поскольку вращение смещено от Origin.

10 голосов | спросил Matchoc 20 MaramFri, 20 Mar 2015 01:12:43 +03002015-03-20T01:12:43+03:0001 2015, 01:12:43

2 ответа


1

Отвечая на вопрос, сможет ли кто-нибудь когда-нибудь однажды:

SFDKT имеет правильное представление о проецировании целевой точки в текущее направление просмотра камеры.

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

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

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

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

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

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

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

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

ответил Matchoc 16 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 16 Sep 2015 18:25:50 +0300 2015, 18:25:50
0

это изображение добавляет симметрию, необходимую для решения вопроса легче.

введите описание изображения здесь>> </p>

<p> Просто проект <code>---- +: = 0 =: + ----</code> вдоль вектора <code>---- +: = 1 =: + ----</code>, чтобы <code>---- +: = 2 =: + ----</code>. </p>

<p> Теперь это, очевидно, только два одинаковых треугольника (<code>---- +: = 3 =: + ----</code> и <code>---- +: = 4 =: + - -</code>), повернутый на нужный угол. И.Е. <code>---- +: = 5 = + ----</code> </p>

<p> <code>---- +: = 6 =: + ----</code> и <code>---- +: = 7 =: + ----</code> оба то же, что и <code>---- +: = 8 =: + ----</code> и <code>---- +: = 9 =: + ----</code> после поворота , около <code>---- +: = 10 =: + ----</code>, на ту же сумму. </p></body></html>

ответил DSWFB 3 J000000Friday15 2015, 19:59:58

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132