Fizik modeli olan bir gemi için AI kontrolü


19

Ben 2D uzayda takip uygulamak nasıl fikirler arıyorum. Ne yazık ki henüz AI / yol bulma / otonom kontrol hakkında çok şey bilmiyorum.

Diyelim ki bu gemi serbestçe hareket edebiliyor ama kütlesi ve momentumu var. Ayrıca, dış kuvvetler onu etkileyebilir (patlamalar vb.). Oyuncu istediği zaman gemi için bir hedef belirleyebilir ve o noktaya ulaşıp durmalıdır.

Fizik olmasaydı bu basit olurdu, sadece yönü göster ve git. Fakat mevcut momentumla nasıl başa çıkılır ve sonra yerinde durulur? Geminin yerleşimini doğrudan değiştirmek istemiyorum.

edit: Sadece açıklığa kavuşturmak için, geminin kendisi fizik ile ilgili matematik sorun değil.


Buna benzer bir sorunla yakında karşılaşmayı umuyorum; Bunun cevaplarını görmek için sabırsızlanıyorum.
Bill

Yanıtlar:


15

Direksiyon davranışlarına bir göz atın . Özellikle arama ve varış ihtiyaçlarınız için ilginç olabilir. Bu davranışlar, bir patlama gibi diğer bazı etkiler gemilerin konumunu geçici olarak değiştirdiğinde de işe yarayacaktır.


+1. 2B uzay oyunu için, yönlendirme davranışlarını çerçeveniz olarak kullanmanızı ve yanıtlarımdan birini bu çerçevede bir bileşen olarak kullanmanızı öneririm.
tenpn

Soruyu okuduğumda aynı düşünceyi önerecekti. Direksiyon davranışını çok kullandım, kolay ve bazı güzel AI / hareketlere izin veriyor.
dotminic

5

Tam olarak doğru olmak kolay bir sorun değil. Her bir çözümün özellikleri farklılık gösterse de, iki seçeneğiniz vardır:

Matematiksel bir çözüm. Fizik sisteminiz yeterince basitse, hareketiniz için kapalı formu oluşturabilir ve bir noktada durmak için bir frenleme kuvveti uygulamaya ne zaman başlamanız gerektiğini hesaplayabilirsiniz. Frenleme kuvvetiniz sabitse ve hava direnciniz yoksa, bu ikinci dereceden ayrılmalıdır.

Emperical bir çözüm. Elle ayarlanmış bir PID kontrolörü kullanabilir veya geminizin fizik sisteminize frenleme mesafelerini kaydedebilirsiniz: bir test yatağında, gemiyi maksimum hızdan durma noktasına kadar frenleyin, kat edilen mesafeyi kaydedin ve her küçük zaman hızını hızlandırın. Ortaya çıkan mesafe / hız grafiğini bir veri dizininde saklayın.

Çalışma zamanında grafiği yeniden yapılandırın ve bir mesafe elde etmek için mevcut hızınızı ve hedef hızınızı takın. Hedef noktanıza bu mesafede tam frenlemeniz gerekir.

Bu yaklaşımın avantajı, herhangi bir hızda tam olarak fren yapmak için kullanabilmenizdir. Dezavantajı, frenlerinizin açılıp kapanması gerekiyorsa, asla tam olarak virajda olmayacağınızdır.


1

Daha önce de belirtildiği gibi, bu durum direksiyon davranışları için mükemmeldir, ancak biraz daha uzatmak istiyorum. Gelmesi davranışı bu senaryo için mükemmel olacaktır. Ayrıca engelleri de dikkate almak isteyebilirsiniz. Engellerden Kaçınma davranışını burada da kullanabilirsiniz.

Ne yazık ki, http://www.red3d.com/cwr/steer/ davranışlar için kaynak kodu sağlamaz. Ancak, Program AI'yı Örnekle Programlamak, anlaşılması kolay parçalardaki davranışları yapar ve açıklar. Kitabı alamıyorsanız, kaynak kodu her zaman buradan alabilirsiniz: http://www.wordware.com/files/ai/

Ayrıca, hareketinizi yol bulmayı içerecek şekilde genişletmek istiyorsanız, yolu hesaplayan (belki de 2B vektörlerin bir koleksiyonu olarak) bir yol bulucu sınıfına sahip olabilir ve bunu karışıma eklemek için Yol İzleme yönlendirme davranışını kullanabilirsiniz.

Bağlandığım kaynak kodu da bu yönlendirme davranışlarını bir araya getirmek için üç farklı yöntem sunuyor.

Umarım yardımcı olur.


Red3d.com bağlantısı doğrudan kaynak sağlamaz , ancak bu sayfada doğrudan yönlendirme davranışlarının açık kaynaklı bir uygulaması olan OpenSteer'e ( opensteer.sourceforge.net ) bir bağlantı vardır .
bummzack

Ahh bunu bilmiyordu, teşekkürler. Her ne kadar OpenSteer kaynağına baktım ve Buckland'ın kitabında bulunan yüz kodunuzda daha açık olana bakmayı daha kolay buldum. Özellikle işe başlarken.
Ray Dey

1

Bir pozisyona yönelmek çok zor değil, ama ben şahsen bir pozisyona yönelme ve belirli bir hızda ona ulaşma ya da hız kısıtlı bir yolu takip etme sorunuyla bir süre mücadele ettim.

Sorunu Hermite eğrisi kullanarak çözdüm . P0 ve m0'ı geminizin konumuna ve hızlarına, p1 ve m1'i hedef konumuna ve hızlarına ayarlayın. Bu, geminin hedeften bir saniye sonra takip etmesini istediğinizi varsayar. Geminize uygulanacak ivme kazandıracak ikinci p (0) türevini hesaplayınız.

İşte ikinci türev için kod (F # 'de, umarım seçtiğiniz dile uyarlayabilirsiniz; sq () kare, tırnak olarak yorumlanmayan ancak karakterler olarak yorumlanmayan tek tırnakları hesaplar, bunlar tanımlayıcının bir parçasıdır):

    let h'' t =
        let h00'' t = 12.0 * t - 6.0
        let h10'' t = 6.0 * t - 4.0
        let h01'' t = -12.0 * t + 6.0
        let h11'' t = 6.0 * t - 2.0

        let t = (t - t0) / diff_t

        (sq (1.0 / diff_t)) *
        ((h00'' t * p0) +
         (h10'' t * diff_t * v0) +
         (h01'' t * p1) +
         (h11'' t * diff_t * v1))

Geminiz dış kuvvetlere maruz kalırsa (örn. Gezegenlerden yerçekimi), ivmeyi itme kuvvetini hesaplarken bunu hesaba katmanız gerekeceğini unutmayın.



-3

Geminizin pozisyon ve hız gibi parametrelere sahip olması gerektiğini düşünüyorum.

Hız, her bir çerçevede tüm kuvvetlerin (yerçekimi, patlamalar, kullanıcı girişi vb.) Toplamıdır ve ayrıca bir nemli olabilir.

Konum son konum artı hız * zaman_ adımından hesaplanır.

Ancak, bununla hedefe durmayı uygulamak zor olabilir.


3
-1 Görünüşe göre Petteri Hietavirta, temel bir fizik sisteminin nasıl kullanıldığını biliyor. Bu soruya cevabınız, bir hedefe durmanın çok zor olması mı?
AttackingHobo
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.