如何让 libGDX box2D 中的绳子更有弹性?
How to make a rope in libGDX box2D more springy?
我在 libGDX
中创建了几个 Box2D
绳索接头。绳子感觉有点太软了。你怎样才能使绳索更硬?主要 Box2D project
在他们的测试台演示中显示了刚度选项:
右侧的绳索显示了所需的刚度:
libGDX Box2D
中是否存在这样的选项?
这就是我在 libGDX
中制作绳索的方式:
private void initRopeJoints() {
Array<Body> bodies = new Array<Body>();
bodies.add(BodyBuilder.createBox(world,250,360,32,32,true,true));
for(int i = 1; i < 5; ++i) {
bodies.add(BodyBuilder.createBox(world, 250, -i * 32 +300, 4, 32, false, false));
RopeJointDef rDef = new RopeJointDef();
rDef.bodyA = bodies.get(i - 1);
rDef.bodyB = bodies.get(i);
rDef.collideConnected = true;
rDef.maxLength = 1f; // meters because box2d works in meters
rDef.localAnchorA.set(0, -0.5f);
rDef.localAnchorB.set(0, .5f);
world.createJoint(rDef);
}
}
// makes stronger rope - e.g. will not break
private void initRopeJointsSecondApproach() {
Array<Body> bodies = new Array<Body>();
bodies.add(BodyBuilder.createBox(world,250,60 +270,32,4,true,true));
for(int i = 1; i < 20; ++i) {
bodies.add(BodyBuilder.createBox(world, 250, -i * 4 +270, 4, 4, false, false));
RopeJointDef rDef = new RopeJointDef();
rDef.bodyA = bodies.get(0);
rDef.bodyB = bodies.get(i);
rDef.collideConnected = true;
rDef.maxLength = i * .25f;
rDef.localAnchorA.set(0, -.125f);
rDef.localAnchorB.set(0, .125f);
world.createJoint(rDef);
RevoluteJointDef jDef = new RevoluteJointDef();
jDef.bodyA = bodies.get(i - 1);
jDef.bodyB = bodies.get(i);
jDef.localAnchorA.set(0, -.125f);
jDef.localAnchorB.set(0, .125f);
world.createJoint(jDef);
}
}
如果我没理解错的话,你不喜欢你的绳子像橡胶或 spring。这与 box2d 约束求解器的工作方式有关。对于每个连接,它都会尝试更正物体的位置。总的来说,效果很好。但是当有很多连接时,求解器需要时间才能将物体放在正确的位置。为此,出现了spring效应。要减少它,您可以减少模拟时间步长。这将使连接的行为更加准确,但会增加 CPU 利用率。但在您的情况下,最好添加另一个 RopeJoint,它将连接绳索的第一个和最后一个主体,并且长度等于绳索的长度。这种连接将防止绳索的起点和终点移动超过绳索的长度。
哦,我明白了。关节 (RopeJoint/RevoluteJoint) 不会为您提供预期的效果,因为它们不会限制身体围绕彼此旋转。使用调整参数频率和阻尼比的 WeldJoint。
setDampingRatio(浮动比率);
设置频率(浮动赫兹);
很难说您需要哪些频率和阻尼比参数。更改它们,直到获得所需的灵活性。
我在 libGDX
中创建了几个 Box2D
绳索接头。绳子感觉有点太软了。你怎样才能使绳索更硬?主要 Box2D project
在他们的测试台演示中显示了刚度选项:
libGDX Box2D
中是否存在这样的选项?
这就是我在 libGDX
中制作绳索的方式:
private void initRopeJoints() {
Array<Body> bodies = new Array<Body>();
bodies.add(BodyBuilder.createBox(world,250,360,32,32,true,true));
for(int i = 1; i < 5; ++i) {
bodies.add(BodyBuilder.createBox(world, 250, -i * 32 +300, 4, 32, false, false));
RopeJointDef rDef = new RopeJointDef();
rDef.bodyA = bodies.get(i - 1);
rDef.bodyB = bodies.get(i);
rDef.collideConnected = true;
rDef.maxLength = 1f; // meters because box2d works in meters
rDef.localAnchorA.set(0, -0.5f);
rDef.localAnchorB.set(0, .5f);
world.createJoint(rDef);
}
}
// makes stronger rope - e.g. will not break
private void initRopeJointsSecondApproach() {
Array<Body> bodies = new Array<Body>();
bodies.add(BodyBuilder.createBox(world,250,60 +270,32,4,true,true));
for(int i = 1; i < 20; ++i) {
bodies.add(BodyBuilder.createBox(world, 250, -i * 4 +270, 4, 4, false, false));
RopeJointDef rDef = new RopeJointDef();
rDef.bodyA = bodies.get(0);
rDef.bodyB = bodies.get(i);
rDef.collideConnected = true;
rDef.maxLength = i * .25f;
rDef.localAnchorA.set(0, -.125f);
rDef.localAnchorB.set(0, .125f);
world.createJoint(rDef);
RevoluteJointDef jDef = new RevoluteJointDef();
jDef.bodyA = bodies.get(i - 1);
jDef.bodyB = bodies.get(i);
jDef.localAnchorA.set(0, -.125f);
jDef.localAnchorB.set(0, .125f);
world.createJoint(jDef);
}
}
如果我没理解错的话,你不喜欢你的绳子像橡胶或 spring。这与 box2d 约束求解器的工作方式有关。对于每个连接,它都会尝试更正物体的位置。总的来说,效果很好。但是当有很多连接时,求解器需要时间才能将物体放在正确的位置。为此,出现了spring效应。要减少它,您可以减少模拟时间步长。这将使连接的行为更加准确,但会增加 CPU 利用率。但在您的情况下,最好添加另一个 RopeJoint,它将连接绳索的第一个和最后一个主体,并且长度等于绳索的长度。这种连接将防止绳索的起点和终点移动超过绳索的长度。
哦,我明白了。关节 (RopeJoint/RevoluteJoint) 不会为您提供预期的效果,因为它们不会限制身体围绕彼此旋转。使用调整参数频率和阻尼比的 WeldJoint。
setDampingRatio(浮动比率); 设置频率(浮动赫兹);
很难说您需要哪些频率和阻尼比参数。更改它们,直到获得所需的灵活性。