Karakterim nerede duracak?


12

Yıllar önce bir sahte sahte 3d oyun için bazı AI kodladım. Yapmanın en iyi yolunu asla anlamadığım bir hesaplama vardı ve bu, düşmanın şimdi durursa nerede biteceğini hesaplamaktı. Örneğin:

  • Düşman şu anda X = 540.0'da.
  • Düşman her karede 10 piksel hızla hareket ediyor.
  • Düşman durmak istediğinde, hızı sıfıra ulaşıncaya kadar kare başına 1 piksel düşer.

Düşman tamamen durduğunda beni bitirecek pozisyona getirecek basit bir formül var mı? İhtiyaçlarım için çalışan, ancak farklı hızlara sahip düşmanlar için ayrı olarak hesaplanması gereken ofseti önceden hesapladı ve sabit kodladı.

Yanıtlar:


7

Genelde John'un cevabına katılıyorum. Biraz değiştirilmiş bir formül sunacağım (ki bu değerine ekstra bir V / 2 ekler):

D = V / A * (V + A) / 2 

İle V = 10ve A = 1bu alır D = 55. Bu tam olarak

10 + 9 + 8 + 7 + .... + 3 + 2 + 1

bu düşmanın kare kare hareketidir.

İşte bu adıma nasıl geçtiğiniz hakkında.

  1. V : Geçerli Hız = 10 piksel / kare, A : Geçerli Hızlanma = 1 piksel / kare ^ 2
  2. T : Durma Zamanı = V / A = 10 kare.
  3. 10 çerçevede kat edilen mesafe = frame1 + frame2 + frame3 + ... = V + (VA) + (V-2 * A) + ...
  4. Bu, yukarıdaki denkleme basitleştiren T * V - A / 2 * T * (T-1) 'e eşittir.

+1 Çözümünüzde herhangi bir mantık hatası göremiyorum ve çözümümle nasıl karşılaştığımı gerçekten hatırlayamıyorum. Yani ifadem yanlış olmalı ve muhtemelen küçük fark ve ayrıntılı test eksikliği nedeniyle fark etmedim? Hızın yarısını eklersem ifadem doğru olur mu?
John McDonald

Güç kireç kullanarak kendi sorumu cevapladım. İfademi + (v / 2) almak, herhangi bir v ve a için ifadenizi her zaman eşitliyor gibi görünüyor.
John McDonald

Hem @John hem de sen sayesinde, bu günlerde bana çok fazla çaba kazandıracaktı! Bu cevabı kabul ediyorum, çünkü daha basit ve daha verimli, ancak John'un yanıtı da çok takdir ediliyor. Şerefe arkadaşlar!
Kaivosukeltaja

6

Oyunumla çalışırken aynı sorunu yaşadım ve matematiği doğru yapmak sonsuza dek sürdü (bleh). İşte burada:

minDistanceToStop = 0.5 * acceleration * Math.Pow(velocityLinear() / acceleration, 2.0);

Düzenli matematikte yeniden yazılmıştır:

(Acceleration / 2) * (linearVelocity / Acceleration)^2

Durumunuzdaki hızlanma 1 ve linearVelocity 10 olduğunda:

(1 / 2) * (10 / 1)^2
= 50 units to stop

DÜZENLE

Jimmy'nin sonucu ve açıklaması doğru. Formülüm, hızın yarısını da eklemenizi gerektirir.

minDistanceToStop = (0.5 * acceleration * Math.Pow(velocityLinear() / acceleration, 2.0)) + (velocityLinear() / 2);

veya

((Acceleration / 2) * (linearVelocity / Acceleration)^2) + (linearVelocity / 2)
((1 / 2) * (10 / 1)^2) + (10 / 2)
= 55

2
Sadece kayıt için, Math.Pow () burada korkunç, korkunç bir fikir. Bu may özel durum akıllı yeterli olmadığını '2.0' üs, ancak büyük bir kazanç olmalı '0.5 * linearVelocity * linearVelocity / Acceleration' olarak bu ifadeyi yeniden Bunu dilim herhangi bir şekilde,.
Steven Stadnicki

4

Değişen hızlarla ilgili hesaplamalar hesabın tüm noktasıdır. Bir süredir yapmadım, bu yüzden başımın tepesini hatırlamıyorum, ancak durumunuzun sadece -1 integralini (yani yavaşlama) aldığını düşünüyorum.


0

Bu sürekli ivme hareketi değil mi?

X = Xi + V*t + (1/2) * a * (t^2)

Nerede:
X: Son pozisyon
Xi: Başlangıç ​​pozisyonu
V: Hız
t: Süre
a: Hızlanma

Buradaki tek zor kısım "t" nin nasıl belirleneceğidir, çünkü -1 ivme ile yavaşlıyoruz, o zaman t = V / a hesaplayabiliriz, sonra t 10'dur.

yani
Xi: 540
V: 10
t: 10
a: -1

Her şeyi giy:

X = 540 + 10*10 + (1/2) * (-1) * (10 ^ 2) 
X = 540 + 100 + (-50) 
X = 540 + 50 
X = 590

Formül, ivmenin entegrasyonunu alarak gelir: Buraya bakın

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.