Benzer simülasyonlarla ilgili makalelere bağlantıları olan bir yazı (oyunlarda değil mühendislik / akademik bağlamlarda): https://gamedev.stackexchange.com/a/10350/6398
Bu tür "tel" simülasyonu için (Umihara Kawase oyununda görüldüğü gibi) çarpışma algılamasına + yanıtına en az iki farklı yaklaşım denedim; en azından sanırım bunun peşinde olduğunuzu düşünüyorum - bu tür bir simülasyon için belirli bir terim yok gibi görünüyor, ben sadece "halat" yerine "tel" demeye meyilliyim çünkü çoğu insan gibi görünüyor “ip” i “parçacık zinciri” ile eşanlamlı olarak kabul edin. Ve, ninja ipinin yapışma davranışını istiyorsanız (yani iterek ve çekerek), bu bir ipten çok sert bir tel gibidir. Neyse ..
Pekuja'nın cevabı iyidir, üç noktanın işaretli alanının 0 olduğu zamanları çözerek sürekli çarpışma tespitini uygulayabilirsiniz.
(OTOH'i tam olarak hatırlayamıyorum ancak aşağıdaki gibi yaklaşabilirsiniz: a noktasının b, c'den geçen çizgide bulunduğunda t zamanını bulun (sanırım bunu nokta (ab, cb) = T) değerlerini bulmak için 0 ve ardından geçerli bir süre 0 <= t <1 olduğunda, bc segmentindeki a parametrik pozisyonunu bulun, yani a = (1-s) b + s c ve eğer a b ve c (yani eğer 0 <= s <= 1 ise) geçerli bir çarpışma.
AFAICR, buna diğer tarafa da yaklaşabilirsiniz (yani, s'yi çözün ve daha sonra t'yi bulmak için bunu takın), ancak çok daha az sezgiseldir. (Üzgünüm, bu bir anlam ifade etmiyorsa, notlarımı kazmaya vaktim yok ve birkaç yıl oldu!)
Böylece, olayların gerçekleştiği zamanları hesaplayabilirsiniz (örn. İp düğümlerinin takılması veya çıkarılması gerekir); en eski olayı işle (bir düğüm ekle ya da kaldır) ve ardından t = 0 ve t = 1 arasında başka bir olay kalmayıncaya kadar tekrarlayın / tekrarlayın.
Bu yaklaşımla ilgili bir uyarı: eğer ipin etrafına dolanabilecek nesneler dinamikse (özellikle onları simüle ediyorsanız ve bunların ip üzerindeki etkilerini ve bunun tersini yaparsanız), o zaman bu nesnelerin her birinin klipslenip / geçtiği durumlarda sorunlar olabilir diğer - tel karışık olabilir. Box2d tarzı bir fizik simülasyonunda bu tür bir etkileşimin / hareketin (birbirinin içinden kayan nesnelerin köşeleri) bu şekilde engellenmesi kesinlikle zor olacaktır. Bu bağlamda nesneler arasında az miktarda sızma olması normal davranıştır.
(En azından .. bu benim "wire" uygulamalarımdan biriyle ilgili bir problemdi.)
Çok daha istikrarlı olan ancak belirli şartlarda bazı çarpışmaları kaçıran farklı bir çözüm, sadece statik testler kullanmaktır (yani zamanla sipariş verme konusunda endişe etmeyin, her segmenti bulduğunuzda çarpışma halinde tekrar tekrar alt bölümlere ayırın). çok daha sağlam - tel köşelerden dolaştırılmaz ve az miktarda penetrasyon iyi olur.
Bence Pekuja'nın yaklaşımı da bunun için işe yarıyor, ancak alternatif yaklaşımlar da var. Kullandığım bir yaklaşım, yardımcı çarpışma verilerini eklemek: dünyadaki her dışbükey v'de (yani, ipin etrafına dolanabilecek şekillerin köşeleri), yönlendirilmiş çizgi parçasını uv, yani u nokta "köşenin içinde" (yani dünyanın içinde, "arkada" v; u hesaplamak için, bir enterpolasyonu normal boyunca v'den içe doğru bir ışın yayınlayabilir ve v'den sonra veya ışının dünyanın bir kenarı ile kesişmesinden bir süre önce durabilirsiniz ve Sağlam bölgeden çıkar ya da sadece görsel bir araç / seviye editörü kullanarak parçaları dünyaya manuel olarak boyayabilirsiniz).
Neyse, artık bir takım "köşe çizgileri" uv; her bir uv ve kablodaki her bir ab için, ab ve uv'nin kesiştiğinden emin olun (yani statik, boolean lineseg-lineseg kesişim sorgusu); eğer öyleyse, tekrar kablolayın (lineseg ab'yi av ve vb'ye ayırın, yani v'yi ekleyin), ipin v yönünde büküldüğünü kaydeder. b'nin oluşturulduğu zamankiyle aynıdır (bu "viraj yönü" testlerinin tümü yalnızca işaretli alan testleridir); değilse, iki parçayı ac şeklinde birleştirin (yani b'yi çıkarın).
Ya da belki birleştim ve sonra ayrıldım, unutuyorum - ama kesinlikle iki olası emirden birinde çalışıyor! :)
Geçerli çerçeve için hesaplanan tüm tel bölümleri göz önüne alındığında, iki tel uç noktası arasındaki mesafeyi sınırlandırabilirsiniz (ve hatta iç ve hatta tel ve dünya arasındaki temas noktaları gibi iç noktaları da dahil edebilirsiniz) ).
Her neyse, umarım bu biraz yarar sağlayacak ... bağlantıda bulunduğum yazıların da size bazı fikirler vermesi gerekiyor.