Bir helikopteri kontrol etmek için kuaterniyon kullanabilir miyim?


9

3D'de basitleştirilmiş bir helikopter (şu an için bir küp) simülasyonu yapmaya çalışıyorum ve rotasyonla ilgili bazı sorunlar yaşıyorum. Bir helikopter üç eksen boyunca dönebilir:

  • arka pervaneyi kullanarak kendi kendine dön: y ekseni dönüşü
  • sola veya sağa gitmek için sola ve sağa eğin: z ekseni dönüşü
  • geri veya ileri gitmek için yukarı ve aşağı eğin: x ekseni dönüşü

Her ekseni ayrı ayrı kontrol edebilmem gerekiyor. Şimdiye kadar euler açıları kullanmayı denedim, ama hangi dönme sırasını kullanırsam kullanın, ya bir gimbal kilide ya da bazı eksenlere "yer değiştir" diyorum.

Kuaterniyonları kullanmam gerekiyor gibi görünüyor, ancak her bir ekseni nasıl kontrol edeceğimi bilmiyorum, çünkü quaternions bir yön ve bir açı kullanıyor. Üç kuaterniyon oluşturmalı ve birlikte çarpmalı mıyım? Aynı problemlerle karşılaşmaz mıydım?

Garip olan şey, eğer helikopterimin üç eksenini temsil etmek için parmağımı kullanırsam (başparmak yukarı = y, dizin = z, orta = x), bu problemlerle karşılaşmıyorum. Neden?


Bir sahne grafiğine erişiminiz varsa, geçerli bir alternatif daha sonra tek tek döndürdüğünüz her eksen için iç içe geçmiş konteynerlere sahip olmak olacaktır.
bummzack

@bummzack, evet, bunu düşündüm. Ancak, üç dönme matrisini belirli bir sırada birleştirmekle aynı şey değil mi?
subb

Haklısın @Subb, her eksen için ayrı ayrı dönüşleri saklamaya çalışın, bunun için ne kullanırsanız kullanın, Euler Açıları ile aynı problemlere sahip olacaksınız, ayrıca Matrisler ve Kuaterniyonlar Gimbal Lock'tan muzdarip olacak.
Maik Semder

@Maik Semder, o zaman helikopterimin saha / yaw / rulosuna nasıl kontrol sağlayabilirim?
subb

@ Subb @ Flip's ve cevabım temel olarak bunu nasıl yapacağınızı anlattı.
Maik Semder

Yanıtlar:


4

Helikopterinizin mevcut yönünü saklamak için bir matris veya bir kuaterniyon kullanabilmeniz gerekir. Karşılaştığınız sorun, sahadaki / yaw / roll değişimini helikoptere nasıl uyguladığınızdır.

Sanırım her çerçevede yerel alanda helikoptere saha / yaw / rulo uygulamak istiyorsunuz. Bunu, o çerçeve için eğim / yalpalama / rulodaki değişikliği alarak ve bir döndürme matrisi oluşturarak yapabilirsiniz (bunu euler açılarıyla yapabilirsiniz). Daha sonra helikopterin önceki yönünü bu matrisle döndürürsünüz (önceki yönelim bir matris veya bir kuaterniyon olarak temsil edilir). Size yeni çerçevenin yönünü verecektir.

Helikopterin yönünü bir kuaterniyon olarak temsil etmenin avantajı, kuaterniyonlar arasındaki enterpolasyonun matrisler arasındaki enterpolasyondan çok daha kolay olmasıdır. Gelecekte güncel bir yönelime sahipseniz ve sizi istenen zamanda yeni bir yönelime getirecek kare başına rotasyonu bulmak istiyorsanız, kuaterniyon temsili sizin için daha uygun olabilir.


Bu şekilde yaptım, yerel -> dünya dönüşümünü temsil eden matrise artımlı güncellemeler uygulayın. Matrisi normalleştirmeyi unutmayın, birkaç yüz çerçeveden sonra eğer yapmazsanız yuvarlama eserler gösterecektir.
Patrick Hughes

Ayrıca, x / y / z eksenlerini temsil etmek için elinizi kullanarak gimbal kilit sorununun neden görülmediğine dair son soruyu cevaplamak için, muhtemelen elin yerel çerçevesine perde, sapma ve yuvarlanma değerleri uyguluyorsunuz. referans. Euler açıları ile bir dönme matrisi oluşturmak, dünyanın x'i etrafında, sonra ortaya çıkan y tarafından ve daha sonra elde edilen z ile başlar (gerçek x / y / z sırası sırayla değişebilir). Dönüşleri bu şekilde uygulamayı deneyin, gimbal kilidinin nasıl göründüğünü görmeye başlayabilirsiniz.
Flip

3

Temel olarak Euler Açıları hariç, diğer tüm dönüşleri kullanabilirsiniz. Matrisler, Kuaterniyonlar Eksen Açıları bile istediğinizi yapar.

Should I create three quaternions and multiply them together? Wouldn't I end up with the same problems?

Haklısın, aynı problemlerle sonuçlanırsın. Anahtar, nesnenizin geçerli yönlendirmesini (matris, kuaterniyon) saklamak ve yönlendirmeyi değiştirirken yalnızca bir delta uygulamaktır .

Y etrafında 10 derece döndürmek istediğinizde, bunun için bir delta matrisi / kuaterniyonu oluşturun ve bunu mevcut yönünüzle çarpın (matrisler için çarpma sonrası kullanıyorsanız). Bunu başka bir şekilde çarparsanız, sistemi nesnenin y ekseni yerine dünyanın y ekseni etrafında döndürür.

Bu kaynağı çok faydalı buluyorum , kaynak kodu ile birlikte geliyor ve teoriyi çok iyi açıklıyor.


-1

Gördüğünüz sorun eksen dönüşü ve hız vektörlerinde bir fark (ve ayrıca bir yönü kaçırmış olmanız). Bir helikopter ileri hareket etmek için öne doğru eğildiğinde, helikopter bıçaklarının itişi havayı X eksenini etiketlediğinize dik bir açıyla hem aşağı hem de geriye iter.

Kaçırdığınız dördüncü bir serbestlik dereceniz var: bıçakların hızı itilen hava hacmini kontrol ediyor, bu da helikopterin ürettiği kaldırma miktarını da kontrol ediyor.

Ama buna rağmen, "sola ve sağa eğin" ve "yukarı ve aşağı eğin" genellikle helikopteri belirli bir düzlemde kontrol eder. Yani, bir helikopter ileri, geri veya yana doğru eğildiğinde aşağı doğru uçmamalıdır - ancak kaldırma miktarı değişebilir ve hız, oluşturduğu sağ üçgenin "karşı" tarafı tarafından kontrol edilecektir. helikopteri yere doğru düz bir çizgi (yerçekimi) ve hipotenüs (kaldırma) ile bağlamak. Bu, kullanılacak hız vektörünüzü vermelidir.

Bunu yapmak için kuaterniyonları kullanabilmelisiniz, ancak kuaterniyon değerlerinizi helikopterin kendi eğimine dayandırmayın - bunun yerine helikopterin ürettiği hareket kuvvetlerini kullanmayı deneyin.


Bu soruyu gerçekten cevaplamıyor. Sadece düşünce için daha fazla yiyecek eklemek.
bummzack

Şu anda, helikopter uzayında yukarı doğru işaret edilen kaldırma kuvveti vektörünü dönüştürmek için helikopterin dönüşünü kullanıyorum. Yani tersini yapmam gerekiyor, yani vektörü doğrudan değiştirmeli ve sonuçta helikopteri döndürmeliyim?
subb

Sanırım ikisini de yapmalısın, şimdi ne yapıyorsun, sonra bıçakların normaline dayanarak helikoptere dönüşte SONUÇ değişiklikleri yapmalısın. Yani 2 rotasyonunuz var; biri bıçaklara uygulanır ve ikincisi helikopterin gerçek dönüşünü temsil eder. Belli ki hepsi Quaternions'da saklanıyor.
deceleratedcaviar
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.