我一直在尝试将角度脉冲应用到PlayN中的Body对象,但无济于事。无论我输入哪个值(径向),身体的角度都不会改变。我试图设置扭矩也没有结果。
不起作用的示例代码:
BodyDef def = new BodyDef();
def.type = BodyType.DYNAMIC;
Body body = world.createBody(def);
float degToRad = (float) (180 / Math.PI);
float radials = (float) (50 / degToRad);
// None of the following options work.
body.applyAngularImpulse(radials); // Immediate angular change.
body.applyTorque(radials); // Angular change over time.
如何在不手动设置角速度的情况下(例如使用setAngularVelocity)获取有效的身体对象来更改其角度?
提前致谢!
我注意到通过调用setWake方法来重置扭矩和角速度,我从不手动操作,但它由Island类调用:
public void setAwake(boolean flag) {
...
m_angularVelocity = 0.0f;
m_torque = 0.0f;
...
}
注意:设置角速度不是一个选项,因为我依赖于物理模拟。我找到了article for Box2D angle rotation,但它没有改变applyAngularImpulse方法的结果。
答案 0 :(得分:2)
我调试了一些,并得出结论我一直使用的价值太低了。在浏览applyAngularImpulse代码时,我注意到了一些事情:
public void applyAngularImpulse(float impulse) {
if (m_type != BodyType.DYNAMIC) {
return;
}
if (isAwake() == false) {
setAwake(true);
}
m_angularVelocity += m_invI * impulse;
}
m_invI 是一个非常低的值,类似于 2.44882598E-4 ,所以如果我使用太低的值,那就没有明显效果了。如果计算问题示例中的脉冲乘以 m_invI 字段:
m_invI = 0.00044882598 = 2.449E-4
impulse = 50 / 180 / PI = 0.08841941282 = 8.842E-2
m_invI * impulse = 2.449E-4 * 8.842E-2 = 0.00002165237 = 2.165E-5 <--
这意味着每个更新周期只有一个 0.00002165237 的角速度增量......这太低而且看起来不太明显。
此外,在浏览Box2D论坛以寻找类似情况时,我发现最佳做法是将身体的惯性包含在角度脉冲计算中。像这样:
body.applyAngularImpulse(speedValue * body.getInertia());
惯性对我来说往往是一个很高的值(+4000)。
希望这对那些在施加角度冲击或扭矩方面遇到困难的人有所帮助。
答案 1 :(得分:2)
在我的情况下,我忘了打电话
body.setFixedRotation(false);
即使我设定了质量,也报告了0的惯性,忽略了所有扭矩和角度脉冲。
显然它默认是固定的。
答案 2 :(得分:0)
我遇到了同样的问题。
在我的情况下,我意外地将我的点按顺序排列(导致负面积和零质量)。这是我的错误代码:
func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
看起来像CCW,对吗?不,不在我的坐标系中(+ Y下降)。
// incorrect version
triangleVertices.push(new B2Vec2(width / 2, 0.0)); // top
triangleVertices.push(new B2Vec2(0.0, height)); // left
triangleVertices.push(new B2Vec2(width, heightM)); // right