Box2D。试图了解需要多少力量
Box2D. Trying to understand how much force is needed
我正在尝试了解移动物体所需的力量。这就是我的世界设置和物理步骤完成的方式
private void setupWorld() {
mWorld = new World(new Vector2(0f, -9.8f), true);
BodyDef bodyDef = new BodyDef();
bodyDef.type = BodyDef.BodyType.DynamicBody;
bodyDef.position.set(x, y);
body = world.createBody(bodyDef);
PolygonShape box=new PolygonShape();
box.setAsBox(1,1);
FixtureDef fixtureDef = new FixtureDef();
fixtureDef.shape = box;
fixtureDef.density = 1f;
fixtureDef.friction = 0.0f;
fixtureDef.restitution = 0.0f;
Fixture fixture = body.createFixture(fixtureDef);
box.dispose();
}
private void doPhysicsStep(float deltaTime) {
float frameTime = Math.min(deltaTime, 0.25f);
accumulator += frameTime;
while (accumulator >= TIME_STEP) {
body.applyForceToCenter(new Vector2(0, 10f), true);
world.step(TIME_STEP, VELOCITY_ITERATIONS, POSITION_ITERATIONS);
accumulator -= (TIME_STEP);
}
}
所以我有一个密度为 1 的 1x1 盒子。重力设置为 -9.8,我希望当我对我的盒子施加大于重力的力时(在本例中我已经将它设置为 10) 盒子应该开始向上移动。
但是盒子没有动。在开始移动盒子之前,我必须将力设置为大约 80(即 body.applyForceToCenter(new Vector2(0, 80f), true);
)。
我认为这是由于我的时间步长(我目前设置为 1/60f)所致,但如果考虑到这一点会减少我在每一步中施加的力。
谁能解释一下我算错了什么?
您的盒子的质量是 4,而不是 1,因为在方法中 setAsBox(float hx, float hy)
hx
表示所需宽度的一半,而 hy
表示所需高度的一半。因此,如果您想要一个 1 x 1 的盒子,您将调用 setAsBox(0.5F, 0.5F)
。
但这并不能解释为什么需要 80 的力才能移动它,因为 50 的力应该足以产生差异。
Fg = m * g = 9.8 * 4 = 39.2
在我对质量为 4 的物体的测试项目中,即使以编程方式应用 40 的力也很明显(应用程序启动和按下按钮的延迟很明显,所以我避免了)。
我正在尝试了解移动物体所需的力量。这就是我的世界设置和物理步骤完成的方式
private void setupWorld() {
mWorld = new World(new Vector2(0f, -9.8f), true);
BodyDef bodyDef = new BodyDef();
bodyDef.type = BodyDef.BodyType.DynamicBody;
bodyDef.position.set(x, y);
body = world.createBody(bodyDef);
PolygonShape box=new PolygonShape();
box.setAsBox(1,1);
FixtureDef fixtureDef = new FixtureDef();
fixtureDef.shape = box;
fixtureDef.density = 1f;
fixtureDef.friction = 0.0f;
fixtureDef.restitution = 0.0f;
Fixture fixture = body.createFixture(fixtureDef);
box.dispose();
}
private void doPhysicsStep(float deltaTime) {
float frameTime = Math.min(deltaTime, 0.25f);
accumulator += frameTime;
while (accumulator >= TIME_STEP) {
body.applyForceToCenter(new Vector2(0, 10f), true);
world.step(TIME_STEP, VELOCITY_ITERATIONS, POSITION_ITERATIONS);
accumulator -= (TIME_STEP);
}
}
所以我有一个密度为 1 的 1x1 盒子。重力设置为 -9.8,我希望当我对我的盒子施加大于重力的力时(在本例中我已经将它设置为 10) 盒子应该开始向上移动。
但是盒子没有动。在开始移动盒子之前,我必须将力设置为大约 80(即 body.applyForceToCenter(new Vector2(0, 80f), true);
)。
我认为这是由于我的时间步长(我目前设置为 1/60f)所致,但如果考虑到这一点会减少我在每一步中施加的力。
谁能解释一下我算错了什么?
您的盒子的质量是 4,而不是 1,因为在方法中 setAsBox(float hx, float hy)
hx
表示所需宽度的一半,而 hy
表示所需高度的一半。因此,如果您想要一个 1 x 1 的盒子,您将调用 setAsBox(0.5F, 0.5F)
。
但这并不能解释为什么需要 80 的力才能移动它,因为 50 的力应该足以产生差异。
Fg = m * g = 9.8 * 4 = 39.2
在我对质量为 4 的物体的测试项目中,即使以编程方式应用 40 的力也很明显(应用程序启动和按下按钮的延迟很明显,所以我避免了)。