Neden nesnem 90 dereceden 45 derecede daha hızlı hareket ediyor?


32

Oyunda 45 dereceden daha hızlı, 90 dereceden daha hızlı hareket eden nesnelerim var.

Her nesnenin

  • Nokta (x, y) konumu
  • Vector2D (x, y) yönü
  • İnt hız

Ve güncelleme sırasında yaptığım şey, yeni pozisyonun şu şekilde hesaplanmasıdır:

position.x += direction.x * speed
position.y += direction.y * speed

Bunu nasıl düzeltebilirim? Herhangi bir açıda aynı hızla hareket etmesini istiyorum.


8
Kullanmadan önce yön vektörünüzü normalleştirin; sorun çözüldü.
yavaşlattı

1
Normalize etmek google :) vardı bu yararlı site fundza.com/vectors/normalize/index.html
Jason94

Ve bu nesneyi kontrol etmek için kullanıcı girişi kullanıyorsanız, XNA devs için burada açıklanan 12,3,6,9 yönlere kilitlendiğinin farkında olun: xona.com/2010/05/03.html . İstediğiniz bir şey olabilir (bir RPG oyununda olduğu gibi) veya olmasın (bir Geometry Wars tarzı oyunda olduğu gibi).
Xonatron

Eski oyunda İniş , bu bir özellik oldu .
J. Holmes

@ 32bitkid Evet, ayrıca bakınız Doom straferunning
bobobobo

Yanıtlar:


55

Bu , aşağıdaki formül olan Pisagor Teoremi ile açıklanabilir :

a² + b² = c²

Senin durumunda, doğru hareket ederken, bize veren (x: 1, y: 0) kullanıyorsun.

c² = 1 + 0 = 1
c = sqrt(1) = 1.00

Yukarı ve sağa ilerlerken, bize veren (x: 1, y: 1) kullanıyorsunuz.

c² = 1 + 1 = 2
c = sqrt(2) = 1.41

Görebildiğiniz gibi, çapraz olarak uzunluk, kardinal eksenlerdeki uzunluktan daha uzundur.

Diğerlerinin de söylediği gibi, yön vektörünüzü basitleştirmelisiniz. XNA kullanıyorsanız, bu şekilde yapılır:

var normalizedDirection = direction;
normalizedDirection.Normalize();
position += normalizedDirection * speed

Ben yardımcı olduğunuz için teşekkür 1 veriyorum sorumu :)
Martin.

12

Kullanmadan önce yön vektörünüzü normalleştirin.

MindWorX tarafından açıklandığı gibi, yön vektörleri hakkında muhtemelen endişelenmenize neden olan endişeleriniz, birim vektörler olduklarından (büyüklük / uzunluk 1) olduklarından emin olabilirsiniz.

Length(Vector2(1, 1)) == 1.4142135623730951 // first hint of grief
Length(Vector2(1, 0)) == 1

Vector2(1, 1) * 2 == Vector2(2, 2)
Vector2(1, 0) * 2 == Vector2(2, 0)

Length(Vector2(2, 2)) = 2.8284271247461903 // second hint
Length(Vector2(2, 0)) = 2

Normalleştirilmişse:

normal(Vector2(1, 1)) == Vector2(0.707107, 0.707107)
Length(Vector2(0.707107, 0.707107)) == 1 // perfect

14
Yararlı bir cevap değil. Eğer sorgulayıcı "yön vektörünüzü normalleştirmek" in ne anlama geldiğini bilseydi, soruyu sormazdı.
Kristopher Johnson

@ KristopherJohnson, sorgulayıcının bir vektörün nasıl normalleştirileceğini bilmediği açık değildi. Her ne kadar, sorgulayıcı yine de önemli olmadığı kadar becerikli görünüyor.
yavaşlattı

2
@KristopherJohnson: soru soran kişinin "yön vektörünü normalleştir" in ne anlama geldiğini bilmiyorsa, Google’a yazması, dilinin adını eklemesi ve açıklamaları içeren bir kod alması yeterlidir.
Yalan Ryan

6

Yönünü nasıl hesaplıyorsun? 45 derece ise (1,1), o zaman kesinlikle 90 dereceden daha hızlı olacak (1,0).

Böyle bir şey kullanmanızı öneririm:

direction.x = Math.Cos(angleInRadians);
direction.y = Math.Sin(angleInRadians);

Açıyı radyan cinsinden almak için derecenizi çarpmanız PI / 180veya kullanmanız daha iyi olacaktır MathHelper. Örneğin.

angleInRadians = 45.0 * Math.PI / 180.0; // first method
angleInRadians = MathHelper.ToRadians(45f); //second method

6

Jason

Üç nesne özelliğine sahip olmak yerine,

  • Nokta (x, y) konumu
  • Vector2D (x, y) yönü
  • İnt hız

yönü ve hızı bir hız vektöründe birleştirmek çoğu zaman daha kolaydır. O zaman sadece iki özelliğin var.

  • Nokta (x, y) konumu
  • Vector2D (x, y) hızı

Güncelleme pozisyonu

Nesnenin konumunu güncellemeniz gerektiğinde, bu kadar basittir:

position.x += velocity.x * Δt;
position.y += velocity.y * Δt;

Nerede Δtveya zaman farkı - - veya zaman adım saat delta.

Konum ve hızın güncellenmesi

Ayrıca ivmelenmeyi (yerçekimi gibi) ele almak da çok kolaydır. Eğer bir hızlanma vektörünüz varsa, hızı ve pozisyonu şu şekilde birlikte güncelleyebilirsiniz:

position.x += (velocity.x * Δt) + (0.5 * acceleration.x * Δt * Δt);
position.y += (velocity.y * Δt) + (0.5 * acceleration.y * Δt * Δt);

velocity.x += acceleration.x * Δt;
velocity.y += acceleration.y * Δt;

(Bu temel olarak Physics 101'ten s = vt + ½at² formülüdür.)

Hız uygulamak

Belirli bir hızı belirli bir normal yönde uygulamak istiyorsanız, hızı aşağıdaki gibi ayarlayabilirsiniz:

velocity.x = normalizedDirection.x * speed;
velocity.y = normalizedDirection.y * speed;

Hız türetmek

Ve eğer tersini yapmanız gerekiyorsa - hız ve yönü belirli bir hız vektöründen türetmek - Pisagor teoremini veya .Length()yöntemini kullanabilirsiniz:

speed = velocity.Length();

Ve hız bilindikten sonra, normalize edilmiş yön, hızı hıza bölerek hesaplanabilir (sıfıra bölmeyi önlemek için dikkatli olun):

if (speed != 0) {
    normalizedDirection.x = velocity.x / speed;
    normalizedDirection.y = velocity.y / speed;
} else {
    normalizedDirection.x = 0;
    normalizedDirection.y = 0;
}
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.