RTS Yerel Kaçınma Nasıl Yapılır?


15

Şu anda, birimlerin yerel olarak önlenmesi için fizik etki kuvvetlerini simüle ediyorum, ancak bu yöntem bazen birimleri oluşumdan çıkarıyor ve birimler toplandığında çok istenmeyen etkilere sahip.

Starcraft 2 gibi RTS oyunları için yerel kaçınma nasıl yapılır? Fizik simüle ediliyor mu yoksa yetersiz bir denetleyici her şeyin nerede olması gerektiğine karar veriyor mu? Bu sorunun biraz geniş olabileceğini biliyorum, bu yüzden özellikle Starcraft 2'nin yerel kaçınma davranışlarına nasıl ulaşılacağını soruyorum; ama işe yarayan her şey çok takdir edilecektir.

Herhangi bir kod aramıyorum - sadece yararlı kaynaklar veya Starcraft 2'nin (veya benzer oyunların) yerel kaçınmayı nasıl işlediğine dair açıklamalar.

Şu anda çarpışma tespiti (penetrasyon vektörü ile), çarpışma kuvvetleri ve uygulanan hıza göre hareket var. Her ünite bir çarpışma için diğerine karşı kontrol edilir - çarpışırlarsa, nesneler derhal penetrasyon vektörü ile dengelenir, sonra çarpışma kuvveti uygulanır. Daha sonra başka bir döngü, nesneleri hızlarına göre hareket ettirir ve hızlara sürükleme uygular. Ofset, kümelenmiş birimlere uygulanan aşırı çarpışma kuvvetleri sorununu azaltır, ancak birimler hala bazen dışarı atılır.

Aradığım çözümün (Starcraft 2'de olduğu gibi) aşağıdaki gereksinimleri karşılaması gerekiyor:

  • Nesneler örtüşmez; veya en azından çakışmaların eninde sonunda çözülmesi gerekir.
  • Nesneler birbirlerini gereğinden fazla uzağa itmezler, bu nedenle 2 ünite bir oluşumda yan yana durabilir ve hareket edebilir.
  • Nesneler aynı hedefe doğru toplandığında tuhaf davranışlar olmamalıdır.
  • Farklı boyutlardaki birimleri ve hatta farklı dışbükey şekilleri destekleyebilir.

Şimdiye kadar düşündüğüm, çarpışmaları tespit etmek, gelecekteki çarpışmaları tespit etmek yerine çakışma asla gerçekleşmiyor. Ardından, 2 birimin hızlarının çakışmasına neden olmadığından emin olarak kısıtlamayı uygulayın. Hala örtüşme ötesinde hareketi kısıtlamak için algoritma ile uğraşıyorum.


"akın davranışı" (google terimi) çok geniş bir sorundur,
cırcır ucube

Bu "çok geniş" olarak yakın oylama kuyruğuydu — kabul etmeye meyilliyim. Daralmaya çalışmak: Ne denediniz? Hangi "istenmeyen etkilerden" kaçınmak istiyorsunuz? Birimlerin oluşumda kalmasını istediğinizi söylerken haklı mıyım?
Anko

RTS oyunları genellikle her makinede aynı deterministik simülasyonu çalıştıran her müşteri tarafından çalışır. Temel olarak, tek bir makine için çözebilirseniz, aynı çözümü çok oyunculu durumlara, hangi yerel kaçınma tekniğiyle devam ederseniz uygulayabilirsiniz.
Alan Wolfe

Soruyla ilgili geri bildiriminiz için teşekkür ederiz. Soruyu biraz daralttım ve özellikle neyi başarmaya çalıştığımı açıkladım.
JPtheK9

Bu harika bir kaynak: red3d.com/cwr/steer
tbkn23

Yanıtlar:


11

Aradığınız şey Optimal Karşılıklı Çarpışma Kaçınma algoritması gibi görünüyor . Yukarıdaki kağıt da değer okunur. Her ne kadar makale biraz dahil olsa da, algoritmanın arkasındaki teori oldukça basittir:

Etrafında bir çeşit sınırlayıcı hacim olan ajanlarla (birimler) zaten bir simülasyon (oyun) olduğunu varsayın. Bu sınırlayıcı hacim, çarpışma algılama ve yanıtını gerçekleştirmek için kullandığınız şeydir. Her ajan v_piçin, ajanın hedefine dayanabilen veya dayanamayan tercih edilen bir hız tanımlayın .

Şimdi, simülasyonu gerçekleştirmek için:

  1. Her bir madde için, durağan olduğu varsayılarak, ilerleyen herhangi bir noktada diğer hareketli maddelerden herhangi biriyle çarpışmasına neden olacak tüm hızları hesaplayın. Bu, "hız uzayında" kesişen yarım düzlemler kümesi ( hız engeli ) olarak gösterilebilir.
  2. Bu alanda en yakın noktayı belirleyin v_p, bu ünitenin yeni hızıdır.

Tüm ajanlar aynı algoritmayı çalıştırıyorsa, birbirlerini karşılıklı olarak tamamlayan ve diğer ajanlardan kaçınan hızları seçeceklerdir. Bazı durumlarda, doğrudan salondaki birine doğru yürüdüğünüzde meydana gelen garip bir şey gibi salınımlara neden olabilirsiniz ve her ikisi de aynı yönde yoldan çıkmaya çalışırsınız, ancak kağıtlar bundan nasıl kaçınacağını kapsar.

Yukarıdaki algoritmanın iki aşamasını hesaplamak için, hız engelinin ne olduğunu belirlemek için Minkowski Toplamlarını kullanabilir ve sonra hız engelinden kaçınan en yakın noktayı belirlemek için doğrusal bir programlama modeli ( Simplex Algoritma gibi ) kullanabilirsiniz v_p. Ayrıca, çarpma önleme kullanılacak kod kullanılabilir inceleme için ve C # için Birlik gibi oyun motorlarında kullanılmak üzere taşınır. Bu teknik en azından Warhammer 40,000: Space Marine ve diğer oyunlarda kullanılmıştır .


Bu inanılmaz bir makaleydi ve açıklamasından yarısını okuyacağımı hissediyorum. Bu bilgi için teşekkürler.
JPtheK9

0

Birimlerinizin nasıl çalıştığını bilmiyorum ama bir devlet makinesi gibi olduklarını varsayıyorum:

Olası durumlar

  • Koşu (x, y, z)
  • Girişim (enemy_id)
  • Kaynak toplama (ressource_id)

Starcraft'ın bu soruna nasıl yaklaştığına dikkat ederseniz, şunları bulacaksınız:

  1. Bir yönde hareket edecek yer varsa, karakter bu yönde hareket eder.
  2. Boşluk yoksa, yoldaki birim yer açmak için hareket edecektir
  3. Yer açmak için hareket etmesi gereken birimin zaten bir komutu varsa, komutu koruyacak, ancak sonunda yer değiştirmek için biraz değiştirecektir.

İşte senaryo 1:

resim açıklamasını buraya girin

Oraya gidecek yerim var mı? Evet ? Sonra gidin

Senaryo 2:

resim açıklamasını buraya girin

Oraya gidecek yerim var mı? Hayır ? Hey, benim için biraz yer açabilir misin, beni engelliyorsun. Zaten foward taşımak için bir emrim var ama sizi ağırlayacağım.

Yani ne yapmanız gerekecek:

  • Birimler çevrelerinin farkında olmalıdır
  • Birimlerin birbirleriyle iletişim kurmak için bir yolu olmalıdır
  • Başka bir üniteyi kullanırken bir komutu yürütmeye devam etmenin bir yolunu uygulamanız gerekir

Bilgi ve görselleştirme için teşekkürler. Şu anda bir birimin başka bir yere gidip gelemeyeceğini veya başka bir birimin onu işgal edip etmediğini öğrenmek için çarpışma algılamayı kullanıyorum. Anlamaya çalıştığım en önemli şey, diğer birime hangi mesafeyi hareket ettireceğini veya hangi hızı ayarlayacağını söyleyen bir çeşit algoritma. Başka bir deyişle, engelleme biriminin geçmeye çalışan birimi nasıl barındıracağı.
JPtheK9

Bu davranış her fizik güncellemesi hesaplandığından, mesafeyi gerçekten söylemek zorunda değilsiniz, yoldan çıkana kadar hareket edecektir. Yön için, iki ünitenin hızını basitçe çarparsınız, bu size noktayı yarıya kadar verir, böylece uyum sağlarken hareket etmeye devam eder. Bundan sonra, siparişe daha fazla yapışmasını veya daha hızlı hareket etmesini sağlamak için bununla oynayabilirsiniz.
Antoine

"Yoldan çıkana kadar hareket et" derken ne demek istiyorsun? Ünite ilk etapta nasıl hareket ediyor?
JPtheK9

Maalesef bahsetmeyi unuttum: Birimin devlet makinesi değil. Dolaplarında her kareyi simüle eden birçok yetenekleri vardır - ancak bu yetenekler, yalnızca X uzaktayken veya bir hedefin varlığıyla etkinleştirildiğinde etkilidir. Bir birimin hareketi, bir yetenek tarafından değiştirilebilen hızının bir sonucudur.
JPtheK9

0

Bunu yapmanın bir yolu, birimlerin oluşumları otomatik oluşturması ve formasyonun merkezine göre bir konumda kalmaya çalışmasıdır. . Ardından, her birimi ayrı ayrı hareket ettirmek yerine formasyonun merkezini hareket ettirin.

Üniteleri uygun pozisyonlarında tutmak için bir kutu oluşumu ve basit yaylar kullanarak bunu yapmanın temel bir yolu:

// Defines a phalanx (box) formation
class Formation
    // Center of the box in the world
    Position center;
    // Width in # of units
    int width;
    // Height in # of units
    int height;
    // Space between units
    float scale;
    // How much force units will apply to stay near
    // their assigned spot.
    float springforce;

    // Return a position of a unit at the given row and column
    // Todo: add a rotation to this formation so it can rotate when moving.
    Position GetUnitPhalanxPosition(int row, int column)
        return new Position(center.X + column * scale - width * scale /2, 
                            center.Y + row * scale    - height* scale / 2);

// Represents a simple point object with a velocity and position;
// it belongs to a formation.
class Unit
    Position pos;
    Velocity vel;
    Formation formation;
    // What's our assigned spot in the formation?
    int row;
    int column;

    void Update(float dt)
        // Get the desired target position in the formation
        Position target = formation.GetUnitPhalanxPosition(row, column);
        // Apply a spring force toward the position (todo: you might want to damp this)
        vel += (target - position) * dt * formation.springforce;
        // Move along the velocity vector.
        pos += vel * dt;

Teşekkürler! Bu gerçekten ilginç ve yaratıcı bir çözüm. Kalabalık davranışları / oluşumları için buna benzer bir şey uyguladım, ancak hala çakışan birimler problemim var. 2 oluşum birbirine karışırsa ne olur?
JPtheK9

Bence tasarıma bağlı. En kolay şey , bu görüntüdeki gibi diğer oluşumlarda yakındaki birimlerden başka bir direksiyon kuvveti uygulamak olacaktır . Yapabileceğiniz başka bir şey, oluşumları oyuncu tarafından seçildiklerinde birleştirmek, hatta "meta oluşumlar" oluşturmaktır
mklingen

Meta oluşumlar gerçekten karmaşık ve buggy gibi geliyor: C. Bağladığınız görüntü tam da ihtiyacım olan şey olabilir. Gücü uzaklaştırmak için biraz daha araştırma yapacağım. Resmin makalesine bağlantı var mı?
JPtheK9

Sizinkine benzer bir sorunum var, bunu nasıl çözdüğünüzü bilmek ilginç olurdu. Bu makaleyi okuduktan sonra bir fikir akla geldi: mikro çarpışmadan kaçınma için geri itme gücünü kullanırken Pathfinding (A *) makro yol planlaması için birleştirilebilir:
ColdSteel

0

Bazı insanların bağlantı dökümü konusunda kaşlarını çattığını biliyorum, ancak Gerçek Zamanlı Strateji Oyun Botları için Çok Ajanlı Potansiyel Alan Tabanlı Bir Yaklaşım (ISBN 978-91-7295-160-0) çok aydınlatıcı bir kağıt buldum ve açıkçası biraz daha fazla detaylandırabilirim. Makale, bir oyun geliştirme bağlamında yerel çarpışmadan kaçınmayı kolaylaştırmak için yapay potansiyel alanları (robotik kaynaklı bir kavram) kullanarak araştırıyor.


Teşekkürler! Araştırma benim için açıklama kadar faydalı. Bu makaleye dalacağım.
JPtheK9

Zaten kurulmuş bir etki haritan var ama bu benim zevklerim için çok karmaşık görünüyor. Ana şey, farklı birimlerin onları hareket ettirmesi için potansiyel alanlar oluşturmak ve ayrıca verileri potansiyel alandan taşınacak bir hıza dönüştürmektir. Temel olarak, bunun farklı boyutlardaki birimler için işe yarayacağını sanmıyorum. Birçok ilginç fikir olsa harika bir okuma.
JPtheK9
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.