我正在用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()
函数。还是有另一种解决方案吗?
答案 0 :(得分:1)
我不认为您会喜欢以下答案(我不会)。除了修改C ++ Box2D源代码和与之接口的Java源代码之外,我还没有意识到比以下建议更好的处理方法。
<强>解释强>
查看Box2D源代码,正文上的扭矩存储在其m_torque
成员变量中。通过调用Java applyTorque
方法,此变量会增加。同时,m_torque
变量 没有公开方式来获取其当前值 。当我最初试图回答你的问题时,我发现(即确认你已经发现的声音)让我感到惊讶。
这个变量的唯一用途是在Box2D的岛屿求解器代码中,它用于增加身体的角速度。它虽然被b2Island
类直接使用,但是b2Body
类的朋友类。
解决#1
OTOH,调用世界步骤方法,默认调用世界清除力方法。这反过来会重置所有的身体。扭矩回到0.这意味着给定步骤之后的扭矩可以从该步骤的增量时间,车身的转动惯量和车身的角速度确定。所有这些都可以通过公共方法访问。
从这些值计算扭矩这些可以访问的值可能是通过一些数学运算来实现的:torque = I * w / h
(其中I
是从质量数据方法访问的物体的转动惯量, w
是从获取角速度方法访问的角速度,h
是步长的时间增量)。这假设您的身体的角度阻尼设置为零(默认情况下)。这对我来说似乎相当丑陋,至少比我的第二个解决方案更丑陋。
解决#2
我处理缺少扭矩 getter 的方法是手动跟踪我在世界台阶之间施加在身体上的总扭矩,并且只是咬一口。然后使用那个值。
如果您需要,可以在正文的用户数据字段中跟踪此总和值,如果您还没有将其用于其他内容。当然还有其他方法可以跟踪它,但没有一个是优雅的IMO。