2010-04-05 19 views
8

Sanırım Box2d'yi herhangi bir vücut için bir çeşit maksimum hıza sahip olacak şekilde yapılandırdım, ama emin değilim. Ben (100000000, 100000000) gibi bir dürtü uygulayın ve vücut (100, 100) kadar hızlı hareket ediyor - ki bu hiç de hızlı değil.Box2d: Maksimum olası doğrusal hız?

Box2d XNA C# bağlantı noktasını kullanıyorum.

Oyunum yukarıdan aşağıya 2d. 1000f den 1000000000f yerde olduğunu

private void ApplyImpulseFromInput() 
    { 
     Vector2 movementImpulse = new Vector2(); 

     if (inputReader.ControlActivation(ActionInputType.MOVE_LEFT) == 1f) 
     { 
      movementImpulse.X = -Constants.PLAYER_IMPULSE_CONSTANT; 
     } else if (inputReader.ControlActivation(ActionInputType.MOVE_RIGHT) == 1f) 
     { 
      movementImpulse.X = Constants.PLAYER_IMPULSE_CONSTANT; ; 
     } 

     if (inputReader.ControlActivation(ActionInputType.MOVE_UP) == 1f) 
     { 
      movementImpulse.Y = -Constants.PLAYER_IMPULSE_CONSTANT; ; 
     } else if (inputReader.ControlActivation(ActionInputType.MOVE_DOWN) == 1f) 
     { 
      movementImpulse.Y = Constants.PLAYER_IMPULSE_CONSTANT; ; 
     } 

     model.Body.ApplyImpulse(movementImpulse, model.Position); 
    } 

Constants.PLAYER_IMPULSE_CONSTANT, oynatıcı taşıyabilirsiniz: Burada

private readonly Vector2 GRAVITY = new Vector2(0, 0); 

    public void initializePhysics(ContactReporter contactReporter) 
    { 
     world = new World(GRAVITY, true); 
     IContactListener contactListener = contactReporter; 
     world.ContactListener = contactListener; 
    } 

    public void Update(GameTime gameTime) 
     { 
    // ... 

      worldState.PhysicsWorld.Step((float)gameTime.ElapsedGameTime.TotalSeconds, 10, 10); 

    //... 
     } 

dürtü uygular bazı örnek kod şudur: Burada

ilgili olabilecek bazı koddur En (-120, -120), (120, 120). Sabit 1f gibi daha az ise, oyuncu daha yavaş hareket edecektir.

 controller.Model.BodyDef = new BodyDef(); 
     controller.Model.BodyDef.type = controller.Model.Mobile ? BodyType.Dynamic : BodyType.Static; 
     controller.Model.Body = worldState.PhysicsWorld.CreateBody(controller.Model.BodyDef); 
     controller.Model.Body.SetLinearDamping(10.0f); 

muhtemelen sönümleme doğrusal olabilir:

Bu kod oyun dünyasında her şey için fizik kurmak için kullanılır? Hiçbir etkisi olmadan 10.0f'dan 0'a değiştirdim.

Update: doğrusal Sönümlü weirdness:

Linear Damping  Max Speed 
0f     120 
10f     120 
50f     120 
55f     90 
60f     0 
70f     0 
100f     0 
100000f    0 

neden 50f arasında sönümleme lineer bir grup hassasiyet vardır: Yukarıda darbe yöntemi uygulamak ile taşınır gövde üzerinde, bu gözlemler yapmış ve 60f?

+0

Dürtüyi uygulayan kod yararlı olabilir. –

+0

Üzgünüm. Ekledi Bunu reddedenlere karşı koymak için –

+0

+1. Bu meşru bir sorudur. – avpx

cevap

3

Sürüm 2.1a ile aynı sorunu yaşıyorum, b2Settings.as içinde 128 satırını değiştirmenin yardımcı olabileceğini öğrendim. Statik genel yapıyı değiştir b2_maxTranslation: Number = 2.0 ile daha yüksek bir sayı. bunun doğru yol olmadığından emin olun, ancak şu anda doğru bir şekilde nasıl yapılacağını gerçekten bilmiyorum.

+0

vay. Bu garip ama düzeltildi. –

+8

Bugün bu problemle karşılaştım, ancak Box2D'nin C++ sürümünü kullanıyordum. Yorumlar şu şekildedir: "Bir gövdenin maksimum doğrusal hızı. Bu sınır çok büyüktür ve sayısal sorunları önlemek için kullanılır. Bunu ayarlamanıza gerek yoktur."Simülasyonum 1 piksele eşit 1 Box2D birimine ayarlandı. Hız sorunuyla aynı problemi yaşıyordum. Box2D gibi sesler simülasyonunuzu daha küçük bir ölçekte tutmanızı seviyor. – don

+0

Evet, bunu yapabilirsiniz, ama .. doğru yol Robert'ın yanıta bakın –

14

Bu sorunu düzeltmenin yolu bu değil. Nesnelerinizi box2D dünyasında oluştururken küçültmeniz gerekiyor. Sonra, box2D'nin sizi dünyanızın büyüklüğüne geri verdiği bilgiyi ölçekleyebilirsiniz.

Örneğin, dünyamdaki bir kutunun 120 piksel uzunluğunda olduğunu varsayalım. Nesneyi 30 kez küçültmüş olsaydım, bu yüzden box2d tarafından düzgün olarak simüle edilebilirse, box2D dünyasındaki kutumun uzunluğu 4 "piksel" uzunluğunda olur (120/30 veya nesnenizin/ölçeğin boyutu). Şimdi, box2D'nin kutumun box2d dünyasında 3 "piksel" taşıdığını hesaplayalım. Daha sonra bu bilgiyi alıp dünyanın büyüklüğüne geri getirebilirim, bu da kutunun sadece 90 piksel taşıdığı anlamına gelir (3 * 30). Umarım bu çok kafa karıştırıcı gelmiyordu. Genellikle kendimi açıklamakta zorlanıyorum.

+0

Ben aynı sorunu vardı ve benim simülasyon sabit şeylerin boyutunu küçültme –

+5

1 Box2D kılavuzuna Gönderen:.. "Box2D MKS birimleri için ayarlanmıştır. Hareketli nesnelerin büyüklüğünü kabaca 0,1 ila 10 metre arasında tutun. Ortamınızı ve oyuncularınızı oluştururken bazı ölçekleme sistemini kullanmanız gerekir. Box2D test yatağı bunu bir OpenGL viewport dönüşümü kullanarak yapar. "Motor ünitelerini örneğin kendi birimlerinize referans vermek için HelloWorld kullanın. –