Bir oyunda bir top hareket etmiyorsa belirlemek için bir epsilon değeri kullanarak?

oy
2

I toplar zıplayan ve her zaman kendi hız vektörü İstirdat Katsayısı ile azaltılır çarpışır sahiptir.

Şu anda benim topları için taşaklarımı Bölgeler Komitesi .80 olduğunu. Yani benim topları olan birçok sekerek sonra hız biraz gülünç az sayıda haline gelmiştir çünkü haddeleme durduruldu.

hangi aşamada bir hız değeri basitçe sıfır arayacak kadar küçükse uygun (yani onların mikro hızları tepki topları çılgın titreşim'in yok) kontrol etmektir. Bu insanlar bazen bir epsilon sabiti, bazı küçük numarayı kullanmak ve buna karşı kontrol edecektir girmeden biraz forumlarda okudum.

Bir epsilon sabit tanımlamak ve böyle bir şey yapmak olmalı:

if Math.abs(velocity.x) < epsilon then velocity.x = 0

Her zaman topları hız ve pozisyon güncellemek? Bu genellikle ne yapılır mı? x ve y benim Vektör sınıfları belirleyiciler bu koymak için makul olurdu? Ben hızlarını hesap yapıyorum Ya da benim vektör sınıf dışında yapmalı.

Benim hız vektörü için şamandıralar kullanılmadan eğer Ayrıca, ne makul epsilon değeri olurdu?

Oluştur 10/12/2008 saat 01:02
kaynak kullanıcı
Diğer dillerde...                            


4 cevaplar

oy
1

Bunun yerine bir IsStillMoving fonksiyonu için bir epsilon, belki onun hızına dayalı bir nesne-nesne temelinde planlanan bir UpdatePosition işlevini kullanabilirsiniz.

Ben böyle bir şey yapmak istiyorum (içinde benim kendi makyaj it-up-as-you-go pseudocode):

void UpdatePosition(Ball b) {

   TimeStamp now = Clock.GetTime();
   float secondsSinceLastUpdate = now.TimeSince(b.LastUpdate).InSeconds;

   Point3D oldPosition = b.Position;
   Point3D newPosition = CalculatePosition(b.Position, b.Velocity, interval);
   b.MoveTo(newPosition);

   float epsilonOfAccuracy = 0.5; // Accurate to one half-pixel
   float pixelDistance = Camera.PixelDistance(oldPosition, newPosition);
   float fps = System.CurrentFramesPerSecond;
   float secondsToMoveOnePixel = (pixelDistance * secondsSinceLastUpdate) / fps;
   float nextUpdateInterval = secondsToMoveOnePixel / epsilonOfAccuracy;

   b.SetNextUpdateAt(now + nextUpdateInterval);
}

çok hızlı hareket Toplar her karede güncellenen almak istiyorum. Toplar her beş veya on kare güncelleme olabilir daha yavaş hareket eden. Ve durdu (ya da neredeyse durdu) olan toplar yalnızca çok çok nadiren güncellenir olacaktır.

Cevap 10/12/2008 saat 01:43
kaynak kullanıcı

oy
1

epsilon için makul bir değer sisteminizin kısıtlamalara bağlı olacak. grafiksel topu temsil ederse, o zaman epsilon, diyelim ki, 0,1 piksel hızı ikinci (durdurma sizin fikriniz durdurma ekran nesnelerinin kullanıcı deneyimini eşleşmesini sağlayarak) karşılık gelebilir. Bir fizik simülasyonu yapıyorsanız, size sistemini ölçmek için çalışıyoruz hangi doğruluğu ayar bunu isteyeceksiniz.

hem bağlı olduğunu - Kontrol ne sıklıkta gelince. gerçek zamanlı olarak bir şey taklit ediyorsanız, ekstra onay masraflı olabilir ve ikinci ya da bir şey başına her 10 güncellemeleri veya bir defa kontrol etmek isteyeceksiniz. Veya performans sorunu olmayabilir ve her güncelleme ile kontrol edebilirsiniz.

Cevap 10/12/2008 saat 01:23
kaynak kullanıcı

oy
0

doğal olarak mümkün olan en küçük Epsilon artıştır. Ne yazık ki, bilgisayarlar kayan nokta gösterimi bağlı kendi farklı "minimal" değerinde artış. Çok dikkatli olacağını (ve sadece güvenlik için hesaplamak ne bile daha yüksek gidebileceğini) Bir kod taşınabilir olmak istiyorum, özellikle o uğraşırken.

Eğer yüzen üzerinde minimal artışı rakamlar fonksiyon yazmak yerine sihirli değeri kullanmak isteyebilirsiniz.

Cevap 10/12/2008 saat 01:49
kaynak kullanıcı

oy
0

IMO sizin epsilon yaklaşımı gayet iyi. Sadece görünüyor veya oyunda animasyon doğal bir his olduğunu görmek için denemeler olacaktır.

Cevap 10/12/2008 saat 01:14
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more