ダイナミックボディ(長方形)とシンプルな回転ジョイント(低い角度と高い角度)を使用してラグドールを作成しました。ぼろ人形が地面(静的な物体)にぶつかると、身体がそわそわして関節が分離します。
ボディが地面にくっついているように見え、ラグドールの勢いが関節を引き離します(下のスクリーンショットを参照)。
関連しているかどうかはわかりませんが、Box2DにBadlogic GDX Javaラッパーを使用しています。以下は、最も関連性の高いコードだと私が思うスニペットです。
private RevoluteJoint joinBodyParts(
Body a, Body b, Vector2 anchor,
float lowerAngle, float upperAngle) {
RevoluteJointDef jointDef = new RevoluteJointDef();
jointDef.initialize(a, b, a.getWorldPoint(anchor));
jointDef.enableLimit = true;
jointDef.lowerAngle = lowerAngle;
jointDef.upperAngle = upperAngle;
return (RevoluteJoint)world.createJoint(jointDef);
}
private Body createRectangleBodyPart(
float x, float y, float width, float height) {
PolygonShape shape = new PolygonShape();
shape.setAsBox(width, height);
BodyDef bodyDef = new BodyDef();
bodyDef.type = BodyType.DynamicBody;
bodyDef.position.y = y;
bodyDef.position.x = x;
Body body = world.createBody(bodyDef);
FixtureDef fixtureDef = new FixtureDef();
fixtureDef.shape = shape;
fixtureDef.density = 10;
fixtureDef.filter.groupIndex = -1;
fixtureDef.filter.categoryBits = FILTER_BOY;
fixtureDef.filter.maskBits = FILTER_STUFF | FILTER_WALL;
body.createFixture(fixtureDef);
shape.dispose();
return body;
}
頭を作成する方法は、長方形の方法とほぼ同じであるため、省略しました(ちょうど十字架の形状を使用します)。
これらのメソッドは次のように使用されます。
torso = createRectangleBodyPart(x, y + 5, 0.25f, 1.5f);
Body head = createRoundBodyPart(x, y + 7.4f, 1);
Body leftLegTop = createRectangleBodyPart(x, y + 2.7f, 0.25f, 1);
Body rightLegTop = createRectangleBodyPart(x, y + 2.7f, 0.25f, 1);
Body leftLegBottom = createRectangleBodyPart(x, y + 1, 0.25f, 1);
Body rightLegBottom = createRectangleBodyPart(x, y + 1, 0.25f, 1);
Body leftArm = createRectangleBodyPart(x, y + 5, 0.25f, 1.2f);
Body rightArm = createRectangleBodyPart(x, y + 5, 0.25f, 1.2f);
joinBodyParts(torso, head, new Vector2(0, 1.6f), headAngle);
leftLegTopJoint = joinBodyParts(torso, leftLegTop, new Vector2(0, -1.2f), 0.1f, legAngle);
rightLegTopJoint = joinBodyParts(torso, rightLegTop, new Vector2(0, -1.2f), 0.1f, legAngle);
leftLegBottomJoint = joinBodyParts(leftLegTop, leftLegBottom, new Vector2(0, -1), -legAngle * 1.5f, 0);
rightLegBottomJoint = joinBodyParts(rightLegTop, rightLegBottom, new Vector2(0, -1), -legAngle * 1.5f, 0);
leftArmJoint = joinBodyParts(torso, leftArm, new Vector2(0, 1), -armAngle * 0.7f, armAngle);
rightArmJoint = joinBodyParts(torso, rightArm, new Vector2(0, 1), -armAngle * 0.7f, armAngle);
物理シミュレーションを固定タイムステップで実行しますか?そうでない場合は、必ず最初にそれを行う必要があります。
—
bummzack