Kuaterniyonlar 3B'de dönme ve ölçeklemeyi temsil etmek için ne zaman kullanılmalıdır?


13

Kuaterniyonlar (karmaşık sayıların dört boyutlu bir uzantısı), bir 3B vektörünün dönüşünü ve ölçeklenmesini temsil etmek için kullanılabilir ve bir kuaterniyonun bir 3B vektörüne uygulanması, iki kuaterniyon çarpımını içerir, dolayısıyla karşılık gelen dönüşüm matrisi ile çarpmadan daha az işlem gerektirir. Bununla birlikte, bunun yerine özellikle gölgelendirici kodunda doğrusal ve afin dönüşüm matrisleri kullanılır.

Karşılık gelen dönüştürme matrisi yerine ölçeklendirmeyi ve döndürmeyi üç boyutta temsil etmek için bir kuaterniyon kullanmak ne zaman uygun ve tercih edilebilir (hız, kararlılık vb. Nedeniyle)?


Yanıtlar:


8

Yanılgılarla başlamak istiyorum:

Modern GPU'lar (bir süre NVIDIA ve Southern Adaları'ndan bu yana AMD), donanımda vektör / matris işlemlerini doğal olarak desteklemiyor. Bunlar farklı bir yönde vektör mimarileridir: bir vektörün her bileşeni (x, y, z) genellikle bir şeritteki her eleman için değerler içeren 32 veya 64 değerlidir. 3D nokta ürünü genellikle bir talimat değildir, çarpma ve iki çarpma ekidir.

Ek olarak, çarpma-ekleme gibi ilkel işlemleri saymak, bir vektörü bir kuaterniyonla dönüştürmek, bir vektörü bir matrisle dönüştürmekten daha pahalıdır. Bir vektörü 3x3 matrisiyle dönüştürmek 3 çarpı ve 6 çarpma eklentisidir ve bir vektörü bir kuaterniyonla dönüştürmek, her biri 4 çarpma ve 12 çarpma ilavesinden oluşan iki kuaterniyon çarpımıdır. (Bundan daha az naif olabilirsiniz - işte daha hızlı bir şekilde bir yazma - ama yine de bir vektörü bir matrisle çarpmak kadar ucuz değil.)

Ancak, performans her zaman gerçekleştirdiği ALU işlemlerinin sayısını sayarak belirlenmez. Kuaterniyonlar, eşdeğer matristen daha az yer gerektirir (yalnızca saf dönüş / ölçek yaptığınızı varsayarsak) ve bu da daha az depolama alanı ve daha az bellek trafiği anlamına gelir. Bu animasyonda genellikle önemlidir (ki bu da kuaterniyonların hoş enterpolasyon özelliklerinin ortaya çıktığı yer).

Ondan başka:

  • Matrisler daha fazla alan kullandıkları için daha fazla alan kullanırlar. 3x3'lük bir matris düzgün olmayan ölçek, eğrilik, yansıma ve dikey projeksiyon içerebilir.
  • Matrisler doğal olarak temel vektörler olarak düşünülebilir ve bu vektörlerden kolayca oluşturulabilir.
  • Bir kuaterniyonu diğeriyle çarpmak (iki rotasyon oluşturmak), bir matrisi diğeriyle çarpmaktan daha az işlemdir.

Komik ve Intel Haswell GPU'da ARBfp'nin DP3talimatı 3 kat ve 2 ek olarak uygulanmış gibi görünüyor, bkz INTEL_DEBUG=fs. Intel Linux sürücüsünden çıktı: paste.ubuntu.com/23150494 . Sadece kötü bir sürücü mü yoksa HW'nin gerçekten özel vektör talimatları olmadığından emin değilim.
Ruslan

@Ruslan Büyük olasılıkla donanımın özel vektör çoklu talimatları içermiyor. Bununla birlikte, daha doğru bir şekilde yaparlar , ancak vec3 / vec4 boyutu boyunca vektörleştirilmemiş, mimarinin SIMD genişliği boyunca (şeritler) vektörlenirler.
John Calsbeek

4

(Burada bir sürü bilgi utanmadan joojaa'nın ve cılız ucubun cevaplarından, kendi notlarımdan ödünç aldım.)

Matris Avantajları

  • Düzgün olmayan ölçekleme ve döndürme, eğriltme, projeksiyon
  • Çeviri (çift dördüncülüğü kullanmadığı sürece)
  • Yerel donanım desteği
  • Kuaterniyonlar genellikle oluşturmak için aşkın işlevler gerektirir
  • Anlaşılması daha kolay

Kuaterniyonun Avantajları

  • Bir vektörü dönüştürmek daha az işlem gerektirir (Veya değil - John'un cevabına bakın)
  • Başka bir quat tarafından dönüştürmek çok daha az işlem gerektirir
  • Kuaterniyonlar 4 şamandıra, (eğer ikili ise 8), Matrisler 9-16 şamandıra işgal eder

Sadece tek tip katı cisim dönüşümleri yapacağınızı biliyorsanız, bir vektör / quat çifti genellikle 3x4 matrisinde depolama alanı açısından sağlam bir kazançtır (vector / quat: 7 veya 8 float vs mat3x4: 12 float) ve işlem hızı. Eğer Kuaterniyonlar hala sizin için mistik bir vudu ise, bu web serisini deneyin .


3

Matrisler, kuaterniyonlardan daha olası dönüşümler sunar, matrisi eğriltmek, aynalamak ve eşit olmayan şekilde ölçeklemek mümkündür. Ek dönüştürme özelliklerine ihtiyacınız yoksa, motorunuzun sadece kuaterniyon tabanlı dönüşümler yapmasını sağlayamayacağınızı belirten hiçbir şey yoktur.

Temel vektörleri bildiğiniz alanlar oluşturmanız gerektiğinde matrisler çok uygundur. Ortografik projeksiyonlar yaparken olduğu gibi. Ayrıca bir matris uzayında perspektif dönüşümü yapmak kolaydır. Matrisler, projeksiyonlar söz konusu olduğunda daha üstündür.

Bir bakıma, matrisler genellikle en yaygın mezhebi temsil ettikleri ve ustalaşmak ve anlamak için çok karmaşık olmadıkları için kullanılır. Standardizasyonun faydaları, özel bir iş akışı oluşturduğunuzdan çok daha fazladır. Matris işlemlerinin nasıl yapılacağı iyi bilinir. Öte yandan, kuatçiler en çok üniversiteye hemen giriş yapan bir şey değildir. Bir kuaterniyonu nasıl tersine çevireceğini kaç kişinin bildiğini sorurken, yükseköğretimde bir matrisi nasıl ters çevireceğini bilmeyen birçok öğrenci bulamazsınız.

Grafik kartlarında ayrıca matris işlemleri için özel borular bulunduğunu unutmayın.


Aslında bunu düşünüyordum. Ayrıca, boruları modellemek için matris ve dörtlü hiyerarşilerden başka hangi yaklaşımların sorulduğunu da sormuştum.
joojaa

3

Bir kuaterniyon sadece tek tip ölçeklendirmeyi ve rotasyonu temsil edebilir, bu nedenle başka bir şeye ihtiyacınız varsa bunu temsil etmek için bir şey eklemeniz gerekir.

Çeviri tek bir ek vec3 (veya çift ​​kuaterniyonlar kullanılarak ) ile yapılabilir. Bununla birlikte, muntazam olmayan ölçeklendirme ve kaplama bir mat ile daha iyi temsil edilmektedir4. Projeksiyon dönüşümleri (esas olarak homojen olmayan ölçekleme ve z ve w değişimi) bir kuaterniyon ile temsil edilemez.

İnterpolasyon sırasında kuaterniyonların büyük bir avantajı vardır. Slerp en kolay quaternions kullanılarak hesaplanır.

Bir kuaterniyon (veya çift kuaterniyon) uygulamak GPU'ya yerleşik değildir, bu yüzden vektör işlemlerini kullanarak bunu uygulamanız gerekir. Çoğu kuaterniyon kütüphanesi, kuaterniyonu ölçeği temsil etmek için kullanmayacağınızı varsaymaktadır, bu yüzden dikkat edilmesi gereken bir şeydir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.