gpt4 book ai didi

playn - 如何在 PlayN 中正确地向 body 施加扭矩或角脉冲?

转载 作者:行者123 更新时间:2023-12-02 05:33:57 26 4
gpt4 key购买 nike

我一直在尝试对 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com