Kuaterniyonlar ve dünya ekseni etrafında dönme


11

Yasal Uyarı: Ben profesyonel bir oyun programcısıyım ve çoğu gün quaternions kullanıyorum ama onlar bana kara büyü yakın. Ben nispeten matematikle evde yaşıyorum ama hayali sayılar beni her zaman karıştırdı. Kuatları faydalı olarak tedavi etme eğilimindeyim ve çarpmaları bir kereden fazla tersine çeviriyorum. Onları sınırlı bir başarıya sahip matrislerle yaptığım gibi düşünmeye çalışıyorum.

Neyse ....

Beni şaşırtan şey şu. Bir nesneyi yerel ekseni etrafında döndürmek istediğimde, döndürmesini uygulamak istediğim dönüşü temsil eden kuaterniyonla çarparım. Bu nedenle yerel alanda bir rotasyondur.

Şimdi onu dünya uzayındaki bir eksen etrafında döndürmek istersem, akıl yürütmem şu olurdu: Dünya uzayındaki dönüşü bir kuaterniyon olarak alın. Nesne döndürme işlemimin tersini bu kuaterniyonla çarp. Bu benim dünya rotasyonumu yerel alana getirecek. Rotasyonumu bu yeni kuaterniyonla çarp. ie: newRot = oldRot * (ters oldRot * worldRot)

Ancak, ne yapmam gerekir newRot = oldRot * (ters oldRot * worldRot) * oldRot.

Neden ters quat ile çarptıktan sonra hala uygulamadan önce kendi quat ile çarpmam gerekiyor? Mükemmel bir geçerli sebep olması gerektiğini biliyorum, ama bundan kurtulmam için sebep olamaz ve bu benim için çok sinir bozucu. Çeşitli SSS'leri ve ne olduğunu denedim, ama çoğu matematikte derinlere inerek benim için daha az netleştirdi.

Bana 5 yaşındaymışım gibi açıklayabilecek biri var mı?


Matris çevirileri ve rotasyonlar gibi değil mi (yani, nesneyi merkeze taşımanız, döndürmeniz ve daha sonra kendi etrafında bir öğeyi döndürmek istediğinizde geri hareket etmeniz gerekir: Minv_transl * Mrot * Mtransl)
Valmond

I try to reason about them like I would with matrices- o zaman doğru yoldasınız. Matrisleri kullanarak nesnenin eksenleri ve dünya eksenleri etrafında nasıl döneceğini anladıysanız, kuaterniyonları kullanarak da aynısını yapabilirsiniz. Çarpma sırası hem matrisler hem de kuaterniyonlar için aynıdır.
Maik Semder

Yanıtlar:


11

Kuaterniyonlar ilişkilidir:

çözümünüzün:

newRot = oldRot * (inverse oldRot * worldRot) * oldRot

ki aynı:

newRot = oldRot * inverse oldRot * worldRot * oldRot

ki aynı:

newRot = identity * worldRot * oldRot
newRot = worldRot * oldRot

bu da sizi gerçekten olanlara geri getirir:

localTransformed = oldRot * rot
worldTransformed = rot * oldRot

Uygulama sırası değişiyor, hepsi bu. Matrislere geri dönersek, bir dönüşüm matrisine bir nesne matrisi uyguladığınızda ve bunu yeni nesne matrisiniz olarak sakladığınızda, bu sizin yerel uzay dönüşümünüzdür. Dönüştürme matrisini nesne matrisine uygulayıp sakladığınızda, bu sizin dünya dönüşümünüzdür. Her şey uygulama sırası ve daha fazlası ile ilgili.


1
İlk bölüm için +1, ikinci bölüm biraz yanıltıcı. 'LocalRot' ve 'worldRot' yerine yalnızca son kod örneğinde 'rot' kullanırsanız, örnek daha net olur. Aksi takdirde çürüklerin kendisinin nasılsa farklı olduğunu ima eder . Ancak fark, farklı kuaterniyonlardan ('localRot' ve 'worldRot') değil, yalnızca gösterdiğiniz gibi çarpma sırasında yatar. 'localTransformed' ve 'worldTransformed' şu ​​şekilde daha iyi olur: 'rotatedAroundLocalAxis' ve 'rotatedAroundWorldAxis'. Bu, denklemleri açıklar ve bazı paragrafları olan son paragrafı eski yapar.
Maik Semder

Son paragraftaki kusurlar: matris ve dönüşüm arasındaki ayrım (her ikisi de burada aynı ve değiştirilebilir, bu nedenle karışıklığı önlemek için sadece matris kullanmak daha iyidir) ve "yerel alan dönüşümü" ve "dünya dönüşümü" terimleri: daha fazla olurdu söylemek gerekirse, ilk denklem size nesnenin yerel ekseni etrafında döndürüldükten sonra 'yerel-dünya matrisi' verirken, ikinci denklem size dünya ekseni etrafında döndürüldükten sonra 'yerel-dünya matrisi' verir. Her iki durumda da, elde ettiğiniz basitçe 'yerel-dünya matrisi'dir. Ancak, ilk bölüm analiz için + 1'ime sahip.
Maik Semder

+1 @Maik belki dönüşler ile çarpma sırası sorunu arasındaki ilgisizliği daha da netleştirmek için ayrı bir cevap yazabilirsiniz? Her iki şekilde de yorum için teşekkürler!
Max Dohme

Ah, şimdi mantıklı. Kuaterniyon çarpımının çağrışımsal olduğunu bilmiyordum (ah, bu SSS'lerdeydi), bu yüzden gerçekten dönme ve bunun tersini iptal et, bana ihtiyacım olan içgörüleri sağladım, biri sağda bir tane ve biri sol 'temel alanda döndürme uygula' ya da 'yerel alanda döndürme uygula' diyen sol… matrislerden farklı değil. Gördüğünüzde oldukça basit! Teşekkürler!
Kaj
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.