3 puan yazan GN⁺ 2024-05-25 | 1 yorum | WhatsApp'ta paylaş

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:
    1. Nesnelerin geometrik şekilleri temas etmeli veya üst üste binmelidir.
    2. 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

 
GN⁺ 2024-05-25
Hacker News görüşü

Hacker News yorum derlemesi özeti

  • Hey everyone, author here!

    • Bu, blog serisinin ilk yazısı ve oyun geliştiricisi olmayan ya da matematik altyapısı zayıf olan kişileri hedefliyor.
    • Kavramları ayrıntılı açıklamasının nedeni bu.
    • Sorularınız varsa her zaman memnuniyetle karşılar.
  • Oh! Look, a well-researched, deeply-explained, and interactive post.

    • Alan adını ve TLD'nin ".ski" olduğunu görünce, başka harika yazılar yazan yazar sandım ama başka biriymiş.
    • Yazının kalitesi benzer şekilde çok iyi.
    • ".ski" TLD'sinin sırrını merak ediyorum.
  • One side project I am working on right now is a 2d space shooter I am developing with my son.

    • Oğlumla birlikte bir 2D uzay nişancı oyunu geliştiriyorum.
    • Bir oyun motoru kullanmadan kendim yapmayı denedim ama çarpışma algılama sorunlarında zorlandım.
    • Sonunda Box2D kullanmaya karar verdim.
    • 20 yılı aşkın geliştirme deneyimim ve matematik geçmişim olmasına rağmen bu problemi hafife aldığımı fark ettim.
  • I always enjoyed the explanation from the N game: N game tutorial

    • Flash'ın popüler olduğu zamanlarda N oyununun açıklamalarını keyifle okurdum.
  • I had fun building a TypeScript demo about this topic, involving balls that can bounce and collide. I learned a lot.

    • Zıplayan ve çarpışan topları içeren bu konuda bir TypeScript demosu yaparken çok şey öğrendim.
    • Kod
    • Sonuç/demo
  • 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.

    • Çarpışmalar, cisimler arasındaki ikili kesişmeme kısıtının ihlalidir.
    • Çarpışma kuvveti bu kısıtların Lagrange çarpanıdır.
    • Çarpışma normali, kısıt fonksiyonunun kısmi türevidir.
  • 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

    • Daha ileri gidip rijit cisim dinamiği ve kısıtlar konusuna bakmak isterseniz, bu blog yazısı serisini çok faydalı buldum.
  • To dredge up a related oldie-but-goodie memory of blog posts: Gaffer on Games

    • Bununla ilgili eski ama güzel blog yazılarını da hatırlattı.
    • 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.

    • Sanırım bu biraz shameless plug olacak ama 12 yıldan uzun süre önce, o zaman bile çok eski olan three Js kullanarak ilginç bir program yazmıştım; doğrudan metal'e yakın değil ama bugünün araçlarına göre çok daha az soyut.
    • Busy Boxes