2010-04-05 80 views
8

我想我已經配置Box2d對任何物體都有某種最大速度,但我不確定。我應用了像(100000000, 100000000)這樣的衝動,身體的移動速度與(100, 100)一樣快 - 這並不是那麼快。Box2d:最大可能的線速度?

我正在使用Box2d XNA C#端口。

我的遊戲是自上而下的2d。

下面是一些代碼,可能是相關的:

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); 

    //... 
     } 

這裏是適用的衝動一些示例代碼:

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_CONSTANT1000f1000000000f任何地方,玩家可以移動最多(-120, -120)(120, 120)。如果常數較少,如1f,則玩家移動速度會更慢。

這段代碼是用來建立物理的一切在遊戲世界:

 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); 

莫非可能是線性衰減?我將它從10.0f改爲0,沒有任何效果。

UPDATE:怪誕與線性阻尼:我已就被移動與主體這些觀察的應用上面脈衝法:

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

爲什麼有線性50f之間阻尼的範圍內的靈敏度的和60f

+0

應用衝動的代碼可能很有用。 – 2010-04-05 02:59:23

+0

對不起。添加它。 – 2010-04-05 03:09:37

+0

+1以抵制投票人的投票。這是一個合理的問題。 – avpx 2010-04-05 03:24:47

回答

3

我有版本2.1a相同的問題 我發現在b2Settings.as中更改128行可以提供幫助。 將靜態公共常量b2_maxTranslation:Number = 2.0更改爲更高的數字。 確定這不是正確的方式,但現在不知道如何正確地做到這一點。

+0

哇。這很奇怪,但它修復了它。 – 2010-04-06 16:47:19

+8

我今天剛剛遇到了這個問題,除了我使用的是Box2D的C++版本。評論內容如下:「一個物體的最大線速度,這個極限值非常大,用於防止數值問題,你不需要調整它。「我的模擬設置爲1像素等於1 Box2D單位,我遇到了與速度限制相同的問題,聽起來像Box2D喜歡讓你的模擬保持在較小的範圍內 – don 2010-05-27 22:36:21

+0

是的,你可以做到這一點,但它不是正確的方法請參閱Robert的答案 – 2011-08-02 09:44:42

14

這不是解決這個問題的方法。在box2D世界中創建對象時,應該縮小對象的大小。然後,您可以將box2D提供給您的信息縮放到您的世界的大小。

比方說,我的世界中的一個盒子的長度是120像素。如果我將物體縮小了30倍,以便它可以被box2d正確模擬,那麼box2D世界中我的箱子的長度將是4「像素」(120/30或物體/比例的大小)。現在,假設box2D計算出我的盒子在box2d世界中移動了3個「像素」。然後,我可以獲取這些信息並將其縮放到我的世界大小,這意味着該盒子剛剛移動了90個像素(3 * 30)。我希望這聽起來不太混亂。我通常很難解釋自己。

+0

我遇到了同樣的問題,並且縮小了模擬固定事物的尺寸 – 2011-03-14 17:36:10

+5

+1。從Box2D手冊:「Box2D針對MKS單位進行了調整。移動物體的大小保持在0.1到10米之間。渲染環境和演員時,您需要使用一些縮放系統。 Box2D測試平臺通過使用OpenGL視口轉換來實現這一點。「使用引擎示例,例如HelloWorld引用您自己的單位。 – 2011-08-02 10:53:46