osa1 feed

Pygame ve basit bir fizik motoru 2, çarpışma tespiti ve yansıma

April 11, 2011 - Tagged as: python, pygame, tr.

Geçen yazıda şurdaki örnekleri Pygame’de yazmaya çalıştığımdan bahsetmiştim ve ilk örnek için mouse pozisyonuna göre yönü ayarlanabilen bir çerçeve çizmek için birkaç bilgi vermiştim(kaynaklar github’da).

Bugün çarpışma tespiti ve yansımaları da hallettim. Çarpışma tespiti için çok fazla yöntem var, ben Stack Overflow’da gördüğüm şu yazıdakilerden birinden esinlendim.

Yaptığım şey kısaca şu:

vm1, çarpacak cismimizin merkezinden, 1. yüzeyin merkezine vektör olsun. m1b, 1. yüzeyin merkezinden düzlem merkezini gösteren birim vektör olsun vm1’in m1b izdüşümü(projection) yeterince küçükse(örneğin cisim topsa, yarıçapından küçükse), çarpışacaklar demektir.

Kendi yazdığım Vector sınıfıyla beraber kod şöyle birşey oluyor:

if abs((m1b*vm1.dot_product(m1b)).length) < 5:
        # carpisma!

Bu yöntemi başka bir yöntemden esinlenerek kendim ürettiğimden, pek sağlıklı olmayabilir. Bu uygulama için gayet güzel çalışıyor ama. Zaten çarptıracağınız yüzeye ve çarpan cisme göre farklı algoritmalar daha mantıklı oluyor.

Yansıma için de reflection vector kullandım. Şöyle birşey:

R = V - 2N(V DOT N) . Bizim şartlar altında, R yansıyan hız vektörü, V gelen hız, N de yüzeyin normal vektörü. Yine kendi yazdığım Vector sınıfımla beraber şöyle birşey yani:

ref_v = v_hiz - m1b*2*(v_hiz.dot_product(m1b))

Programdaki küçük(ya da bir daha düşündüm de, büyük) hata ise, toplar yüzeylere çarpmak üzereyken yüzeyleri hareket ettirirseniz, toplar alandan dışarı çıkıyorlar. Ekranın dışına çıktıklarında diğer taraftan tekrar girmelerini sağladığımdan, tekrardan alan içerisine alabiliyorum, ehaeuhe. Neden olduğu hakkında az da olsa fikrim var, bir şekilde çözeceğiz artık.

Bundan sonra 3. örnek, zıplayan toplar var. Önce topların alandan dışarı çıkmasını engellemeye çalışacağım sanırım.

Bu arada tüm kodlar github’da.