Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何为libgdx/box2d中的特定实体强制执行最大速度?_Java_Box2d_Libgdx - Fatal编程技术网

Java 如何为libgdx/box2d中的特定实体强制执行最大速度?

Java 如何为libgdx/box2d中的特定实体强制执行最大速度?,java,box2d,libgdx,Java,Box2d,Libgdx,我正在通过Libgdx使用Box2D创建一个场景。我有一个场景,我想使用applyForce(方向会不时改变)不断推动特定对象,但只能达到给定的速度 想象一个由火箭发动机推动的圆形物体(四面都有喷嘴),单位为零克,以供说明 有没有一种方法可以做到这一点,而无需重新计算施加的力,或每次更新时重复计算?我只知道如何为所有对象设置最大速度。目前我最好的办法是以某种方式使用linearDamping,但我希望有一个更简单的解决方案。您可以使用SetLinearVelocity覆盖当前速度 b2Vec2

我正在通过Libgdx使用Box2D创建一个场景。我有一个场景,我想使用
applyForce
(方向会不时改变)不断推动特定对象,但只能达到给定的速度

想象一个由火箭发动机推动的圆形物体(四面都有喷嘴),单位为零克,以供说明


有没有一种方法可以做到这一点,而无需重新计算施加的力,或每次更新时重复计算?我只知道如何为所有对象设置最大速度。目前我最好的办法是以某种方式使用
linearDamping
,但我希望有一个更简单的解决方案。

您可以使用SetLinearVelocity覆盖当前速度

b2Vec2 vel = body->GetLinearVelocity();
float speed = vel.Normalize();//normalizes vector and returns length
if ( speed > maxSpeed ) 
    body->SetLinearVelocity( maxSpeed * vel );
===============

编辑: 简单的空气阻力可以通过在相反的行驶方向上施加一个小的阻力来建模,该阻力随行驶速度成比例

b2Vec2 vel = body->GetLinearVelocity();
body->ApplyForce( 0.05 * -vel, body->GetWorldCenter() );
阻力的比例值(本例中为0.05)确定了阻力等于火箭发动机施加的力的速度,两个力相互抵消,从而获得最高速度

maxSpeed = thrustForce.Length() / 0.05;
纯粹主义者会指出,阻力实际上是相对于速度的平方的,所以更准确地说,你可以这样做:

b2Vec2 vel = body->GetLinearVelocity();
float speed = vel.Normalize(); //normalizes vector and returns length
body->ApplyForce( 0.05 * speed * speed * -vel, body->GetWorldCenter() );
。。。我想这会让你以最快的速度

maxSpeed = sqrtf( thrustForce.Length() / 0.05 );

这可能会奏效,但在我看来更不可取,因为每次更新都会引入额外的计算。另外,对于动态实体,不应该避免调用像
setVelocity
这样的方法吗?它肯定会起作用,因为这与您在问题中提到的Box2d强制执行最大速度限制的方式相同。也许这些计算并不像你想象的那么困难。。。是的,如果你想要真实的物理,通常不建议直接设置速度,但这不是你在这里要做的。关于真实性,我正在尝试模拟空气阻力;)。。。但你可能是对的,我可能想得太多了。我将检查此解决方案。我发现我忘记添加后续。不幸的是,这个解决方案不适合我,因为我希望对象保持其惯性,使用这个答案将迫使我手动重新计算。我明白了,所以你不希望突然对速度施加硬限制。我补充了一些关于空气阻力的想法。