У меня есть камера от третьего лица, которая смотрит не прямо на игрока, а где-то перед ним.
Когда пользователь входит в режим съемки, я хочу, чтобы камера поворачивала игрока лицом к цели.
На изображении выше. «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;
Однако на приведенной выше диаграмме это не совсем работает, поскольку поворот смещен относительно начала координат.
источник