Çok basit 3d yarış oyunlarında, çarpışmalar nasıl ele alınır?


9

Bazı basit 3d araba yarışı oyunlarındaki çarpışmaların nasıl yapıldığını merak ediyordum (özellikle Outrun 2 / Motoracer gibi oyunlarda).

Karmaşık ortamlı (açık dünya) klasik araba yarışı oyunlarında, sanırım bu, uçak çarpışmasına (parça, binalar için başka şeyler) temel bir kutu (araba için) ile yapılır. Her şey bazı sınırlayıcı kutular kullanılarak optimize edilebilir (birçok oyunda çarpışma bu şekilde yapılır).

Outrun 2 / Motoracer gibi bir oyunda, oyun o kadar basittir ki, geliştiriciler belki de buna ihtiyaç duymazlar ve her şey çok basitleştirilebilirdi. Hiç oynamamış olanlar için işte bu kadar özel:

  • Araba / bisiklet her zaman yola yapıştırılır.
  • Yol her zaman aynı boyuttadır ve çok basit bir şekle sahiptir.
  • Tek olasılık bu yolu takip etmek, yoldan ayrılmak ya da başka bir şeyle çarpışmak (diğer otomobiller / bisikletler hariç ama umursamıyoruz).
  • Yolla çarpıştığınızda, çok temel bir çarşı çarpışması yapılır (araba sadece ondan itilir)

Çarpışma (olabilir) nasıl düşünüyorum:

Tüm parça dev bir 3d bezier eğrisi olarak kabul edilebilir. Bu eğriden, yol çokgenleri oluşturulabilir (eğriden oluşturulan ön, sol ve yukarı vektörler kullanılarak). Diğer elemanlar (evler, ağaçlar, ... gibi) de bu yöntem kullanılarak yerleştirilebilir ve hizalanabilir.

Ardından, çarpışmaları ele almak (ve araba çizmek) için:

1) Mevcut araba 3d konumundan 3d eğrisi üzerinde en yakın konumu bulun. Başka bir deyişle, 3d araç konumunu çerçeve eğrisi konumuna dönüştürün. Yoldaki her 3B konumu, 3B eğri ( t) + yanal yer değiştirme ( d) boyunca bir yer değiştirme olarak düşünülebilir . Açık değilse aşağıdaki görüntüyü kontrol edin (bu 2d bir örnektir, ancak bu kolayca 3d için geçerlidir).

resim açıklamasını buraya girin

t = 0 araba parça bölümünün başında olduğunda, t = 1 araba sonunda olduğunda. d = -1 veya 1 araba pist sınırında olduğunda, d = 0 araba yolun ortasında olduğunda

2) kullanarak arabayı yola hizalayın tve d(çok basit: herhangi bir tve ddeğerler için bir 3d pozisyon + yukarı / ön / sol vektörler alabilirim). araba şimdi yola yapıştırıldı

3) dAracın yanal yer değiştirmesini kontrol edin . değer çok büyükse (d > 1)veya düşük (d < -1)arabaya parkurda değil. arabayı doğru yere koymak için sadece klipsleyin.

Bu aynı zamanda 3d culling'i çok basit hale getirir, sadece mevcut araba tkonumundan pist çizin t + some_big_enough_value_to_avoid_visible_clipping.

Ya da belki de tamamen yanılıyorum: sadece arabanın çarpışmasını (sınırlayıcı bir kutu) ve pisti temsil eden çok basitleştirilmiş bir çokgen setini (binalar ve benzeri olmadan) kontrol etmek çok daha hızlı ve basit olurdu. 3B dünya (ve sonuçta ortaya çıkan çarpışma modeli), daha önce bazı üçüncü taraf araçları (oyunu çalıştırırken artık 3d eğri yok, sadece bir çokgen dizisi) kullanılarak daha önce oluşturulmuş olacaktı.

Yanıtlar:


16

Tarif ettiğin gibi birkaç ticari oyun üzerinde çalıştım.

Bu oyunların her birinde, pistin kenarları boyunca görünmez bir "duvar" oluşturan çokgenlerimiz vardı ve bu duvarlara karşı geleneksel çarpışma testi yaptık. Bu, yolun kenarında, görünmez duvarların içinde bazı katlanabilir tehlikelere sahip olabileceğimiz ve aynı zamanda bir spline yaklaşımı ile yol genişliğini normalden daha hızlı değiştirmemize izin verdi.

Ancak bununla birlikte, çarpışmanın nasıl çalışacağını düşündüğümde listelediklerinizi de yaptık çarpışma tünellemesine / aksaklıklara karşı korunmak için ve bu sistem AI mantığı yarışmak için de yoğun bir şekilde kullanıldı. Ayrıca, HUD'da "1. / 2. / 3. / vb." Göstergesini görüntüleyebilmemiz için hangi araçların lider olduğunu belirlemek için kullandık. Bazen bu veriler, büyük bir çarpışmadan sonra bir arabanın yeniden doğması için de kullanılıyordu.

Eğer cevapsız Tek parça ben çarpışma işe yarar mı nasıl böyle spline ile konum çalışma, normalde spline'lara vereceğiz zaman olacağı kaburga. Kaburgalar, parkurun yivden her yöne ne kadar yana doğru uzandığını ifade eden veri parçalarıdır. Bu yüzden 100 metre uzunluğunda bir spline için 50 kaburgaya sahip olabilirsiniz, bu da uzunluğu boyunca her iki metrede bir iz genişliği verir. Bu, parkurunuzun genişliği boyunca genişliğini değiştirmesine olanak tanır. Üzerinde çalıştığım oyunlarda, bu kaburgalar da "palet yüzeyi" ve "sürülebilir alan" arasında ayrım yapmıştır. Böylece, eğri çizgisinin ortasından ne kadar uzakta güzel bir asfaltınız olduğunu söyleyen bir yol genişliği setiniz olacak ve daha sonra başka bir genişlik kum / çimen / bunun dışında ne kadar uzağa gideceğini söyleyecektir. Bu, oyuncuların pistten makul bir mesafeyi sürdürebilmemizi, ancak yine de gerçek yol yüzeyinin nerede olduğunu AI bilmesini sağlıyor.

Üzerinde çalıştığım birçok oyun kaburgalarda başka veriler de sakladı; bir oyun, bir alanın gölgede olup olmadığını kolayca hesaplamak için kaburgaya parça aydınlatma bilgilerini pişirdi (daha sonra araba renderleme için kullanıldı, bir mercek parlaması çizilip çizilmeyeceğine karar verdi ve diğer efektler). Bir diğeri, hangi sinematik kamera yerleşimlerinin spline'ın bu bölümünü görebileceği hakkında bilgi aldı, bu yüzden tekrarlar sırasında görüş hattı hesaplamaları yapmak zorunda değildik. Yine bir diğeri, spline üzerinde kaç tane şerit olduğu, hangi yöne gittikleri ve her şeridin bulunduğu yatay yer değiştirme hakkında bilgi içeriyordu. Bu, yol şeritleri içinde doğru şekilde sürülebilen trafik arabalarını dahil etmemizi sağladı. Kaburgalar, yol yüzeyiniz hakkında ihtiyaç duyabileceğiniz her türlü değişken veriyi saklamak için harika.

Kaburgalar genellikle spline ile ilişkili bir dizide saklanır. Hız nedenleriyle, normal bir uygulama eşit aralıklı kaburgalara sahip olacaktır, bu nedenle bir nesnenin spline boyunca mesafesini öğrendikten sonra, spline boyunca mesafeyi kaburgalar arasındaki mesafeye bölerek dizideki en yakın kaburga dizinini hesaplayabilirsiniz. Aksi takdirde, doğru yol genişliği verilerini bulmak için kaburga diziniz üzerinden ikili arama yapmakta kaldınız.

Çıkarma açıklamanız spline yaklaşımının nasıl kullanılabileceğinin iyi bir temel açıklamasını verir, ancak aslında önerdiğinizden biraz daha karmaşıktır - bu şekilde culling için spline kullanırsanız, uzun saç tokası dönüşleri genellikle karşı tarafı çizmez Pist boyunca mesafe ile ölçüldüğünde , karga uçarken ölçüldüğünde sadece birkaç metre uzakta olsa bile, dönüşün karşı tarafı çok uzakta olabilir. Ek olarak, dünya geometrisinin görülebildiği mesafeler, palet ağının görülebildiği mesafelerden tipik olarak farklıdır, dolayısıyla bunlar da bu sisteme gerçekten uymaz. Deneyimlerime göre, çoğu durumda, bir model çizilip çizilmeyeceğini belirlemek için takip eden mantığa güvenmemek daha iyidir; çok daha güvenilir ve bunun için standart kamera frustum testini daha az hataya neden oluyor.


Bilgilendirici ve eğlenceli bir cevap okumak için
onedayitwillmake

0

OpenGL yarışçımda, başlangıçta parkurun sınırlarını tanımlamak için iki daire kullanarak başladım, ancak çok fazla güçlük gibi görünüyordu. Piksel rengini okumak için glReadPixel kullanıyorum. Oyuncular arabası yeşil (çim renkli) bir pikselin üzerindeyse, hareket daha da sınırlandırılır. Performans üzerinde çok az etkisi vardır.


Bu 2D oyunu (daireler, piksel renkleriyle çarpışırken) tanımladığınız gibi geliyor. Öyle mi? O zaman cevap offtopiktir.
Kromster

Perspektif projeksiyonunda bir oyuna atıfta bulunuyorum. glReadpixel 2d orto veya 3d perspektif modunda uygulanabilir.
ztech79
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.