Newton's Cradle Cottage

Halo pembaca yang budiman! Saya sudah menulis artikel pertama dengan dasar-dasar Box2D di Eclipse di Jawa. Hari ini, menggunakan contoh Cradle Newton, saya akan menunjukkan cara mengkonfigurasi koneksi objek di perpustakaan fisik yang indah ini.

Apa yang kita harapkan untuk dilihat?

gambar

Gambar 1. Terlalu bagus!

Pasti sesuatu yang sama sekali berbeda dari itu!

Untuk menghubungkan libGDX, lihat artikel pertama .

Komposisi proyek tidak berubah:

gambar

Gambar 2. Proyek. Folder dan paket.

Saya menambahkan paket Utils dengan kelas Constants ke folder Core, yang hanya berisi satu konstanta - jumlah piksel per meter. Ini agar dunia tidak raksasa.

Berikut adalah kode untuk kelas DesktopLauncher dari com.mygdx.game.desktop:

Tempel kode ini ke dalam kelas dan lupakan.
package com.mygdx.game.desktop; import com.badlogic.gdx.backends.lwjgl.LwjglApplication; import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration; import com.mygdx.game.MyGdxGame; public class DesktopLauncher { public static void main(String[] arg) { LwjglApplicationConfiguration config = new LwjglApplicationConfiguration(); //   config.width = 720; //   config.height = 480; config.backgroundFPS = 60; config.foregroundFPS = 60; new LwjglApplication(new MyGdxGame(), config); } } 


Dalam model fisik kami, koefisien elastisitas akan menjadi sangat penting. Semakin tinggi, semakin banyak osilasi yang akan dibuat bandul. Di Box2D, parameter restitusi FixtureDef dapat mengambil nilai dari 0 hingga 1.0f, di mana 0 sama sekali tidak elastis, dan 1.0f benar-benar elastis. Model terbaik Cradle Newton yang saya dapatkan dengan restitusi = 0.8f:

gambar

Gambar 3 Koefisien elastisitas = 0.8f, untuk kejelasan yang lebih besar, gerakan lambat.

Kode Implementasi:
 package com.mygdx.game; import com.badlogic.gdx.ApplicationAdapter; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Input.Keys; import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.OrthographicCamera; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.math.Vector3; import com.badlogic.gdx.physics.box2d.Body; import com.badlogic.gdx.physics.box2d.BodyDef; import com.badlogic.gdx.physics.box2d.Box2DDebugRenderer; import com.badlogic.gdx.physics.box2d.CircleShape; import com.badlogic.gdx.physics.box2d.FixtureDef; import com.badlogic.gdx.physics.box2d.PolygonShape; import com.badlogic.gdx.physics.box2d.World; import com.badlogic.gdx.physics.box2d.joints.RevoluteJointDef; import utils.Constants; public class MyGdxGame extends ApplicationAdapter { private OrthographicCamera camera; private boolean DEBUG = false; private World world; private Body plos; private Body plos2; private Body plos3; private Body plos1; private Body plos4; private Box2DDebugRenderer b2dr; private Body ball; private Body ball1; private Body ball2; private Body ball3; private Body ball4; public void create() { float w = Gdx.graphics.getWidth(); float h = Gdx.graphics.getHeight(); camera = new OrthographicCamera(); camera.setToOrtho(false, w / 2, h / 2); world = new World(new Vector2(0, -9.8f), false); b2dr = new Box2DDebugRenderer(); //     plos = createplos(20 / Constants.PPM); plos1 = createplos(0 / Constants.PPM); plos2 = createplos(40 / Constants.PPM); plos3 = createplos(80 / Constants.PPM); plos4 = createplos(60 / Constants.PPM); //   ball = createball(20 / Constants.PPM); ball1 = createball(40 / Constants.PPM); ball2 = createball(60 / Constants.PPM); ball3 = createball(0 / Constants.PPM); ball4 = createball(80 / Constants.PPM); //       rotation(plos, ball); rotation(plos2, ball1); rotation(plos1, ball3); rotation(plos4, ball2); rotation(plos3, ball4); } //       public void rotation(Body body1, Body body2) { RevoluteJointDef rjd = new RevoluteJointDef(); rjd.bodyA = body1; rjd.bodyB = body2; rjd.collideConnected = false; //      rjd.localAnchorB.set((plos.getPosition().x) / Constants.PPM, plos.getPosition().y / Constants.PPM + 2); //      rjd.localAnchorA.set((plos.getPosition().y - 6.8f) / Constants.PPM, plos.getPosition().x / Constants.PPM); world.createJoint(rjd); } public void render() { update(Gdx.graphics.getDeltaTime()); Gdx.gl.glClearColor(0, 0, 0, 1); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); b2dr.render(world, camera.combined.scl(Constants.PPM)); } public void resize(int width, int height) { camera.setToOrtho(false, width / 2, height / 2); } public void dispose() { world.dispose(); b2dr.dispose(); } public void update(float delta) { world.step(1 / 60f, 6, 2); cameraUpdate(delta); inputUpdate(delta); } public void inputUpdate(float delta) { //    ,      -7 /  x, -7 /  y if (Gdx.input.isKeyPressed(Keys.SPACE)) { ball3.setLinearVelocity(-7, -7); } } //      public void cameraUpdate(float delta) { Vector3 position = camera.position; position.x = ball1.getPosition().x * Constants.PPM; position.y = ball1.getPosition().y * Constants.PPM; camera.position.set(position); camera.update(); } //   public Body createplos(float xo) { PolygonShape shape = new PolygonShape(); Body fBody; BodyDef def = new BodyDef(); def.type = BodyDef.BodyType.StaticBody; def.position.set(xo, 200 / Constants.PPM); def.fixedRotation = true; fBody = world.createBody(def); shape.setAsBox(10 / Constants.PPM, 10 / Constants.PPM); fBody.createFixture(shape, 0.001f); shape.dispose(); return fBody; } //   public Body createball(float xo) { Body pBody; BodyDef def = new BodyDef(); def.type = BodyDef.BodyType.DynamicBody; def.position.set(xo, 100 / Constants.PPM); def.fixedRotation = false; pBody = world.createBody(def); CircleShape shape = new CircleShape(); shape.setRadius(10 / Constants.PPM); pBody.createFixture(shape, 0.0001f); def.bullet = true; FixtureDef fd = new FixtureDef(); //   fd.restitution = 0.8f; //  fd.density = 10.0f; //   fd.friction = 0f; fd.shape = shape; pBody.createFixture(fd); shape.dispose(); return pBody; } } 


Anda dapat mengubah koefisien sendiri dan mendapatkan hasil yang berbeda. Selain itu, tekstur dapat diterapkan pada primitif untuk mencapai realisme yang lebih besar.

Selanjutnya akan disajikan gambar-gif untuk berbagai nilai koefisien elastisitas.

gambar

Gambar 4. Koefisien elastisitas sama dengan 1f.

gambar

Gambar 5. Koefisien elastisitas sama dengan 0,5f.

gambar

Gambar 6. Koefisien elastisitas sama dengan 0.2f.

gambar

Gambar 7. Koefisien elastisitas sama dengan 0.

Ada banyak ide, saya coba sebarkan hasilnya sejauh mungkin! Terima kasih telah membaca sampai akhir, semoga artikel ini bermanfaat bagi Anda! Mari kumpulkan kekacauan nyata di dunia game berkat pustaka Box2D!

PS Saya akan menjawab semua pertanyaan di komentar.

Source: https://habr.com/ru/post/id450346/


All Articles