Box2D Bagaimana cara memutar roda pada porosnya dengan menarik salah satu ujungnya?

Saya baru mengenal Box2D (dalam hal ini JBox2d) dan saya membuat menu roda di aplikasi Android. Saya ingin mengizinkan pengguna untuk memilih satu item menu dan roda akan berputar secara otomatis ke bagian yang diinginkan. Badan roda bersifat dinamis, dipasang dengan sambungan putar di tengahnya ke jangkar (statis). Saya menggunakan sambungan jarak antara lokasi ketukan pengguna di dalam roda saya dan badan statis yang terletak di atas roda saya. Klik pada bagian bernama TA_Multilist

Masalah saya adalah dengan pengaturan sambungannya. Saya tidak tahu kombinasi panjang/redaman/frekuensi sehingga saya bisa mendapatkan tarikan cepat dengan osilasi minimum di akhir. Selain itu, jika saya memilih salah satu elemen di sisi atas weel, elemen tersebut akan berhenti di tempat yang tepat. Tetapi jika saya mengetuk salah satu di bagian akhir, sambungannya tidak sesuai dengan panjang 0. Saya memberikannya dan saya berakhir dengan ini: Roda diimbangi

Jika saya menggunakan panjang 0, dan rasio redaman 1 dan frekuensiHz 0, hasilnya sempurna tetapi saya tidak punya animasi : Langsung menuju posisi yang tepat.

Di iOS saya melakukan menu yang sama menggunakan UIKit Dynamics dan saya mendapatkan hasil yang bagus: https://www.dropbox.com/s/mb2i44geinw9yp6/iOS_wheel_rotation.mov?dl=0

Terima kasih sebelumnya atas bimbingan apa pun.


person mbritto    schedule 18.12.2014    source sumber


Jawaban (1)


Saya pikir masalah mendasarnya adalah pada jenis sambungan yang Anda coba gunakan.

Distance Joint mengasumsikan bahwa jarak antara dua titik yang terhubung adalah konstan (asumsi dasar sambungan kotak2d secara umum, dapat sedikit membengkokkan aturan ini, tapi tetap saja...).

Coba gunakan MouseJoint dan ingat:

  • Saat Anda membuat MouseJoint dan menempelkannya ke badan (tepatnya saat Anda membuat MouseJointDef), Anda menentukan target yang pada saat tertentu (DAN HANYA KEMUDIAN) berarti bagian badan yang ingin Anda jangkar MouseJoint (menunjukkan sekali lagi - itu ada di dalam tubuh ini!). Jadi dalam kasus Anda, target ini seharusnya menunjukkan bagian roda Anda yang disentuh.

  • Ketika Anda selesai membuat sambungan (jadi setelah Anda memanggil <World_Object>.createJoint(<your_joint>)), target menunjukkan tempat yang Anda inginkan untuk memindahkan target(di dalam badan ini) yang telah ditetapkan sebelumnya (jadi jangkar ini di bagian atas roda).

Jadi pada dasarnya Anda harus membuat sambungan mouse saat disentuh dengan kode yang mirip dengan ini:

MouseJoint wheelJoint;
MouseJointDef mouseJointDef = new MouseJointDef();
mouseJointDef.bodyA = <something>;
mouseJointDef.bodyB = wheelBody;
mouseJointDef.target.set(0 + chosenWheelPositionOffsetX, 0 + chosenWheelPositionOffsetY);
mouseJointDef.target.addLocal(wheelCenterX, wheelCenterY);
mouseJointDef.dampingRatio = <chosen_value>;
mouseJointDef.frequencyHz = <chosen_value>;
mouseJointDef.maxForce = <chosen_value>;
wheelJoint = (MouseJoint) mWorld.createJoint(mouseJointDef);

dan setelah itu kamu harus menelepon

wheelJoint.setTarget(topAnchorX, topAnchorY);

Sesuaikan <chosen_value>s agar tampilan Anda berfungsi persis seperti yang diharapkan.

Saya harap semuanya jelas, beri tahu saya jika ada yang tidak beres. Tolong juga beri tahu saya jika mengubah jenis sambungan membantu mengatasi masalah Anda.

person Bartek Lipinski    schedule 19.12.2014
comment
Terima kasih atas jawaban terperinci Anda. Tapi aku tidak bisa membuatnya berhasil. Apakah ada batasan khusus untuk bodi A palsu? Yang aneh adalah tidak ada yang terjadi ketika saya menggunakannya dan tidak ada yang tergambar pada tampilan debug draw saya yang biasanya menggambar tubuh dan sendi berwarna merah muda - person mbritto; 19.12.2014
comment
Saya akhirnya mendapatkan sesuatu yang mulai berfungsi. Anda benar dalam menggunakan MouseJoint, ini pasti cara yang benar. Saya akan kembali dengan nilai gaya/redaman/frekuensi yang tepat setelah saya menemukannya - person mbritto; 19.12.2014
comment
FYI berikut nilai yang saya gunakan untuk lingkaran 1 meter saya : Frekuensi : 1, Redaman : 0.3 dan maxForce : 10. Sekali lagi terima kasih atas bantuannya - person mbritto; 15.01.2015