Kapan angka empat harus digunakan untuk mewakili rotasi dan penskalaan dalam 3D?

13

Quaternions (ekstensi bilangan kompleks empat dimensi) dapat digunakan untuk merepresentasikan rotasi dan penskalaan vektor 3D, dan penerapan angka empat pada vektor 3D melibatkan dua perkalian angka empat, sehingga membutuhkan operasi yang lebih sedikit daripada perkalian dengan matriks transformasi yang sesuai. Namun, matriks transformasi linear dan affine sering digunakan sebagai gantinya, terutama dalam kode shader.

Kapan tepat dan disukai (karena kecepatan, stabilitas, dll.) Untuk menggunakan angka empat untuk mewakili penskalaan dan rotasi dalam tiga dimensi, alih-alih matriks transformasi yang sesuai?

es1024
sumber

Jawaban:

8

Saya ingin memulai dengan kesalahpahaman:

GPU modern (NVIDIA cukup lama, dan AMD sejak Southern Islands) tidak mendukung operasi vektor / matriks secara native dalam perangkat keras. Mereka adalah arsitektur vektor dalam arah yang berbeda: setiap komponen vektor (x, y, z) umumnya bernilai 32- atau 64, berisi nilai untuk setiap elemen dalam jalur. Jadi produk 3D dot biasanya bukan instruksi, itu adalah gandakan dan dua gandakan.

Selain itu, menghitung operasi primitif seperti multiply-add, mengubah vektor dengan angka empat lebih mahal daripada mengubah vektor dengan matriks. Mengubah vektor dengan matriks 3x3 adalah 3 kali lipat dan 6 kali lipat, dan mentransformasikan vektor dengan angka empat adalah dua kali lipat angka empat, yang masing-masing terdiri dari 4 kali lipat dan 12 kali lipat menambahkan. (Anda bisa mendapatkan lebih sedikit naif dari ini — ini adalah penulisan pada cara yang lebih cepat — tapi itu masih tidak semurah mengalikan vektor dengan matriks.)

Namun, kinerja tidak selalu ditentukan hanya dengan menghitung jumlah operasi ALU yang dilakukannya. Kuasi membutuhkan lebih sedikit ruang daripada matriks yang setara (dengan asumsi Anda hanya melakukan rotasi / skala murni), dan itu berarti lebih sedikit ruang penyimpanan dan lalu lintas memori yang lebih sedikit. Ini sering penting dalam animasi (yang juga nyaman sering di mana sifat interpolasi yang bagus dari angka empat muncul).

Selain itu:

  • Matriks menggunakan lebih banyak ruang karena mereka mendukung lebih banyak operasi. Matriks 3x3 dapat berisi skala tidak seragam, condong, refleksi, dan proyeksi ortogonal.
  • Matriks dapat secara alami dianggap sebagai vektor basis, dan mudah dibangun dari vektor tersebut.
  • Mengalikan satu angka empat dengan yang lain (menyusun dua rotasi) lebih sedikit operasi daripada mengalikan satu matriks dengan yang lain.
John Calsbeek
sumber
Lucu, dan pada Intel Haswell, DP3instruksi GPU ARBfp tampaknya diimplementasikan sebagai 3 kali lipat dan 2 tambahan, lihat INTEL_DEBUG=fsoutput dari driver Intel Linux: paste.ubuntu.com/23150494 . Tidak yakin apakah itu hanya driver yang buruk atau HW benar-benar tidak memiliki petunjuk mul vektor khusus.
Ruslan
@ Ruslan Sangat mungkin bahwa perangkat keras tidak memiliki petunjuk mul vektor khusus. Lebih tepatnya, mereka melakukannya , tetapi mereka di-vektor di sepanjang lebar SIMD arsitektur (jalur), tidak di-vektor di seluruh dimensi vec3 / vec4.
John Calsbeek
4

(Banyak informasi di sini aku tanpa malu meminjam dari jawaban joojaa dan ratchet freak, dengan beberapa catatan milikku sendiri.)

Keuntungan Matriks

  • Penskalaan dan rotasi yang tidak seragam, miring, proyeksi
  • Terjemahan (kecuali menggunakan angka empat ganda)
  • Dukungan perangkat keras asli
  • Kuarter sering membutuhkan fungsi transendental untuk dibangun
  • Lebih mudah dipahami

Keuntungan Quaternion

  • Mengubah vektor membutuhkan operasi yang lebih sedikit (Atau tidak - Lihat jawaban John)
  • Mengubah oleh quat lain membutuhkan lebih sedikit operasi
  • Quaternions menempati 4 float, (8 jika dual), tetapi Matriks menempati 9-16 float

Jika Anda tahu Anda hanya akan melakukan transformasi tubuh kaku yang seragam, pasangan vektor / quat biasanya merupakan kemenangan solid pada matriks 3x4 dalam hal ruang penyimpanan (vektor / quat: 7 atau 8 float vs mat3x4: 12 floats) dan kecepatan pemrosesan. Jika Quaternions masih voodoo mistis bagimu, coba seri web ini pada mereka .

Jorge Rodriguez
sumber
3

Matriks menawarkan lebih banyak kemungkinan transformasi daripada angka empat, dimungkinkan untuk memiringkan, membuat cermin, dan tidak menskalakan matriks secara seragam. Tidak ada yang menyatakan Anda tidak dapat membuat mesin Anda melakukan hanya transformasi berbasis angka empat, jika Anda tidak memerlukan fitur transformasi tambahan.

Matriks hanya sangat nyaman ketika Anda perlu membangun ruang di mana Anda tahu vektor basis. Seperti ketika melakukan proyeksi ke dalam ortografi. Melakukan transformasi perspektif dalam ruang matriks juga mudah. Matriks lebih unggul dalam hal memproyeksikan barang.

Matriks biasanya digunakan karena mereka mewakili denominasi yang paling umum dan tidak terlalu rumit untuk dikuasai dan dipahami. Manfaat standardisasi jauh melebihi manfaat yang Anda peroleh dari alur kerja kustom. Sudah terkenal bagaimana melakukan operasi matriks. Padahal quats bukan sesuatu yang paling bisa langsung diperkenalkan di uni. Tanyakan saja berapa banyak yang tahu bagaimana membalik angka empat, sedangkan Anda tidak menemukan banyak siswa di pendidikan tinggi yang tidak tahu bagaimana membalikkan matriks.

Perhatikan bahwa kartu grafis juga memiliki pipa khusus untuk operasi matriks.

joojaa
sumber
Sebenarnya saya sudah memikirkan hal ini. Ive juga mempermainkan bertanya apa pendekatan lain pemodelan pipa selain matriks dan hierarki quat yang bisa digunakan.
joojaa
3

Angka empat hanya dapat mewakili penskalaan dan rotasi yang seragam sehingga jika Anda membutuhkan hal lain, Anda perlu menambahkan sesuatu untuk mewakili hal itu.

Penerjemahan dapat dilakukan dengan vec3 tambahan tunggal (atau menggunakan angka empat ganda ). Namun scaling dan sheering yang tidak seragam diwakili lebih baik oleh mat4. Transformasi proyeksi (pada dasarnya penskalaan dan swapping yang tidak seragam z dan w) tidak dapat diwakili oleh angka empat.

Kuota memiliki keuntungan besar saat menginterpolasi. Slerp paling mudah dihitung menggunakan angka empat.

Menerapkan angka empat (atau angka empat ganda) tidak dibangun ke dalam GPU sehingga Anda perlu mengimplementasikannya menggunakan operasi vektor. Sebagian besar pustaka angka empat berasumsi bahwa Anda tidak akan menggunakan angka empat untuk mewakili skala sehingga itu sesuatu yang harus diwaspadai.

orang aneh
sumber