Java 如何在Box2D中获得车身的扭矩?

Java 如何在Box2D中获得车身的扭矩?,java,libgdx,box2d,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 } } 但是如果你在车在空中的时候按这个键,扭矩就会变大。

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

public void handleInput(){
    if(Gdx.input.isKeyPressed(Input.Keys.D)){
        wheelBody.applyTorque(-100f, true); //Add torque when 'D' is pressed
    }
}
但是如果你在车在空中的时候按这个键,扭矩就会变大。当车轮触地时,汽车就会向前发动。我可以通过使用
MAX_TORQUE
值来避免这种情况。扭矩只有在低于
最大扭矩时才会增加


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

我想你不会喜欢下面的答案(我不喜欢)。我不知道有什么更好的方法来处理这一点,而不是修改C++的BOX2D源代码和与之接口的java源代码。 说明:

查看Box2D源代码,车身上的扭矩存储在其
m_扭矩
成员变量中。通过调用Java
applyTorque
方法,该变量会递增。同时,
m_-torque
变量没有公共途径获取其当前值。当我最初试图回答你的问题时,我惊讶地发现(即,确认你已经发现了什么)

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

解决问题#1

OTOH调用world step方法,默认情况下调用world clear forces方法。这反过来会将所有实体的扭矩重置回0。这意味着给定步骤后的扭矩可以通过该步骤的增量时间、物体的转动惯量和物体的角速度来确定。所有这些都可以通过公共方法访问

根据这些可访问的值计算扭矩值可能通过以下数学方法实现:
torque=I*w/h
(其中,
I
是通过获取质量数据方法访问的物体的转动惯量,
w
是通过获取角速度方法访问的角速度,
h
是阶跃的时间增量)。这假设物体的角阻尼设置为零(默认情况下为零).但这对我来说似乎很难看,至少比我的第二个解决方案更难看

解决方案#2

我处理缺少扭矩吸收器的方法是,手动跟踪我在世界步之间施加在身体上的总扭矩,然后咬紧牙关使用该值

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