Pertanyaan Tabrakan dalam kotak Libgdx2D gagal untuk beberapa badan


Saya sedang mengerjakan game pertama saya menggunakan libgdx dengan box2d. Saya menggunakan perender debug untuk menguji objek saya. Saya membuat beberapa objek seperti mobil. Setiap mobil memiliki tubuh utama, yang merupakan poligon besar dengan 6 titik (panjang sekitar 1 meter, tinggi 0,7 meter), dan memiliki 2 roda yang dipasang oleh sendi revolute.

Mobil utama memiliki meriam dan senapan mesin terpasang, juga melalui sendi revolute.

Masalah yang saya hadapi adalah bahwa sebagian besar mobil tidak melakukan tabrakan sebagaimana dimaksud. Ketika 2 mobil saling pukul, mereka tumpang tindih, seperti ini:

Bodies colliding

Beberapa catatan:

  1. Roda dan meriam (bentuk yang lebih kecil) melakukan tabrakan dengan baik. Ketika roda menyentuh tubuh, berhenti
  2. Jika saya mendeteksi tabrakan melalui kode, tabrakan sebenarnya terjadi
  3. Saya mencoba ini dengan objek yang lebih kecil (peluru yang ditembakkan dari senapan mesin), dan saya mengatur properti objek "isBullet" menjadi true saat saya melihat di pos yang berbeda (tabrakan tidak tepat di box2d), tetapi memiliki hasil yang sama (Peluru ini dilingkari merah):

Bullet object colliding

Inilah kode yang saya gunakan untuk membuat badan:

protected Body createBody(Material material, Shape shape, BodyType type, WorldWrapper world)
{
    BodyDef bodyDef = new BodyDef();
    bodyDef.type = type;
    bodyDef.position.set(initialPosition);

    Body body = world.createBody(bodyDef);

    FixtureDef fixtureDef = new FixtureDef();
    fixtureDef.density = this.material.getDensity();
    fixtureDef.friction = this.material.getFriction();
    fixtureDef.restitution = this.material.getRestitution();
    fixtureDef.shape = shape;
    body.createFixture(fixtureDef);

    return body;
}

Mobil maju menggunakan motor pada roda revolute joints, yang dibangun seperti ini:

public void goForward()
{
    for (RevoluteJoint joint : wheelJoints)
    {
        joint.enableMotor(true);
        joint.setMotorSpeed(-this.engineSpeed);
        joint.setMaxMotorTorque(this.engineTorque);
    }
}

Saya menggunakan nilai-nilai berikut:

Density = 2500;
Restitution = 0;
Friction = 0.1;
BodyType = Dynamic;

Saya menggunakan langkah dunia 1/60 detik, dengan velocityIterations = 6 dan positionIterations = 2

Tahu apa yang saya rindukan di sini?


7
2018-05-23 18:32


asal


Jawaban:


Bagian utama mobil Anda (poligon) cekung. Box2D bermasalah dengan poligon cekung atau jika simpul dalam urutan searah jarum jam. Coba buat mobil-mobil itu dengan dua persegi panjang sebagai gantinya, yang seharusnya berfungsi.

Btw: Anda tampaknya menggunakan libgdx versi lama. The libgdx nightlies saat ini memiliki algoritma tambahan dalam fungsi polygon.set, yang secara otomatis menghitung lambung cembung dalam rangka berlawanan jarum dari vertex yang diberikan. Jadi menggunakan versi itu juga harus memperbaiki masalah Anda.


6
2018-05-24 10:37