我正在使用 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/