Hızı arttıkça nesnenin daha az hız kaybetmesi nasıl sağlanır


11

Flash'ta bir oyun geliştiriyorum ve biraz yardıma ihtiyacım var. Bir matematik problemi olarak düşünülebilir.

XNesnem hızla uçuyor ve nesnem taşlarla çarpışabilir. Bir taşla çarpıştığında, taşı kırmak ve devam etmek için nesneme ihtiyacım var, ama daha az hızda. Bunu zor kodlamak ve şöyle bir şey yazmak kolaydır:, myVelocity -= 10;ama asıl sorunum, başlangıç ​​hızı ne kadar yüksekse, daha az hız kaybetmesini istemem .

Örneğin: Hız 300 ise 10 kaybetmesini istiyorum, 200 ise 20 kaybetmesini istiyorum.

Bu bir tür formülle yapılabilir mi?


1
Basit bir şeye ne dersin log(myVelocity + 1) * N?
Jonathan Connell

Yanıtlar:


6

Hızı tersine çevirir ve beğendiğiniz bir şeyle çarparım:

float velocity = 300.0f;
float collisionEffect = 3000.0f / velocity;
if (collisionEffect > velocity)
{
    // Choose which one you like: with or without restitution

    // No restitution
    collisionEffect = velocity;

    // Restitution
    collisionEffect = velocity + (collisionEffect - velocity) * 0.3f;
}
velocity -= collisionEffect;

Bu örnek şu efektleri verir:

400 loses 7.5
300 loses 10
200 loses 15
100 loses 30
 50 loses 50  // Using no restitution
 50 loses 53  // Using restitution
 20 loses 20  // Using no restitution
 20 loses 59  // Using restitution

"İade" nedir?
jprete

İade, geri dönüyor. Bu gerçekçi.
Martijn Courteaux

30

sizin ve başkalarının tarif ettiği sistem gerçek görünümlü fizik üretmeyecektir. ana formül, nesne bir yere çarptığında 0,5 * m * v ^ 2'yi (kinematik enerji) sabit bir değerde azaltmaktır .

yani 2Kg ağırlığındaki bir nesne, kırılmadan önce 16j enerjiye ihtiyaç duyan bir bloğa çarparsa: nesne hareket hızı bu tabloya göre değişecektir:

4  m/s -> the block will not break
5  m/s -> 3   m/s
6  m/s -> 4.4 m/s
7  m/s -> 5.7 m/s
8  m/s -> 6.9 m/s
9  m/s -> 8   m/s
10 m/s -> 9.1 m/s

7
Bu kabul edilmelidir - doğru, gerçekçi, uygulaması kolaydır ve tüm nesne vakalarını ele alacak ve kütle ve hızı engelleyecektir.
Tesserex

3
Elde etmeyi umduğunuz belirli bir 'karikatür fiziği' etkiniz yoksa, daha gerçekçi bir sistemle devam etmek neredeyse her zaman iyi bir fikirdir; potansiyel olarak motoru kıran son teknolojiye sahip olmamanızı sağlayacak daha iyi birkaç yol vardır.
Steven Stadnicki

1
Bu cevap iyiydi, biliyorum. Ama oyunum çizgi film dünyasında geçiyor ve gerçekçi olması gerekmiyor. Soruyu sorduğumda daha spesifik olmalıydım.
Afra

1
Bu bir topluluk projesi, insanlar soruyu cevaplamak için buradaydılar ve sorulan soru için bu en iyi cevap. Özel durumunuz için hileli çözümü tercih etmeniz, bu cevabın en iyi cevap olmadığı anlamına gelmez. Birisi siteyi bu tür bir sorunun cevabını ararken, gerçekçi olmayan cevabın daha iyi olduğunu varsayarlar.
Richard Fabian

1
@Richard Diğer çözüm basit değil çünkü gerçekçi fizik kullanmıyor, Tetris hacky çünkü bloklar düzgün düşmüyor mu? Eğer insanlar kabul edilmiş bir cevabın, adamı tatmin eden cevap olduğunu varsaymak yerine 'daha iyi' olduğunu varsayarlarsa, bu onların hatasıdır. Bütün cevaplar ve oylar hala ortada.
CiscoIPPhone

2

Ne tür bir aralık istediğinizi (ör. Sınırlandırılmış olup olmadığını, geometrik ilerleme isteyip istemediğinizi vb.) Söylemek için yeterli bilgi vermediniz.

Yapmak istediğiniz ilk şey, kaybetmek istediğiniz hız miktarıyla orantılı bir sayı elde etmektir (aynı olmak zorunda değildir, ancak hızınız kaybınızla orantılı hale getirmek için arttıkça azalmalıdır). Bunu yapmanın standart yolu karşılıklılığı almaktır :

temp = 1 / currentVelocity;

Şimdi, 100 için 0.01, 200 için 0.005, 300 için 0.0033 ve benzeri olacak.

Şimdi bu sayıyı çarparak gerçekten istediğiniz her şeye ayarlamanız yeterlidir. Yani

k = 3000;
newVelocity = temp * k;

300 için 20'nizi verir, ancak 10 yerine 200 için 15 verir. Bu sizin için iyi olabilir, bu durumda daha fazla okumaya gerek yoktur. K'yi istediğiniz gibi ayarlayabilirsiniz, ancak geometrik ilerleme uygulama veya biraz artırmak için tabanı değiştirme gibi biraz daha yapmadığınız sürece sayıları istediğiniz gibi alamayabilirsiniz. Burada geometrik ilerlemelere girmeyeceğim, ancak tabanı değiştirmek istiyorsanız, bunu aşağıdaki gibi yaparsınız:

base = 100;
temp = 1 / (currentVelocity - base);
if (temp < 0) temp = 0; //adjust temp so never less than zero, cannot gain force!

k = 2000;
velocityLoss= temp * k;
if (velocityLoss > currentVelocity) //(1) or make currentVelocity an unsigned int
    velocityLoss = currentVelocity; //(2)

Bu size ilk olarak sorunuzda aradığınız aralığı sağlayacaktır, 300 -> 10, 200 -> 20 kaybı. FYI 100 -> 40 kaybı ve 50 -> 80 (!) Kaybı (1) ve (2) satırlarında yaptığım şey çıkarma işleminizi kısıtlamanız gerekiyor.

Bu soruna yaklaşmanın başka yolları da var elbette ki eminim ki benden daha matematiksel olarak usta olanlar burada yayınlayacaklar.


0

Bence, sadece hıza göre basit bölme kullanabilirsiniz. Örneğin: kayıp = 3000 / myVelocity. Hız 300 olduğunda 10 kaybedersiniz, 200 olduğunda 15 kaybedersiniz. Doğru sabitleri seçmek size bağlıdır.

İsterseniz, daha karmaşık bir formül kullanabilirsiniz, örneğin: sabit / (sabit2 * hız ^ 2 + sabit3 * hız). Tekrar - sadece size uygun sabitleri seçin.


ne istediğini ve gerçek fizikte ne olduğunu tamamen tersine çevirdi.
Ali1S232

Seni anlamıyorum Tersine çevrilmiş nedir?
zacharmarz

Sanırım cevap verdiğini yanlış anladım, kötüyüm.
Ali1S232
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.