4

我想使用 box2djs 模拟弹簧效果。经过大量搜索后,我认为可以使用该距离关节(我不确定)。我尝试了以下代码,但我没有看到身体之间的任何关节。

 distance_joint = new b2DistanceJointDef();

distance_joint.body1 = Body1;

distance_joint.body2 = Body2;

distance_joint.localAnchorA = new b2Vec2(0, 0);

distance_joint.localAnchorB = new b2Vec2(0, 0);

distance_joint.length = 3;

distance_joint.collideConnected = true;

return world.CreateJoint(distance_joint); 

任何想法...

谢谢

4

2 回答 2

5

你是对的,距离接头可以用作弹簧。这在 Box2D 手册中说:

距离接头也可以制成柔软的,如弹簧-阻尼器连接。请参阅测试平台中的 Web 示例以了解其行为方式。

柔软度是通过调整定义中的两个常数来实现的:频率和阻尼比。将频率视为谐波振荡器的频率(如吉他弦)。频率以赫兹为单位指定。通常,频率应小于时间步长频率的一半。因此,如果您使用 60Hz 时间步长,则距离关节的频率应小于 30Hz。原因与奈奎斯特频率有关。

阻尼比是无量纲的,通常介于 0 和 1 之间,但可以更大。在 1 时,阻尼至关重要(所有振荡都应该消失)。

jointDef.frequencyHz = 4.0f;
jointDef.dampingRatio = 0.5f;
于 2013-02-07T08:28:56.630 回答
0

CreateJoint returns b2Joint(the joint created), but that is not the issue... I found out the issue. Actually i was setting local anchor point as

distance_joint.localAnchorA = new b2Vec2(0, 0);

distance_joint.localAnchorB = new b2Vec2(0, 0);

rather i should created the anchor point in the world like

distance_joint.anchorPoint1.Set(0.0, 0.0);

distance_joint.anchorPoint2.Set(0.0, 0.0);

Now, the joint is created correctly. One more issue...since i am trying to implement spring effect i try to set anchor point in the middle of the sencond body, but i am not getting success.

any idea..

Thanks

于 2013-02-08T05:24:02.120 回答