[英]libGDX: Box2D velocity not increasing enough
如果有一個游戲項目正在使用box2d。 現在,在我的MovementSystem中(我使用的是基於實體組件的方法),我希望Box2D根據控件設置的所需速度將對象向四周移動。
不幸的是,速度似乎永遠不會變得很高。 做一個即使當applyLinearImpulse
用的速度矢量(期望速度) 245044.23
每個軸例如,所得到的主體的速度剛剛成為一些有關90.0
。 我做錯了什么? 有限制嗎?
這是我運行速度更新和世界步的代碼:
//************************
// physics-system
//************************
public void update(float deltaTime) {
float frameTime = Math.min(deltaTime, 0.25f);
accumulator += frameTime;
if (accumulator >= MAX_STEP_TIME) {
world.step(MAX_STEP_TIME, 6, 2);
accumulator -= MAX_STEP_TIME;
for (Entity entity : entities) {
TransformComponent transform = tim.get(entity);
BodyComponent bodyComp = bod.get(entity);
VelocityComponent velocity = vel.get(entity);
Vector2 bodyVelocity = bodyComp.body.getLinearVelocity();
float velChangeX = velocity.horizontalVelocity - bodyVelocity.x;
float velChangeY = velocity.verticalVelocity - bodyVelocity.y;
float impulseX = bodyComp.body.getMass() * velChangeX;
float impulseY = bodyComp.body.getMass() * velChangeY;
bodyComp.body.applyLinearImpulse(new Vector2(impulseX, impulseY), bodyComp.body.getWorldCenter(),
false);
// update transform
Vector2 position = bodyComp.body.getPosition();
transform.x = (int) position.x;
transform.y = (int) position.y;
// slowingdownVelocitys(velocity);
}
}
}
這是我目前唯一具有box2D-Component(稱為BodyComponent)的實體的定義:
Entity entity = new Entity();
//...
BodyComponent bodyComponent = new BodyComponent();
BodyDef bodyDef = new BodyDef();
bodyDef.type = BodyDef.BodyType.DynamicBody;
bodyDef.position.set(transformComponent.getX(), transformComponent.getY());
bodyComponent.body = GameManager.getB2dWorld().createBody(bodyDef);
bodyComponent.body.applyAngularImpulse(50f, true);
CircleShape circle = new CircleShape();
circle.setRadius(2f);
FixtureDef fixtureDef = new FixtureDef();
fixtureDef.shape = circle;
fixtureDef.density = 10f;
fixtureDef.friction = 0.4f;
fixtureDef.restitution = 0.6f; // Make it bounce a little bit
bodyComponent.body.createFixture(fixtureDef);
circle.dispose();
entity.add(bodyComponent);
//...
Box2D確實限制了速度。 基本上存在極限是為了避免浮點運算的不准確性。 正如您所發現的245044.23
,速度為245044.23
(步長為1/60秒)遠高於此限制。 如果您可以將步進時間降低為每秒1/200000秒,則可以每秒模擬245044.23米,但我認為我們大多數人都難以實時運行它。 以每秒60步的步速(每個步僅為模擬秒的1/60),由於Box2D單位基本上是MKS單位(米,千克,秒),因此您所說的速度約為每步4084米。 同時,將速度限制限制為每步2米(通過b2_maxTranslation
)。 可以增加此限制,但是隨着限制的增加,您更有可能看到較少的類似於物理的行為,例如隧道。
至於您做錯了什么,除了嘗試使用比Box2D可以處理的速度更高的速度之外,通常您所描述的問題都是所用視覺縮放的結果。 請記住,Box2D的位置以米為單位,而我們的大多數顯示器(水平或垂直方向)都比米小得多。 Box2D FAQ 關於像素縮放的說法是這樣的 :
假設您有一個用於100x100像素的角色的精靈。 您決定使用0.01的比例因子。 這將使角色物理框變為1m x 1m。 因此,制作一個1x1的物理盒子。 現在,假設字符從像素坐標(345,679)開始。 因此,將物理框定位在(3.45,6.79)。 現在模擬物理世界。 假設角色物理框移動到(2.31,4.98),因此將角色精靈移動到像素坐標(231,498)。 現在,唯一棘手的部分是選擇比例因子。 這確實取決於您的游戲。 您應該嘗試使移動的物體在0.1-10米的范圍內,最佳位置是1米。
您要回答的問題是使用何種縮放比例,以便Box2D可以處理的物理速度可以以可見的方式轉換為視覺效果。 在1/60秒(每步)的步進模擬中,Box2D將要處理的速度極限是每秒+/- 120米。 但是,通過巧妙地使用世界坐標和圖形坐標之間的縮放比例,可以達到每秒120個距離單位,在這種情況下,您可以將距離單位設置為千米或兆米或其他任何單位。
請注意,真正慢b2_velocityThreshold
也會帶來問題-例如遇到碰撞響應的速度閾值( b2_velocityThreshold
)。
希望這可以幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.