我正在用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源代码和与其接口的Java源代码之外,我不知道有比以下建议更好的方法。
说明:
查看Box2D源代码,将物体上的扭矩存储在其m_torque
成员变量中。通过调用Java applyTorque
方法,此变量将递增。同时,m_torque
变量没有公开的方法来获取其当前值。最初尝试回答您的问题时,发现(即确认您已经发现的声音)令我感到惊讶。
此变量的唯一用途是在Box2D的孤岛求解器代码中,该代码用于增加物体的角速度。尽管它是b2Island
类的朋友类的b2Body
类直接使用的。
解决#1
OTOH调用world step方法,默认情况下调用world clear force方法。这进而将所有物体的扭矩重置为0。这意味着可以根据该步骤的增量时间,物体的旋转惯性和物体的角速度确定给定步骤之后的扭矩。所有这些都可以通过公共方法进行访问。
从这些可以访问的值中计算出扭矩可能是通过以下数学运算实现的:torque = I * w / h
(其中I
是通过获取质量数据方法访问的物体的旋转惯性,w
是角速度可以从get-angular-velocity方法访问,而h
是步骤的时间增量)。假设您的身体的角度阻尼设置为零(默认情况下为零)。但是,这对我来说似乎很丑,至少比我的第二个解决方案更丑。
解决#2
我要解决的缺乏扭矩吸收器的方法是,手动跟踪世界步之间我施加在身体上的总扭矩,然后咬住子弹,然后使用该值。
如果需要,可以在主体的用户数据字段中跟踪该总和值(如果尚未将其用于其他用途)。当然,还有其他方法可以跟踪它,但是没有一种方法是优雅的IMO。