Memutar kamera orang ke-3 ke arah target

10

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.

contoh dari apa yang saya bicarakan

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.

Matchoc
sumber

Jawaban:

1

Menjawab pada diri sendiri jika itu membantu orang lain suatu hari:

SFDKT memiliki ide yang tepat tentang memproyeksikan titik target ke arah tampilan kamera saat ini.

Namun, masalah terbesar saya adalah menemukan titik ini P. Ternyata sedikit trigonometri berhasil menyelesaikannya.

Mempertimbangkan segitiga yang dibentuk oleh tiga poin CPO:

  1. Karena saya tahu panjang LO, OC dan CL saya bisa menghitung sudut di C.

  2. Sekarang saya tahu sudut C dan panjang OC dan PO. Menggunakan hukum sinus, Anda dapat menemukan sudut di O. (Saya menemukan situs web ini sangat berguna untuk menemukan sudut yang hilang)

  3. Kemudian saya dapat menemukan sudut P terakhir yang hilang dan menggunakan lagi hukum Sines untuk menemukan panjang CP.

  4. Ambil arah lihat posC + normalized (CL) * lengthCP memberi saya posisi P.

  5. Setelah saya memiliki PI dapat menghitung rotasi terpendek antara OP dan OT yang memberi saya angka empat saya perlu memutar kamera saya.

Saya memang memiliki sedikit masalah dengan roll yang tidak diinginkan dalam 3D tapi saya baru saja menyelesaikan masalah dengan Z = 0 kemudian menghitung rotasi nada yang hilang untuk menjaga vektor kamera tetap lurus.

Matchoc
sumber
0

gambar ini menambahkan simetri yang dibutuhkan untuk menyelesaikan pertanyaan dengan lebih mudah.

masukkan deskripsi gambar di sini

Proyeksikan Lsepanjang vektor CLsehingga |P-O|=|T-O|.

Sekarang jelas hanya dua segitiga identik ( CPOdan C'TO) diputar oleh sudut yang Anda inginkan. YAITUang(OT)-ang(OP)

C'dan L'keduanya sama seperti Cdan Lsetelah berputar, kira-kira O, dengan jumlah yang sama.

DSWFB
sumber