作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在尝试对 PlayN 中的 Body 对象应用角度脉冲,但无济于事。无论我输入哪个值(径向), 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 方法的结果。
最佳答案
我调试了一些,得出的结论是我一直使用的值太低了。在查看 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 的惯性纳入角冲量计算。像这样:
body.applyAngularImpulse(speedValue * body.getInertia());
惯性对我来说往往是一个高值 (+4000)。
希望这对其他在应用角脉冲或扭矩方面有困难的人有所帮助。
关于playn - 如何在 PlayN 中正确地向 body 施加扭矩或角脉冲?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11968941/
我是一名优秀的程序员,十分优秀!