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).
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 t
ve d
(çok basit: herhangi bir t
ve d
değerler için bir 3d pozisyon + yukarı / ön / sol vektörler alabilirim). araba şimdi yola yapıştırıldı
3) d
Aracı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 t
konumundan 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ı.