У мене є камера третьої людини, яка дивиться не прямо на плеєра, а десь перед ним.
Коли користувач переходить у режим зйомки, я хочу, щоб камера повернулася до плеєра, щоб стикатися з ціллю.
На зображенні вище. "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;
Однак на діаграмі вище це не дуже спрацьовує, оскільки обертання зміщене від Походження.