2D rijit cisim çarpışma çözümü
Problemin tanımı
- Mario'nun bulutların üstüne basmasından bir yarış oyununda iki arabanın çarpışmasına kadar, çarpışmaları ele almak çoğu video oyununun çok önemli bir parçasıdır.
- Bu blog serisinde fizik simülasyonunun gerçek matematiği ve fiziği ele alınacaktır.
- Video oyunları, bu kavramları bağlama oturtmanın ve onları daha az soyut hale getirmenin iyi bir yoludur.
Matematik hakkında kısa bir not
- Bu yazıda bolca matematik var, ancak matematikten çekinmemeniz tavsiye edilir.
- Matematiksel gösterimler karmaşık görünebilir, ama büyük kısmı basit aritmetiktir.
- Matematikten korkmayıp denemeniz önerilir.
Başlamadan önce
Rijit cisim
- Rijit cisim fiziği, deforme olmayan nesnelerle ilgilenen bir fizik simülasyonudur.
- Gerçekte tüm nesneler moleküler düzeyde deforme olur, ancak simülasyonda bunu basitleştirip rijit cisim olarak ele alırız.
Çarpışma tespiti ve çarpışma çözümü
- Çarpışma tespiti, sahnede hangi nesnelerin çarpıştığını belirleme sürecidir.
- Çarpışma çözümü, çarpışan nesnelerin nasıl hareket etmesi gerektiğini belirleme sürecidir.
- Bu blog serisinde çarpışma çözümü aşamasına odaklanılacaktır.
Yapmaya çalıştığımız şey nedir?
- Çoğu oyun büyük bir döngü içinde çalışır.
- Oyun döngüsünün her tekrarında nesnelerin konumu, mevcut hızlarına göre güncellenir.
- Hız, büyüklüğü ve yönü olan bir vektördür.
Hız
- Hız, belirli bir süre boyunca bir nesnenin konum değişimini ifade eder.
- Nesnenin yeni konumu, mevcut hız ile zaman aralığının çarpımından elde edilen yer değiştirme eklenerek hesaplanır.
Çarpışma çözümü
- Çarpışma çözümünün amacı, çarpışmadan sonra nesnelerin hızını değiştirerek artık birbirlerinin içinden geçmemelerini sağlamaktır.
- Çarpışma sonrası hız, çarpışma öncesi hız ile çarpışmanın neden olduğu hız değişiminin toplamı olarak ifade edilir.
Çarpışma nedir?
- İki nesnenin çarpışma halinde olup olmadığını anlamak için iki koşulun sağlanması gerekir:
- Nesnelerin geometrik şekilleri temas etmeli veya üst üste binmelidir.
- Nesneler hâlâ çarpışmaya doğru hareket ediyor olmalıdır.
Yüzey normali
- Bir nesneyi bir yüzeyden olabildiğince uzağa taşımak için, yüzeye dik yönde hareket ettirmek gerekir.
- Bu yöne normal yön denir ve yüzeye diktir.
Skaler çarpım
- İki vektörün ne kadar aynı yönü gösterdiğini hesaplamak için skaler çarpım kullanılır.
- Skaler çarpım, iki vektörün karşılık gelen bileşenlerinin çarpımlarının toplamı olarak tanımlanır.
- Skaler çarpımın işareti sayesinde iki vektörün aynı yönde mi yoksa zıt yönde mi olduğunu anlayabiliriz.
Sonuç
- Bir nesnenin bir noktası başka bir nesnenin bir noktasıyla temas ettiğinde ve göreli normal hız negatif olduğunda çarpışma meydana gelir.
- Bir sonraki yazıda çarpışmanın gerçek fiziği ele alınacaktır.
GN⁺ görüşü
- Fizik simülasyonunun önemi: Oyun geliştirmede fizik simülasyonu, gerçekçiliği artıran önemli bir unsurdur.
- Matematiğin rolü: Matematik, fizik simülasyonunun merkezindedir; bunu anlamak daha iyi simülasyonlar kurmanızı sağlar.
- Çarpışma çözümünün karmaşıklığı: Çarpışma çözümü, nesnelerin konumunu güncellemekten çok daha karmaşık bir süreçtir.
- Eğitsel değer: Bu yazı, fizik simülasyonunun temellerini anlamaya büyük katkı sağlar.
- Ek öğrenme: Bir fizik motorunu bizzat uygulamaya çalışmak da iyi bir öğrenme yöntemidir. Box2D veya Chipmunk gibi açık kaynak fizik motorlarına bakabilirsiniz.
1 yorum
Hacker News görüşü
Hacker News yorum derlemesi özeti
Hey everyone, author here!
Oh! Look, a well-researched, deeply-explained, and interactive post.
One side project I am working on right now is a 2d space shooter I am developing with my son.
I always enjoyed the explanation from the N game: N game tutorial
I had fun building a TypeScript demo about this topic, involving balls that can bounce and collide. I learned a lot.
This is great. This reminds me of Chris Hecker's Rigid Body Dynamics series from GDMag/Gamasutra that I read (checks watch) almost 30 years ago!
Collisions are violations of the pairwise non-intersection constraint between bodies.
If you want to go further and go for rigid body dynamics and constraint, I found that series of blog post very useful: Toptal blog post
To dredge up a related oldie-but-goodie memory of blog posts: Gaffer on Games
Guess this is a Shameless plug but I wrote an interesting program over 12 years ago using even then very old three Js which is not quite the metal but much less abstract than today's tools.