Pertanyaan Cari matriks rotasi OpenGL untuk pesawat, diberikan vektor normal setelah rotasi


Apakah ada cara untuk mendapatkan matriks yang memutar bidang ke orientasi baru, mengingat vektor normalnya yang baru

Gambar berikut menggambarkan apa yang digambarkan

enter image description here


10
2017-11-02 16:15


asal


Jawaban:


Mengingat normal yang lama N dan normal baru N' Anda dapat memperoleh rotasi dengan:

RotationAxis = cross(N, N')
RotationAngle = arccos(dot(N, N') / (|N| * |N'|))

Dimana

  • cross(x, y) adalah produk silang dari vektor x dan y
  • dot(x, y) adalah produk titik dari vektor x dan y
  • |x| adalah panjang vektor x

Ini akan memutar normal lama ke yang baru dengan cara sesingkat mungkin.

Catatan

  • RotationAngle akan berada dalam radian (jika arccos mengembalikan radian seperti pada kebanyakan implementasi)
  • arccos adalah kebalikan dari fungsi kosinus. Itu perlu karena dot(N, N') = |N| * |N'| * cos(RotationAngle) dimana RotationAngle adalah sudut antara vektor.
  • RotationAxis tidak dinormalisasi
  • Jika kedua normalnya dinormalkan, pembagian dilakukan (|N| * |N'|) menjadi tidak perlu (sebenarnya jika N dinormalisasi Anda dapat meninggalkan |N| produk dan jika N' dinormalkan lalu ditinggalkan |N'|)
  • Metode ini akan gagal jika N' = -N (karena ada banyak cara terpendek yang tak terbatas)

Bagaimana cara kerjanya?

Pengamatan pertama adalah bahwa dua normals akan selalu mendefinisikan (setidaknya) satu pesawat di mana keduanya berbohong. Sudut terkecil yang memisahkan mereka akan diukur di dalam pesawat ini juga.

Sehingga RotationAxis vektor akan menjadi normal dari pesawat yang membungkus keduanya N dan N' dan RotationAngle adalah sudut terkecil antara dua yang disebutkan sebelumnya.

Jadi dengan berputar-putar RotationAxis oleh RotationAngle yang lama normal N diputar di dalam pesawat, di jalur terpendek menuju N'.


18
2017-11-02 16:25