Saya mencoba menulis beberapa unit test dan menyadari saya tidak tahu bagaimana membandingkan angka empat. Saya perlu tahu apakah dua angka empat mewakili orientasi yang sama (objek akan menghadap ke arah yang sama). Dengan posisi seperti vektor, saya hanya akan membandingkan bagian-bagian dan memeriksa mereka cukup dekat, tetapi untuk angka empat nilai bisa sangat berbeda.
Bagaimana saya bisa membandingkan dua angka empat?
mathematics
edA-qa mort-ora-y
sumber
sumber
q
dan-q
). Cara naif (secara komputasi) akan menerapkan kedua angka empat pada vektor yang sama dan melihat apakah hasil vektornya berbeda ..Jawaban:
Jika dua angka empat Anda
q1
danq2
, mereka mewakili rotasi yang sama jika salah satu dari kedua kondisi ini berlaku:q1
adalah komponen bijaksana kira-kira sama denganq2
ORq1
adalah komponen yang kira-kira sama dengan-q2
Mengetahui hal ini, Anda dapat menulis tester kesetaraan yang cukup sederhana yang sesuai dengan tujuan Anda.
sumber
q
dan-q
mewakili orientasi yang sama (yang diminta), tetapi bukan rotasi yang sama. Ini sangat penting saat interpolasi.q
dan-q
ketika direpresentasikan sebagai operator rotasi sudut-sumbu. Jadi, memang, secara teknis efek dari rotasi ini adalah sama, meskipun operator tidak. Dan, ya, ketika SLERPING, kita harus memastikanq1
danq2
berbaring di belahan yang sama dari S3 hypersphere agar slerp mengambil jalur terpendek.2pi-angle
, jadi itu memutar jauh di sekitar sumbu dinegasikan. Kadang-kadang inilah yang Anda inginkan; itu hanya sesuatu yang harus diperhatikan,q1 dot q2 > 0
hasil dalam belokan pendek,q1 dot q2 < 0
mengambil belokan panjang.Hanya karena belum disebutkan. Karena angka empat yang digunakan untuk orientasi spasial selalu satuan panjang (atau seharusnya), berikut ini juga akan berfungsi.
di mana EPS adalah beberapa faktor fudge untuk memungkinkan kesalahan kecil karena presisi floating point terbatas. Jika (dan hanya jika) kedua angka empat mewakili orientasi yang sama
q1 = +- q2
, maka , dan dengan demikianq1.dot(q2) = +- 1
. Jika Anda ingin memastikan mereka rotasi yang sama (bukan hanya orientasi), lalu hapusabs
.sumber
Kuasi disimpan sebagai 4 mengapung atau ganda, sering disebut x, y, z dan w, di mana tiga yang pertama mewakili suatu sumbu dan w tingkat rotasi di sekitar sumbu itu.
Pendekatan yang naif adalah dengan hanya membandingkan angka-angka dari dua angka empat untuk kesetaraan. Namun, karena perhitungan floating point melibatkan kesalahan, Anda setidaknya harus menggunakan kesalahan, sering disebut eps (untuk epsilon) dan membandingkan setiap komponen seperti
Tes yang lebih baik adalah menghitung titik produk dari dua angka empat dan menguji apakah mendekati 1.0. Anda harus melihat persamaan angka empat dengan dosa dan cos dan hanya menunjukkan dua angka empat, maka Anda harus siap melihat mengapa ini bekerja.
sumber
Berdasarkan semua saran untuk menggunakan Dot dan eps saya menemukan bahwa menggunakan (dalam kesatuan):
bekerja dengan baik tanpa saya harus membuat keputusan untuk ukuran eps.
sumber