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
- Dapatkan kamera up dan kanan vektor. Perhatikan bahwa mereka harus dinormalisasi.
- Dapatkan vektor dari titik fokus ke kamera (camPosition - Focus). Ini adalah vektor yang akan Anda putar. Sebut saja camFocusVector ini .
- Putuskan seberapa banyak Anda ingin memutar dalam yaw / pitch sehubungan dengan kamera
- Buat dua matriks rotasi. Matriks rotasi pertama akan menggunakan bagian atas kamera sebagai sumbu dan sudut yaw yang Anda putuskan. Matriks rotasi ke-2 akan menggunakan kanan kamera sebagai sumbu dan sudut pitch yang Anda putuskan.
- Sekarang putar camFocusVector dengan matriks rotasi baru. Ini sekarang posisi baru kamera Anda relatif terhadap asal. Kami tentu saja, ingin itu relatif terhadap titik fokus ...
- Tambahkan posisi titik fokus ke camFocusVector . Ini sekarang posisi baru kamera Anda. Terjemahkan kamera Anda sesuai.
- Terakhir, minta kamera untuk fokus pada titik fokus dengan memanggil fungsi lookAt () Anda
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).