Gemiyi döndürmek için hangi iticilerin açılacağı nasıl belirlenir?


47

Geminin konfigürasyonu dinamik olarak değişir, bu nedenle gemiyi saat yönünde veya saatin ters yönünde çevirmek istediğimde hangi iticinin açılacağını belirlemeliyim. İticiler her zaman gemi ile eksen hizalıdır (asla açılı değildir) ve açık veya kapalıdır. İşte olası kurulumlardan biri:

http://i.stack.imgur.com/GSBSH.png

Şimdiye kadar denedim, ateşleme vektörünü ve yön vektörünü geminin kütlesinin merkezine görselleştirmek:

http://i.stack.imgur.com/ZzNzi.png

Maalesef, bu konuda çok fazla ilerlemedi.


7
Kuvvet vektörleriyle doğru yöne gidiyorsunuz. Gemiyi kütle merkezi etrafında döndürmeye çalıştığınız için ANGULAR hız için formüller aramayı deneyin.
Amplify91,

Nasıl yapıldığını tam olarak unutuyorum, ama temelde her noktadaki adil güçleri en.wikipedia.org/wiki/Center_of_mass ve özellikle en.wikipedia.org/wiki/Parallel_axis_theorem
CobaltHex

1
Tamamen aynı fikrim vardı! Sizin için kolaylaştırabilecek bir ipucu, her itici için bir defa açısal ve doğrusal ivmelenmeyi hesaplamanız gerektiğidir, bu yüzden hesaplamalar istediğiniz kadar karmaşık olabilir.
Markus von Broady

@ Amplify91, yorumunuz rahatlıkla çözmeme yardımcı oldu, teşekkürler!
migimunz

1
@migimunz Her tuşa basıldığında (itici grubu) değil, itici başına ivme hesaplamayı düşünüyordum. Ayrıca, oyuncuya, hangi tuşa basılacağı konusunda hangi iticilerin etkinleştirilmesi gerektiğine dair bir seçenek vermek (bazı insanlar yerinde
dönmek

Yanıtlar:


22

Başarı! İşte ve olması gerektiği gibi dönüyor: görüntü tanımını buraya girin

Yaptığım şey şudur: Her itici için, tork büyüklüğünü kütle merkezi ile ilgili olarak hesaplarım.

private function thrustTorque():Float
{
    // distToCom is the distance vector between the thruster and center of mass
    // fire angle is a unit vector representing the direction of the thruster
    var distAngle = Math.atan2(distToCOM.y, distToCOM.x);
    var fireAngle = Math.atan2(dir.y, dir.x);
    var theta = fireAngle - distAngle;
    var torque = distToCOM.length * Math.sin(theta);
    return torque;
}

Vikipedi için, tork değerinin denklemi, wikipedia 'ya göre T = rF sin(theta):

  • r pervaneyle COM arasındaki mesafedir.
  • F uygulanan kuvvetin büyüklüğüdür (Ben sadece bir karaktermiş gibi davranıyorum, çünkü sadece işareti önemsiyorum).
  • theta iki vektör arasındaki açıdır

Oyuncu sola bastığında, bu itici için tork işaretini kontrol ederim - sıfırdan azsa, iticiyi ateşlerim. Saat yönünde çevirmenin tam tersi.

Bu, muhtemelen vektörler arasındaki açının kosinüsünü hesaplamak için nokta ürünü kullanılarak geliştirilebilir, ancak yarına kadar beklemek zorunda kalacak.

Son olarak, işte canlı bir demo .


Neredeyse orada düşünüyorum. Tam olarak kütlenin merkezinde görünmüyor. Sadece sol / sağ okları kullanarak, gemi kolayca ekrandan gidebilir. Yine de çok yakın. Belki de ölçtüğün nokta biraz kapalı. Ya da bir süre sonra iyi bir dönüşe dengelenmiş gözüktüğü için zamanlama meselesi olabilir. Yine de iyi iş.
MichaelHouse

Bunun bu mantıkla ilgisi olduğunu sanmıyorum. Burada, aracın bu mekanizma tarafından seçilen perdeleri ateşlemesinden net bir çeviri kuvveti almamasını sağlayacak hiçbir şey yok. Net bir çeviri kuvveti sağlamak bir zorunluluk değilse, bireysel iticilerin kuvvetini değiştirebilmeyi gerektirecektir (ve muhtemelen çözülmesi çok daha zor bir sorun olacaktır)
Trevor Powell

Tam olarak @TrevorPowell. Sadelik uğruna (ve aynı zamanda eğlenceli, geminizin ne kadar iyi performans gösterdiğine bağlı olarak, ne kadar iyi tasarladığınıza bağlı olacaktır), iticilerin açık veya kapalı olduğuna karar verdim. Muhtemelen bir eşik içereceğim, böylece çok az torka neden olan (ve bu nedenle çok fazla yanal harekete neden olan) açılmaz, ancak tam olarak ne kadar "çok fazla / az" olduğu muhtemelen deneme yanılma ile belirlenir.
migimunz

3
Açı hesaplamalarını önlemek için yapmak istediğiniz şey dik nokta ürününü kullanmaktır ( z = 0 olan 3B vektörleri kullanıyorsanız T = r çapraz F torkunun çapraz ürün tanımından türetilmiştir ). Aynı büyüklükte r'ye dik olan vektörü (-ry, rx) alırsınız ve bu vektörün nokta çarpımını F ile hesaplarsınız. Sonuç T = rx * Fy - ry * Fx olur. Daha sonra abs (T) torkun büyüklüğüdür ve işareti yönünü gösterir: T> 0 saat yönünün tersine, T <0 saat yönündedir.
Joren

1
Çalışmasının nedeni sezgisel olarak görmek kolaydır: r dot F = r F cos θ. Eğer döndürmek Eğer r = sin (θ) - 90 derece yönünün ve nokta ürünü al, cos (90˚ θ) çünkü r F sin İçeride ISTV melerin RWMAIWi'nin olsun.
Joren

14

Tork için genel 3D sentezleme değiştirme ve kuvvet enine ürünüdür: T = RF . İki boyutta, tork için skaler bir değer yeterli olacaktır ve iticiler için sadece dört dikey yönelim göz önüne alındığında, parçalı biçimde yazabiliriz:

  • Yönü zorla + x: T = F * (-ry)
  • -X yönüne zorla: T = F * (ry)
  • + Y yönüne zorla: T = F * (rx)
  • -Y yönünde zorla: T = F * (-rx)

Burada, iticiler tarafından oluşturulan kuvvetin büyüklüğü F'dir, rx ve ry vektörün x ve y bileşenlerini pivot noktadan iticiye kadardır. Pozitif torklar, gemiyi saat yönünün tersine döndürme eğilimindedir. Yukarıdaki dört formülü kullanarak, her iticinin ürettiği tork işaretini çıkarmak çok önemlidir.

Fiziğin mütevazi bir şekilde doğru gösterimi için, sadece itme işaretini bilmekle kalmaz, aynı zamanda toplam büyüklüğünü ve dönme ataletini bilmeniz gerekir. Dahası, sadece bir döndürme işlemi yapmak için tüm hizalanmış iticileri etkinleştirmek istemeyebilirsiniz.

Uzay gemisi

Çizildiği gibi, B, D ve E iticileri için tam güç, dönüşü en üst düzeye çıkaracak, ancak aynı zamanda gemiyi sağa doğru hızlandıracaktır. D'nin kapatılması bunu önleyecektir. Bunun yerine, sağa doğru hızlanma amaçlanır, ancak saat yönünde bir dönüş yapılmazsa, gidilecek en etkili yol hem C hem de F'nin D ile birlikte tam güçün üçte ikisinde sağlanmasıdır.

Bu, yapmaya çalıştığınız şeyin kapsamı dışında değilse, hareket denklemleri için bir tür çözücü yazmanız gerekir, açıkça basit bir iş değil.


7

Birkaç farklı şey. Öncelikle, bunun kısıtlı olmayan bir sorun olduğunu kabul etmeliyiz. Yani, aynı yönde dönmeye neden olacak şekilde ateş edebilen birçok itici kombinasyonu vardır. Sizin durumunuzda iticiler için yalnızca "açık" ve "kapalı" olmak üzere iki durum olduğunu ve tüm iticilerin eşit güç ürettiğini farz ediyorum.

İkincisi, modelinize göz kulak vererek, “kütle merkeziniz” aslında kütle merkeziniz gibi gözükmüyor. Neyse ki, bu tork için hesaplamaları etkilemez. Bununla birlikte, kütle yer değiştirme merkezi için yapılan hesaplamaları etkileyecektir. Bu seviyedeki doğruluğa önem verip vermediğinizden emin değilim, çünkü “kütle merkeziniz” en azından gerçek kütle merkezine en yakın karedir.

Üçüncüsü, belirli bir iticinin dönüşü nasıl etkileyeceğini hesaplamak istiyorsanız, verimsiz bir formül kullanıyor olsanız da haklısınız. Tork r x F, büyüklüğü olan olarak hesaplanabilir r*F*sin(theta). Ancak bu durumda açıların hesaplanması verimsiz bir yöntemdir. Bunun yerine, torkun çapraz ürün tanımını doğrudan kullanmalısınız, çünkü bu, sahip olduğunuz gösterimleri kullanmak çok daha kolay olacaktır. Tüm vektörlerinizin z bileşeni olmadığından, çapraz ürün için formül büyük ölçüde kolaylaştırır.

Hesaplamanızın sonuçlarını değiştirmeden kodunuzu güncelleyebiliriz.

private function thrustTorque():Float
{
    var torque = distToCOM.x*dir.y-distToCOM.y*dir.x;
    return torque;
}

Bu çok daha hoş (ve daha hızlı).

Kendi cevabınıza göre çözümünüz, tüm iticileri doğru yönde tork ile ateşlemektir. Şimdi, bu sorduğunuz soruyu hemen hemen çözdü. Bununla birlikte, hat boyunca bir noktaya gelmesini bekliyorum, bir kullanıcı "döndür" düğmesini basılı tutarsa ​​ve pozitif bir tork döndüren tüm iticileri potansiyel olarak en üst seviyeye getirdiğinde stratejinizin o kadar tatmin edici olmadığını göreceksiniz. Bunları döndürme (gerdiricilerden kuvvetleri gerçekten hesaplarsanız ya da sadece görsel olarak ateşlemelerini gösterirseniz ve ardından modelinizi sabit bir hızlanma ya da bir şeyle döndürürseniz, simülasyonunuzun ayrıntı seviyesinden emin değilim. Bu şekilde, iticileri en azından yaklaşık olarak doğru bir şekilde ateşlemelerini istiyorsunuz.

Gemideki net kuvveti dikkate almazsınız. İsteğe bağlı itici miktarlarınız olsaydı, bu durum oldukça karmaşık bir soruna dönüşebilirdi. Ancak, iticilerimizin yalnızca iki durumu olduğundan, analiz edilmesi oldukça kolaydır. Amacımızın burada tam olarak ne olduğundan emin değilim, bu yüzden iki farklı hedef hayal edebiliyorum: ilk önce toplam gücü en aza indirgemek istiyoruz, ancak yine de torku istediğimiz yönde tutarız. İkinci olarak, torkun toplam kuvvete oranını maksimize etmek istiyoruz.

Bir kenara, tüm iticilerin gücünü aynı anda etkileyen ek bir "itici ses seviyesi" kontrolü hayal edebiliyorsanız , o zaman bu kontrolü iki çözümünüzün eşit torka sahip olmasını sağlayacak şekilde ayarlayabilirdiniz ve ikinci çözümün yalnızca ilkinden daha küçük yer değiştirme. Bununla birlikte, iticileri ateşlemenin mümkün olduğunu, böylece sadece dönüp hiç hareket etmeyeceğinizi, her iki çözümün de aynı olacağını hatırlamamız gerekir.

Böylece, önceki paragrafın argümanlarına dayanarak ikinci çözüme geçeceğiz. Şimdi, toplam kuvveti analiz ederken, motorların işaret edebileceği sadece dört yön olduğunu not edebiliriz. Bu nedenle, x yönündeki toplam kuvvet, sadece sola işaret eden iticilerin sayısıdır, sağa işaret eden sayıdır ve aynı şekilde y yönü içindir.

Bu ana kadar yazdıktan sonra, onu optimize etmek için algoritma hakkında biraz daha düşünmem gerekiyor. Gönderimin geri kalanının olduğu gibi faydalı olduğunu düşünüyorum, bu yüzden gönderiyorum, ancak bu yapılandırmayı optimize etmenin en iyi yolunu bulduğumda güncelleme yapacağım (yaklaşık yanıt almanın birkaç yolunu düşündüm, ancak hiçbiri kesin değil).


Cevabınız için teşekkür ederiz (ve torku hesaplamada daha hızlı ve daha temiz bir çözüm). Kırmızı daire geminin COM'u değil, güç çekirdeği. Fizik motoru kullanıyorum ve yalnızca gemiye yerel bir itici güç uyguluyorum. Tamamen farklı konfigürasyonlarla oynamayı eğlenceli hale getirdiği için çözümün mükemmel olmadığından eminim, ama ne elde ettiğinizi bilmek isterim.
migimunz

1
Torku isteğe bağlı bir referans noktasından hesaplayabilirsiniz. Ortaya çıkan sayı değişecek, ancak gemiyi bu nokta etrafında döndürdüğünüzde, kütlenin merkezi olması gerekmeyen fiziksel davranışlar değişmeyecek. Aslında, kütle dağılımı hakkında bilgi sahibi olmadan, kitlenin merkezi keyfidir ve bu şekilde hesaplanamaz.
Marcks Thomas
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.