gpt4 book ai didi

java - 线性脉冲值

转载 作者:行者123 更新时间:2023-12-01 18:37:42 26 4
gpt4 key购买 nike

我正在使用 Box2D 创建自己的游戏应用程序,但遇到了一些问题。我设法渲染我想要的每个 body ,移动它们,但我必须付出很高的代价才能正确移动它们。例如,这是我的玩家主体定义:

    bodyDefPlayer = new BodyDef();
bodyDefPlayer.type = BodyType.DynamicBody;
bodyDefPlayer.position.set(positionX, (positionY * tileHeight) + 50);
playerBody = world.createBody(bodyDefPlayer);
polygonPlayer = new PolygonShape();
polygonPlayer.setAsBox(50, 50);
fixturePlayer = new FixtureDef();
fixturePlayer.shape = polygonPlayer;
fixturePlayer.density = 0.8f;
fixturePlayer.friction = 0.5f;
fixturePlayer.restitution = 0.0f;
playerBody.createFixture(fixturePlayer);
playerBody.setFixedRotation(true);

这就是我必须如何运用我的冲动来感动他:

    Vector2 vel = this.player.playerBody.getLinearVelocity();
Vector2 pos = this.player.playerBody.getWorldCenter();
player.playerBody.applyLinearImpulse(new Vector2(vel.x + 20000000, vel.y * 1000000), pos, true);

正如你所看到的,我的值相当高,而且玩家在下降时不会做曲线,而是在可以的情况下直线下降。

我想得到一些帮助:)

谢谢!

最佳答案

当您应该只施加力时,您似乎正在使用线性脉冲。线性脉冲用很大的力“撞击”物体,使其产生巨大的瞬时速度。如果您击打高尔夫球(用力大、时间短)或模拟发射的子弹,这很好,但对于真实 body 的运动来说,它看起来不太好。

这是我在实体上使用的函数,实体是一个用于保存 box2D 主体并向主体施加控制力的类。在这种情况下,这个函数ApplyThrust使 body 向目标移动(寻找行为):

   void ApplyThrust()
{
// Get the distance to the target.
b2Vec2 toTarget = GetTargetPos() - GetBody()->GetWorldCenter();
toTarget.Normalize();
b2Vec2 desiredVel = GetMaxSpeed()*toTarget;
b2Vec2 currentVel = GetBody()->GetLinearVelocity();
b2Vec2 thrust = desiredVel - currentVel;
GetBody()->ApplyForceToCenter(GetMaxLinearAcceleration()*thrust);
}

在这种情况下,实体已收到移动到目标位置的命令,该位置会在内部缓存,并且可以使用 GetTargetPos() 恢复。该函数通过生成所需最大速度(朝向目标)和当前速度之间的差 vector 来向主体施加力。如果 body 已经以最大速度朝向目标,则该函数的贡献实际上为 0(相同的 vector )。

请注意,这不会改变主体的方向。实际上有一个单独的函数。

请注意,最初的问题似乎是在 Java 中(libgdx?)。这是在 C++ 中,但总体思想是适用的,并且应该通过使用引用而不是指针等在任何 Box2d 实现中工作。

有一个代码库 samples of doing this located hereYou can read more about this code base in this post 。观看视频...我怀疑它会立即告诉您这是否是您正在寻找的信息。

Normalize 函数应该是 b2Vec2 类的成员:

/// Convert this vector into a unit vector. Returns the length.
float32 b2Vec2::Normalize()
{
float32 length = Length();
if (length < b2_epsilon)
{
return 0.0f;
}
float32 invLength = 1.0f / length;
x *= invLength;
y *= invLength;

return length;
}

这会将 vector 转换为指向同一方向的单位 vector (长度 = 1)。注意这是一个就地操作。它更改了实际的 b2Vec2 对象,但不返回新对象。按照您认为合适的方式适应 Java。

这有帮助吗?

关于java - 线性脉冲值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21173949/

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