Başımın üstünden, bana yapışan madde, alanın sabit olmasını istediğiniz. Bu bana tüm bunlarda acı gibi geliyor, o yüzden deneyelim ve buna kolay bir çözüm bulalım.
Bir parça ip alın ve bir daire oluşturmak için uçlarını birbirine bağlayın. Yanılıyor olabilirim, ama sezgim bu dizenin iç kısmının sabit bir alana sahip olduğunu ya da amip sınırınız gibi korkunç bir rol oynayacağını söylüyor.
Yani şunu söyleyebilirim: dizeyi uygulamak. ;) Çoğu fizik kütüphanesi yaylar yapabilir (Box2D'de bu mesafe bağlantısına benziyor) ve bir dize yapmanın en kolay yolu çok sayıda dizeyi birbirine bağlamaktır. Bir döngü oluşturmak için sonuncuyu birinciye kadar birleştirin. Dizedeki yayların, birbirinden gerilmeyecek kadar yüksek bir yay sabitine sahip olduğundan emin olun - genişlememeleri için oldukça sert olmalarını ve birlikte hareket etmelerini istersiniz.
Ardından, dizgide işlemek için kuvvetler oluşturun. Önemsiz olarak, iki çekirdek / göz / kontrol noktanız ipi oluşturan noktalara kuvvet oluşturur. Kuvvetin ters kare fonksiyonu ile düşmesini sağlayın:
float forceOnPoint(point, ball)
{
float d = distance(point, ball);
return K / (d*d);
}
Ve kuvvetin yönünü doğrudan kontrol gözünden / toptan uzak tutun, tıpkı toptan çıkan itici bir kuvvet gibi. Kuvvetin gücünü kontrol etmek için K ayarını yapın. K'nin çok yüksek olmadığından emin olun - kuvvet tarafından büyük ölçüde itilmesini istemezsiniz, sadece toplardan uzak tutun. İpinizde bol bol boşluk bırakın.
Sadece bu iki ile muhtemelen tekdüze bir şekil elde edeceksiniz, bu yüzden de amipin şeklini değiştirmek için çevredeki 'çorba' etrafında bazı zayıf kuvvetler oluşturmanızı öneririm. Bu rastgele yerleri yapabilir, kuvvetlerini düzenli olarak değiştirebilirsin (güzel hareketler için sinüsoid bir işlev yapabilirsin) ve toplarla aynı şekilde çalışmasını sağlayabilirsin.
Vajinasyon (fnarr): bu zor olanı. Bir nesneyi dizede bitişik olmayan iki noktanın yeterince yakın olup olmadığını kontrol ederek nesneyi sarmasına neden olursunuz ve eğer yapmanız gerekiyorsa:
Dize üzerindeki noktalar arasındaki mesafeyi ölçün. Yay bölümlerinin sayısını sayın. A'dan B'ye 'daha kısa' yolu bulun.
Dizeyi kırın ve bitişikteki iki nokta ile yeniden birleştirin. Başka bir deyişle, doğrudan A noktasını B noktasına birleştirin ve aradaki tüm öğeleri atın.
Eksik sayıdaki noktaları (artı bir şey yiyerek genişletmek istiyorsanız bonus puanları) diğer taraftaki dizeye, yani B'den A'ya kadar olan tarafa yeniden takın. puanlar arasında istenen mesafeden daha kısa yapın, güzel bir yaylı expandy etkisi elde etmelisiniz.
Bence bu her şeyi kapsıyor. Bu arada: fikir harika görünüyor.