Saya sedang menggambar adegan di mana kamera bergerak bebas tentang alam semesta. Kelas kamera melacak titik pandang (atau melihat ), posisi kamera, dan vektor atas. Vektor / titik ini kemudian diteruskan ke gluLookAt.
Pan dan zoom hampir sepele untuk diterapkan. Namun, saya menemukan rotasi tentang tampilan pada titik menjadi lebih banyak masalah. Saya ingin menulis fungsi Camera.rotate yang mengambil 2 sudut, satu yang berputar naik / turun dan yang berputar kiri / kanan di sepanjang bola imajiner yang berpusat tentang tampilan pada titik.
Apakah ada cara mudah untuk melakukan ini?
Saya (secara singkat) telah membaca tentang angka empat, tetapi saya ingin melihat apakah ada solusi yang lebih mudah mengingat konstruksi adegan saya yang relatif sederhana.
Jawaban:
Apa yang Anda minta disebut rotasi Arcball. Pertanyaan adalah solusi mudah hanya jika Anda mengerti cara kerjanya. Anda dapat mencapai hal yang sama tanpa angka empat.
Prasyarat
Apakah Anda tahu cara memutar objek secara umum? Katakanlah Anda memiliki objek pada awalnya. Apakah Anda tahu cara memutarnya (petunjuk: kalikan dengan beberapa matriks rotasi)? Jika ya, maka saya berasumsi Anda tahu apa yang akan terjadi jika Anda menerjemahkan objek terlebih dahulu dan kemudian memutarnya?
Anda harus tahu cara menghitung matriks rotasi dari sudut-sumbu (semudah pie, lihat segudang persamaan online, banyak dari mereka memberi Anda kode juga)
Larutan
Peringatan
Anda harus mencari case atau singularitas tertentu di mana kamera Anda akan berhenti bekerja. Tampak lurus ke bawah / atas misalnya. Saya akan membiarkan Anda mengetahui cara menghadapinya.
EDIT1: Cara menghitung ulang vektor ortonormal kamera
Anda sudah tahu arah kamera ((cameraPos - focusPoint) .normalisasi ()). Sekarang asumsikan bahwa kamera Anda adalah + Y (atau jika sumbu dunia Anda saat ini adalah ... itu terserah Anda). Sekarang cukup lintas arah dengan naik untuk mendapatkan yang benar . Selesai? Nggak! Vektor atas Anda tidak lagi ortogonal dengan dua lainnya. Untuk memperbaiki itu, silang tepat dengan arah dan Anda mendapatkan baru Anda up .
Perhatikan bahwa Gram-Schmidt adalah yang seharusnya digunakan untuk orthonormalize vektor.
Sekali lagi, perhatikan peringatan karena ini akan gagal untuk bekerja dalam beberapa kasus ( arahnya paralel ke atas misalnya).
sumber
normalize(up ^ camFocusVector)
(atau kebalikannya jika kidal).Yang Anda butuhkan adalah kamera ArcBall yang khas, yang pada dasarnya adalah kamera yang menyimpan lokasi target dan memungkinkan Anda untuk memindahkan kamera dengan cara "bulat" di sekitar target itu.
Ada dalam XNA tetapi IIRC Saya telah menggunakan implementasi ini sebelumnya, dan itu bekerja dengan cukup baik:
http://roy-t.nl/index.php/2010/02/21/xna-simple-arcballcamera/
sumber
Inilah kode saya untuk berputar di suatu titik, mendapati diri saya sering menggunakannya kembali.
sumber
Algoritma yang sangat sederhana untuk mencapai ini sangat mengagumkan:
Menjadi P titik pusat tentang Anda ingin memutar (titik "lihat" atau "target"):
Saya menggunakannya dan itu bagus.
Sumber ditemukan di stackoverflow situs saudara: /programming/287655/opengl-rotating-a-camera-around-a-point
sumber