如何在 Box2D 中获取 Body 的扭矩量?
How to get the amount of torque of a Body in 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
.
以下才会增加
但是我如何才能 'measure' 当前车轮上的扭矩量?我还没有找到 wheelBody.getTorque()
函数。或者有其他解决方案吗?
我认为您不会喜欢以下答案(我不喜欢)。除了修改 C++ Box2D 源代码和与之接口的 Java 源代码之外,我不知道有比以下建议更好的方法来处理这个问题。
解释:
查看 Box2D 源代码,body 上的扭矩存储在其 m_torque
成员变量中。此变量通过调用 Java applyTorque
方法而递增。同时,m_torque
变量 没有 public 方法来获取其当前值 。最初尝试回答您的问题时,我发现(即确认听起来您已经发现了什么)令我感到惊讶。
这个变量的唯一用途是在 Box2D 的岛解算器代码中用于增加 body 的 angular 速度。 b2Island
class b2Body
class.
的朋友 class 直接使用了它
解决 #1
OTOH,调用world step方法,默认调用world clear forces方法。这反过来将所有物体的扭矩重置为 0。这意味着给定步骤后的扭矩可以根据该步骤的增量时间、body 的转动惯量和 body' 来确定s angular 速度。所有这些都可以通过 public 方法访问。
根据可以访问的这些值计算扭矩可能是通过一些数学运算实现的,例如:torque = I * w / h
(其中 I
是从中访问的 body 的转动惯量获取大量数据方法,w
是从 get-angular-velocity 方法访问的 angular 速度,h
是步骤的时间增量)。假设您的 body 将其 angular 阻尼设置为零(默认情况下)。不过,这对我来说似乎很难看,至少比我的第二个解决方案更难看。
解决 #2
我处理扭矩不足 getter 的方法是手动跟踪我在 [=59 上施加的总扭矩=] 在世界步数和 bite-the-bullet 之间,然后使用该值。
如果需要,您可以在 body 的用户数据字段中跟踪此总和值(前提是您尚未将其用于其他用途)。当然还有其他方法可以跟踪它,但 none 是优雅的 IMO。
我正在使用 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
.
但是我如何才能 'measure' 当前车轮上的扭矩量?我还没有找到 wheelBody.getTorque()
函数。或者有其他解决方案吗?
我认为您不会喜欢以下答案(我不喜欢)。除了修改 C++ Box2D 源代码和与之接口的 Java 源代码之外,我不知道有比以下建议更好的方法来处理这个问题。
解释:
查看 Box2D 源代码,body 上的扭矩存储在其 m_torque
成员变量中。此变量通过调用 Java applyTorque
方法而递增。同时,m_torque
变量 没有 public 方法来获取其当前值 。最初尝试回答您的问题时,我发现(即确认听起来您已经发现了什么)令我感到惊讶。
这个变量的唯一用途是在 Box2D 的岛解算器代码中用于增加 body 的 angular 速度。 b2Island
class b2Body
class.
解决 #1
OTOH,调用world step方法,默认调用world clear forces方法。这反过来将所有物体的扭矩重置为 0。这意味着给定步骤后的扭矩可以根据该步骤的增量时间、body 的转动惯量和 body' 来确定s angular 速度。所有这些都可以通过 public 方法访问。
根据可以访问的这些值计算扭矩可能是通过一些数学运算实现的,例如:torque = I * w / h
(其中 I
是从中访问的 body 的转动惯量获取大量数据方法,w
是从 get-angular-velocity 方法访问的 angular 速度,h
是步骤的时间增量)。假设您的 body 将其 angular 阻尼设置为零(默认情况下)。不过,这对我来说似乎很难看,至少比我的第二个解决方案更难看。
解决 #2
我处理扭矩不足 getter 的方法是手动跟踪我在 [=59 上施加的总扭矩=] 在世界步数和 bite-the-bullet 之间,然后使用该值。
如果需要,您可以在 body 的用户数据字段中跟踪此总和值(前提是您尚未将其用于其他用途)。当然还有其他方法可以跟踪它,但 none 是优雅的 IMO。