java - 如何在Box2D中获取Body的扭矩大小?

标签 java libgdx box2d

我正在使用 Box2D 制作 LibGDX 游戏。我有一辆汽车,当按下按键时,后轮会获得一些额外的扭矩,以便加速。汽车通过关节与车轮连接。

public void handleInput(){
    if(Gdx.input.isKeyPressed(Input.Keys.D)){
        wheelBody.applyTorque(-100f, true); //Add torque when 'D' is pressed
    }
}

但是如果你在汽车在空中的时候按下按键,扭矩就会变得很大。当车轮接触地面时,汽车向前发动。我可以通过使用 MAX_TORQUE 值来避免这种情况。仅当扭矩低于 MAX_TORQUE 时,扭矩才会增加。

但是我如何“测量”车轮上当前的扭矩大小?我还没有找到wheelBody.getTorque()函数。或者还有其他解决方案吗?

最佳答案

我认为您不会喜欢以下答案(我不喜欢)。除了修改 C++ Box2D 源代码和与其接口(interface)的 Java 源代码之外,我不知道还有比以下建议更好的方法来处理此问题。

说明:

查看 Box2D 源代码,物体上的扭矩存储在其 m_torque 成员变量中。通过调用 Java applyTorque 方法,该变量会增加。同时,m_torque 变量没有公共(public)方法来获取其当前值。当我最初尝试回答您的问题时,我惊讶地发现了这一点(即确认听起来您已经发现了什么)。

此变量的唯一用途是在 Box2D 的岛屿解算器代码中,用于增加主体的角速度。它由 b2Island 类直接使用,该类是 b2Body 类的友元类。

解决#1

OTOH,调用世界步骤方法,默认调用世界清除力方法。这反过来会将所有物体的扭矩重置回 0。这意味着给定步骤之后的扭矩可以根据该步骤的增量时间、物体的旋转惯量和物体的角速度来确定。所有这些都可以通过公共(public)方法访问。

根据可访问的值计算扭矩可能是通过一些数学计算来实现的,例如:torque = I * w/h(其中I是旋转通过获取质量数据方法获取的物体惯性,w 是通过 get-angle-velocity 方法获取的角速度,h 是物体的时间增量步)。然而,假设您的 body 将其角度阻尼设置为零(默认情况下)。不过,这对我来说似乎相当丑陋,至少比我的第二个解决方案丑陋。

解决#2

我处理缺乏扭矩getter的方法是手动跟踪我在世界步骤之间施加在 body 上的扭矩总和,然后咬紧牙关然后使用该值。

如果需要,您可以在正文的用户数据字段中跟踪此总和值(如果您尚未将其用于其他用途)。当然还有其他方法可以跟踪它,但在我看来,没有一种方法是优雅的。

关于java - 如何在Box2D中获取Body的扭矩大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48136333/

相关文章:

java - 警告 : Exception encountered during context initialization - cancelling refresh attempt

java - 如何在命令行中将参数传递给testng?

java - 剪耳三角器崩溃

java - 在 libgdx 中渲染 box2d

java - 移动平台对象 - 使用 box2D 的 Android 游戏

java - 阅读 DER 应用程序特定 (asn1-java-bouncycaSTLe)

java - 从对象列表中更改对象属性 - 每个对象都会更改属性

android - Gradle Android 任务因错误不明而崩溃

具有多个倾斜集的 Libgdx AtlasTmxMapLoader

android - AndEngine:注册和注销物理连接器的问题