如何在特定 body 上应用重力

How to apply gravity on specific body

将重力应用到物理世界很容易,您只需创建一个 Vector2 并设置其水平和垂直重力值。如果我想创建一个零重力的 top-down 2D 游戏,并且只将重力应用于特定的 body,就像箭头的抛射运动一样。当然,如果您首先将您的世界设置为具有重力,则很容易产生抛射运动。

float GRAVITY_EARTH = -9.8f;
Vector2 gravity = new Vector2(0, GRAVITY_EARTH);
World world = new World(gravity, true);

Box2d body class有取消或反转重力的方法,但我不想每次都使用它,就像下面的代码示例。

body.setGravityScale(0); // set 0 to cancel the gravity, and set -1 to reverse the gravity

但我想多才多艺,我只想将引力应用到特定的body。例如,我正在使用 setLinearVelocity 方法将 body 移动到特定目的地。现在,如果世界的重力 y 为 -9.8f,它将自动进行抛射运动。

Vector2 initialVelocity = targetPoint.sub(originPoint).nor();
initialVelocity.scl(speed); // to apply constant speed
body.setLinearVelocity(initialVelocity);

我尝试将 y 的初始速度增加到 -9.8 以应用重力。但是它没有用,我错过了什么?

initialVelocity.y += -9.8f;
body.setLinearVelocity(initialVelocity);

// or 

body.applyForce(initialVelocity, body.getWorldCenter(), true);

你必须在每一步都施加反作用力来抵消重力。

其他选项请参见 this question 的答案。

重力是一种力,而不是速度。 调用类似

Vector2 gravity = new Vector2(0, GRAVITY_EARTH);
body.applyForceToCenter(gravity, true);

在步骤函数中应该这样做。请注意,您需要在每一帧都施加力,因为它们已被清除。