gpt4 book ai didi

java - libGDX:Box2D 速度没有增加足够

转载 作者:行者123 更新时间:2023-11-30 02:28:37 25 4
gpt4 key购买 nike

如果有一个我正在使用 box2d 的游戏项目。现在在我的运动系统(我使用基于实体组件的方法)中,我希望 Box2D 根据控件设置的所需速度来移动我的对象。

不幸的是,速度似乎永远不够高。即使在做applyLinearImpulse时速度 vector (所需速度)为 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 组件(称为 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 确实限制速度。该限制基本上是为了避免 floating point arithmetic 的不准确。 。正如您所发现的,步长时间为 1/60 秒的速度 245044.23 远高于此限制。如果您可以将步长时间降低到 1/200000 秒,您可以模拟每秒 245044.23 米,但我认为我们大多数人都很难实时运行它。在每秒 60 步的步速下(每步仅为模拟秒的 1/60),您所说的速度约为每步 4084 米,因为 Box2D 单位基本上是 MKS 单位(米、千克、秒)。同时,每步的速度限制为每步 2 米(通过 b2_maxTranslation)。此限制可以增加,但随着限制的增加,您更有可能看到更少的物理行为,例如隧道。

至于你做错了什么,除了尝试使用高于 Box2D 可以处理的速度之外,通常像你所描述的问题是所使用的视觉缩放的结果。请记住,Box2D 位置以米为单位,而我们的大多数显示器都比米小得多(无论是水平还是垂直方向)。 Box2D 常见问题解答有这样的说法 about scaling in terms of pixels :

Suppose you have a sprite for a character that is 100x100 pixels. You decide to use a scaling factor that is 0.01. This will make the character physics box 1m x 1m. So go make a physics box that is 1x1. Now suppose the character starts out at pixel coordinate (345,679). So position the physics box at (3.45,6.79). Now simulate the physics world. Suppose the character physics box moves to (2.31,4.98), so move your character sprite to pixel coordinates (231,498). Now the only tricky part is choosing a scaling factor. This really depends on your game. You should try to get your moving objects in the range 0.1 - 10 meters, with 1 meter being the sweet spot.

您要回答的问题是使用什么缩放比例,以便 Box2D 可以处理的物理速度可以以仍然可见的方式转化为视觉效果。在 1/60 秒(每步)的步进模拟中,Box2D 将处理的速度限制为 +/- 120 米每秒。但是,通过巧妙地使用世界坐标和图形坐标之间的缩放,这可能类似于每秒 120 个距离单位,您可以将距离单位设置为公里或太米或其他任何单位。

请注意,速度过慢也会带来问题 - 例如达到碰撞响应的速度阈值 (b2_velocityThreshold)。

希望这有帮助!

关于java - libGDX:Box2D 速度没有增加足够,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44866044/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com