Java — Revolute Суставы в box2d

Я пытался следовать учебник здесь построить вращающееся соединение; по сути, рука.
Мне нужно, чтобы рука, прямоугольник, была прикреплена к точке на квадрате и вращалась вокруг нее. Когда сила приложена, я ожидаю, что две фигуры будут вести себя как одна, скрепленные вместе, в то время как рука облетает коробку, как тряпичная кукла.

К сожалению, это не работает вообще. Сначала рука соединяется, затем, когда я прикладываю силу, две фигуры разделяются и ведут себя странным образом, что я не могу объяснить. Это почти как будто якоря были в некоторых шатких положениях.

Я использую jbox2d и много кода из этот урок также.

(Я установил начальные привязки к центрам, чтобы посмотреть, будет ли это работать)
(Есть некоторые странные преобразования, потому что я использую openGl)

Вот суть:

    public class New_char
{
Vec2             torso_pos,    arm_pos;
Body             torso,        arm;
PolygonShape     torso_shape,  arm_shape;
BodyDef          torso_def,    arm_def;
FixtureDef       torso_fix,    arm_fix;

RevoluteJointDef torsoArmDef;
RevoluteJoint    torsoArmJoint;

//float[] torSize = {0.5f, 0.5f}, armSize={0.75f, 0.10f};public New_char(World world, float[] pos)
{
//this.torso_pos = new Vec2(pos[0], pos[1]) ;   this.arm_pos = new Vec2(pos[0]+10,pos[1]+10);
//out.println(this.arm_pos+" thepos "+this.torso_pos);

this.torso_def = new BodyDef()            ;  this.arm_def = new BodyDef();
torso_def.type = BodyType.DYNAMIC         ;  arm_def.type = BodyType.DYNAMIC;
torso_def.position.set(320 / 30 / 2, 240 / 30 / 2)    ;  arm_def.position.set(320 / 30 / 2, 240 / 30 / 2);

this.torso_shape = new PolygonShape()     ;  this.arm_shape = new PolygonShape();
this.torso_shape.setAsBox(0.50f, 0.50f)   ;  this.arm_shape.setAsBox(0.75f, 0.10f);

this.torso_fix = new FixtureDef()         ;  this.arm_fix = new FixtureDef();
this.torso_fix.density = 0.1f             ;  this.arm_fix.density = 0.5f;
this.torso_fix.shape = this.torso_shape   ;  this.arm_fix.shape = this.arm_shape;

this.torso = world.createBody(this.torso_def) ;  this.arm = world.createBody(this.arm_def);
this.torso.createFixture(this.torso_fix)      ;  this.arm.createFixture(this.arm_fix);

this.torsoArmDef = new RevoluteJointDef();
this.torsoArmDef.bodyA = this.torso ; this.torsoArmDef.bodyB = this.arm;
this.torsoArmDef.collideConnected = false;
this.torsoArmDef.localAnchorA.set(this.torso.getWorldCenter());
//Vec2 armpin = new Vec2(1f, 1f);
this.torsoArmDef.localAnchorB.set(this.arm.getWorldCenter());
this.torsoArmJoint = (RevoluteJoint)world.createJoint(this.torsoArmDef);

1

Решение

Проблема была в getWorldCenter (который рекомендовался в каждом уроке, который я нашел)

Решение getLocalCenter:

    this.torsoArmDef.localAnchorA.set(this.torso.getLocalCenter());
this.torsoArmDef.localAnchorB.set(this.arm.getLocalCenter());

Теперь он вращается волшебным образом!

0

Другие решения


По вопросам рекламы [email protected]