Saya memiliki kamera orang ketiga yang tidak melihat langsung ke pemain tetapi di suatu tempat di depannya.
Ketika pengguna memasuki mode pemotretan, saya ingin kamera memutar pemain untuk menghadapi target.
Pada gambar di atas. "O" adalah pemain (Asal), "L" adalah lookat, "C" adalah posisi kamera dan "T" adalah target. Saya ingin memutar garis lookat C-> L sehingga melewati oleh T (C '-> L' -> T ') di sekitar Origin ("O").
Pada dasarnya saya perlu menemukan sudut alpha yang saya masukkan merah pada gambar.
Saya menyimpan posisi kamera saya dalam struktur seperti ini:
struct CameraTarget {
Quaternion absoluteRotation;
Vec3 absolutePosition;
Vec3 cameraOffset;
Vec3 lookatOffset;
float FOV;
}
Jadi jika saya dapat menemukan sudut yang saya cari, saya bisa melakukan sesuatu seperti:
cam->absoluteRotation = cam->absoluteRotation * alpha;
Agar pemain selalu melihat target.
Jika lookat melewati Origin, aku bisa melakukannya
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;
Namun dalam diagram di atas ini tidak berfungsi karena rotasi diimbangi dari Origin.
sumber