libgdx box2d body - 如何通过给定的力或速度,距离和时间移动身体

时间:2016-07-06 17:33:10

标签: java libgdx 2d physics

示例:用球速60 kpH /

射出的大炮

鉴于:(60 kpH) 距离= 60公里, 时间= 1小时

enter image description here

Libgdx:GameWorld

// Given that I am using 1/45.0f step time, the rest iteration velocity 6 and position 2
// Given that 60.00012 kilometres per hour = 16.6667 metres per second
float speed = 16.6667f; //  16.6667 metres per second
Vector2 bulletPosition = body.getPosition();
Vector2 targetPosition = new Vector2(touchpoint.x touchpoint.y);

Vector2 targetDirection = targetPosition.cpy().sub(bulletPosition).scl(speed);

问题: 但我的问题是炮弹没有以我想要的速度移动,我如何记录车身速度以便我可以检查速度是否正确。我只是注意到这是错误的,因为炮弹移动的速度很慢,想象一下60 kpH

PS: 假设上面的图片宽度是5米,高度是3米

body.setLinearVelocity(targetDirection.scl(deltaTime));

问题2: 我不知道如何按给定的速度和步进时间计算力

// Given that F = ma 
Vector2 acceleration = ???
float mass = body.getMass();
Vector2 force = ???
body.applyForces(force);

1 个答案:

答案 0 :(得分:2)

在Box2d中,不是直接施加力而是应用一个脉冲,这是一段时间施加的力,这有效地导致近乎瞬时的加速度。计算你的冲动只是一点物理。

首先我们定义一些变量,F是以牛顿为单位的力,a是加速度,I是脉冲(我们想要计算以应用于Box2d),{{ 1}}是初始速度(米/秒),u是最终速度,v是以秒为单位的时间。

使用牛顿定律和加速定义我们从:

开始

现在我们可以计算出冲动:

在你的情况下,t为0,因为炮弹最初处于静止状态,因此归结为:

就是这样!所以,在你的代码中,你会在炮弹上施加一个等于它的质量乘以所需速度的脉冲。以下代码还包含如何计算touchPoint的方向。

E.g:

u

编辑:回复评论:

归一化向量是单位长度向量,意味着它的大小为1(无论它处于哪个角度)。视觉解释(来自维基百科):

enter image description here

向量float mass = body.getMass(); float targetVelocity = 16.6667f; //For 60kmph simulated Vector2 targetPosition = new Vector2(touchpoint.x, touchpoint.y); // Now calculate the impulse magnitude and use it to scale // a direction (because its 2D movement) float impulseMag = mass * targetVelocity; // Point the cannon towards the touch point Vector2 impulse = new Vector2(); // Point the impulse from the cannon ball to the target impulse.set(targetPosition).sub(body.getPosition()); // Normalize the direction (to get a constant speed) impulse.nor(); // Scale by the calculated magnitude impulse.scl(impulseMag); // Apply the impulse to the centre so there is no rotation and wake // the body if it is sleeping body.applyLinearImpulse(impulse, body.getWorldCentre(), true); d1都是单位向量,因此称为规范化。在d2中,Vector2函数通过将矢量保持在相同的角度但使其大小为1来使矢量归一化。如下图所示(蓝色是原始矢量,绿色是标准化后):

enter image description here

对于你的游戏来说,重点在于无论玩家是否接触到非常接近或远离炮弹的屏幕,炮弹都以相同的速度行进,重要的是与大炮的角度。