Tôi có một máy ảnh người thứ 3 không nhìn thẳng vào người chơi mà ở đâu đó trước mặt anh ta.
Khi người dùng vào chế độ chụp, tôi muốn camera quay xung quanh người chơi để đối mặt với mục tiêu.
Trong hình trên. "O" là trình phát (Xuất xứ), "L" là giao diện, "C" là vị trí camera và "T" là mục tiêu. Tôi muốn xoay dòng lookat C-> L để nó đi qua T (C '-> L' -> T ') xung quanh Origin ("O").
Về cơ bản tôi cần tìm góc alpha mà tôi đặt màu đỏ trong ảnh.
Tôi lưu trữ vị trí máy ảnh của mình trong một cấu trúc như vậy:
struct CameraTarget {
Quaternion absoluteRotation;
Vec3 absolutePosition;
Vec3 cameraOffset;
Vec3 lookatOffset;
float FOV;
}
Vì vậy, nếu tôi có thể tìm thấy góc tôi đang tìm, tôi có thể làm một cái gì đó như:
cam->absoluteRotation = cam->absoluteRotation * alpha;
Để có được người chơi luôn luôn nhìn vào mục tiêu.
Nếu cái nhìn đi qua Nguồn gốc, tôi có thể làm
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;
Tuy nhiên, trong sơ đồ trên, điều này không thực sự hiệu quả do vòng quay được bù từ Nguồn gốc.