Yan kaydıraçım için temel bir yapay zeka yapıyorum ve bir AI ünitesinin A noktasından B noktasına ulaşıp ulaşamayacağını bilmem gerekiyor.
Karakterlerimin uçuş yörüngesi, havada (örneğin Jazz Jackrabbit 2'de olduğu gibi) kuvvet uygulayabildikleri için biraz alışılmadık, bu yüzden yaklaşık bir merminin klasik yörüngesinin aksine ...
atılan veya fırlatılan bir merminin itme olmaksızın (...) alacağı yol.
... sanırım benim sorunum daha çok itmeli bir mermiyle ilgili (örneğin roket).
Bunu göstermek için, atlamak ve sürekli olarak "sol düğmeye" basarsam uçuş eğrisi karakterime böyle görünür (sol uçta farklı görünüyor, burası havada bazı manevralar yapıyordum):
Uçuş sırasında uygulanan kuvvet her zaman X eksenine paraleldir, bu nedenle "sola" basarsam F = (-f, 0) ve "sağ" tutarsam F = (f, 0) olur.
Bir kayak pisti gibi hareket edebilir:
Bu yüzden sadece bir parabol olan klasik yörüngeden çok farklıdır (kaynak: wikipedia ):
Daha zor hale getirmek için, basit hava direncini simüle ediyorum, böylece karakterlerim sadece maksimum hız değerine kadar hızlanabilir.
Bu, ters yönde küçük bir kuvvet uygulanarak yapılır :
b2Vec2 vel = body->GetLinearVelocity();
float speed = vel.Normalize(); //normalizes vector and returns length
body->ApplyForce( AIR_RESISTANCE_MULT * speed * speed * -vel, body->GetWorldCenter() );
AIR_RESISTANCE_MULT, benim durumumda 0.1 olan bir sabittir.
Diyelim ki karakterim sonsuz küçük bir nokta.
Ve ediyorum DEĞİL sorum böyle gider, böylece göz önüne engelleri alarak ...
Başlangıç hızı V verildiğinde, atlama sırasında karaktere uyguladığım bir dürtü J = (0, -j) , yerçekimi G = (0, g) , kuvvet F = (+ -f ) nasıl belirlenir (en azından güvenilir olarak tahmin edilir) , 0) uçuş sırasında sürekli olarak ve hava direncini gerçekten dikkate almaya karar verirsek (bu isteğe bağlıdır) , karakterinizin alacağı yolun çizdiği eğrinin altında bir nokta olup olmadığı?
Hesaplamalarla nereden başlayacağım konusunda hiçbir fikrim yok ve aslında kesin bir cevapla ilgilenmiyorum; AI'nın mükemmel bir şekilde hareket etmesine gerek olmadığı için iyi çalışan bir saldırı / yaklaşım harika olurdu.
edit: Jason önerdiği gibi simülasyon kullanarak bu çözmeye karar verdim, ama böyle bir dava nasıl ele alınır?
Bir gelen segmenti çizmek gerekir C için D bu kesimin alt istenen nokta bulunup bulunmadığı ve çek?
Veya istenen noktaya yatay mesafede yeterince yakın olan noktayı aramak için C ve D arasındaki zaman aralıklarını ikili olarak aramalı mıyım ve ancak dikey farkı kontrol etmeli miyim? (bana biraz abartılı geliyor)