Bagaimana cara menentukan pendorong yang dinyalakan untuk memutar kapal?

47

Konfigurasi kapal berubah secara dinamis, jadi saya harus menentukan pendorong yang harus dihidupkan ketika saya ingin memutar kapal searah atau berlawanan arah jarum jam. Pendorong selalu poros sejajar dengan kapal (tidak pernah miring) dan baik hidup atau mati. Berikut adalah salah satu pengaturan yang mungkin:

http://i.stack.imgur.com/GSBSH.png

Apa yang saya coba sejauh ini adalah memvisualisasikan vektor penembakan dan vektor arah ke pusat massa kapal:

http://i.stack.imgur.com/ZzNzi.png

Sayangnya, saya tidak terlalu jauh dengan itu.

migimunz
sumber
7
Anda menuju ke arah yang benar dengan vektor gaya. Coba cari rumus untuk kecepatan ANGULAR karena Anda mencoba memutar kapal di sekitar pusat massa.
Amplify91
Aku lupa bagaimana tepatnya untuk melakukannya, tapi pada dasarnya hanya pasukannya pada setiap titik en.wikipedia.org/wiki/Center_of_mass dan terutama en.wikipedia.org/wiki/Parallel_axis_theorem
CobaltHex
1
Saya punya ide yang persis sama! Salah satu tip yang mungkin membuat Anda lebih mudah adalah Anda hanya perlu menghitung percepatan sudut dan linier satu kali untuk setiap pendorong, sehingga penghitungannya mungkin serumit yang Anda inginkan.
Markus von Broady
@ Amplify91, komentar Anda dengan senang hati membantu saya mengatasinya, terima kasih!
migimunz
1
@ migimunz Saya agak berpikir untuk menghitung akselerasi per pendorong, bukan per tombol ditekan (sekelompok pendorong). Juga, memberi pemain pilihan pendorong yang harus diaktifkan dengan penekanan tombol mana yang dapat menarik (beberapa orang akan berdagang lebih cepat dengan berputar untuk berputar di tempat)
Markus von Broady

Jawaban:

22

Keberhasilan! Ini dia, dan itu berputar sebagaimana mestinya: masukkan deskripsi gambar di sini

Apa yang saya lakukan adalah sebagai berikut: untuk setiap pendorong, saya menghitung besarnya torsi, dalam kaitannya dengan pusat massa.

private function thrustTorque():Float
{
    // distToCom is the distance vector between the thruster and center of mass
    // fire angle is a unit vector representing the direction of the thruster
    var distAngle = Math.atan2(distToCOM.y, distToCOM.x);
    var fireAngle = Math.atan2(dir.y, dir.x);
    var theta = fireAngle - distAngle;
    var torque = distToCOM.length * Math.sin(theta);
    return torque;
}

Persamaan untuk besarnya torsi, menurut wikipedia, adalah T = rF sin(theta), di mana:

  • r adalah jarak antara thruster dan COM
  • F adalah besarnya gaya yang diterapkan (saya mengabaikannya, berpura-pura hanya satu, karena saya hanya peduli pada tanda).
  • theta adalah sudut antara dua vektor

Ketika pemain menekan ke kiri, saya memeriksa tanda torsi untuk pendorong itu - jika kurang dari nol, saya menembakkan pendorong. Justru sebaliknya untuk memutar searah jarum jam.

Ini mungkin dapat ditingkatkan dengan menggunakan produk titik untuk menghitung cosinus sudut antara vektor, tetapi itu harus menunggu sampai besok.

Akhirnya, inilah demo langsung .

migimunz
sumber
Hampir di sana saya pikir. Tampaknya tidak tepat di pusat massa. Dengan hanya menggunakan panah kiri / kanan, kapal dapat dengan mudah mematikan layar. Sangat dekat. Mungkin titik yang Anda ukur sedikit tidak aktif. Atau itu bisa menjadi masalah waktu karena tampaknya menjadi stabil setelah beberapa saat. Kerja bagus.
MichaelHouse
Saya tidak berpikir itu ada hubungannya dengan logika ini. Tidak ada apa pun di sini untuk memastikan bahwa kendaraan tidak menerima gaya translasi bersih dari menembakkan set pemukul yang dipilih oleh mekanisme ini. Jika tidak mempertahankan gaya translasi netto merupakan persyaratan, diperlukan kemampuan untuk memodulasi gaya pendorong individual (dan mungkin akan menjadi masalah yang jauh lebih sulit untuk dipecahkan)
Trevor Powell
@TrevorPowell, tepatnya. Demi kesederhanaan (dan juga menyenangkan, karena seberapa baik kinerja kapal Anda akan tergantung pada seberapa baik Anda mendesainnya), saya memutuskan bahwa pendorong baik hidup atau mati. Saya mungkin akan memasukkan ambang sehingga mereka yang menyebabkan torsi terlalu sedikit (dan karena itu pergerakan lateral terlalu banyak) tidak dihidupkan, tetapi seberapa banyak "terlalu banyak / sedikit" mungkin akan ditentukan oleh coba-coba.
migimunz
3
Apa yang ingin Anda lakukan untuk menghindari perhitungan sudut adalah dengan menggunakan produk titik tegak lurus (berasal dari definisi produk silang torsi T = r lintas F jika Anda menggunakan vektor 3D dengan z = 0). Anda mengambil vektor (-ry, rx), yang tegak lurus terhadap r dengan besaran yang sama, dan Anda menghitung titik produk dari vektor itu dengan F. Hasilnya adalah T = rx * Fy - ry * Fx. Maka abs (T) adalah besarnya torsi, dan tandanya menunjukkan arah: T> 0 berlawanan arah jarum jam, T <0 searah jarum jam.
Joren
1
Alasan mengapa ia mudah dilihat secara intuitif: r dot F = r F cos θ. Jika Anda memutar r berlawanan arah jarum jam sebanyak 90 derajat dan mengambil produk titik, Anda mendapatkan r F sin θ karena cos (θ - 90˚) = sin (θ).
Joren
14

Ekspresi 3D umum untuk torsi adalah produk silang dari perpindahan dan gaya: T = rF . Dalam dua dimensi, nilai skalar untuk torsi akan mencukupi, dan hanya diberi empat orientasi ortogonal untuk pendorong, kita dapat menulis dalam bentuk potongan-potongan:

  • Berlaku dalam arah + x: T = F * (-ry)
  • Berlaku dalam arah -x: T = F * (ry)
  • Berlaku ke arah + y: T = F * (rx)
  • Berlaku dalam arah -y: T = F * (-rx)

Di sini, F adalah besarnya gaya yang dihasilkan oleh pendorong, rx dan ry adalah komponen x dan y dari vektor dari titik pivot ke thruster. Torsi positif cenderung memutar kapal berlawanan arah jarum jam. Menggunakan empat formula di atas, sepele untuk menyimpulkan tanda torsi yang dihasilkan masing-masing pendorong.

Untuk representasi fisika yang cukup akurat, Anda tidak hanya perlu mengetahui tanda dorongan, tetapi juga besarnya total dan inersia rotasi. Selain itu, Anda mungkin tidak hanya ingin mengaktifkan semua pendorong selaras dengan benar untuk melakukan rotasi.

Kapal luar angkasa

Seperti yang ditarik, kekuatan penuh untuk pendorong B, D dan E akan memaksimalkan rotasi, tetapi juga akan mempercepat kapal ke kanan. Mematikan D akan mencegah hal ini. Jika sebaliknya, mempercepat hak dimaksudkan, tetapi rotasi searah jarum jam tidak, cara paling efisien untuk pergi adalah memungkinkan baik C dan F pada dua pertiga dari kekuatan penuh bersama dengan D.

Jika ini bukan di luar ruang lingkup apa yang Anda coba lakukan, Anda harus menulis semacam solver untuk persamaan gerak, jelas bukan tugas yang mudah.

Marcks Thomas
sumber
7

Beberapa hal berbeda. Pertama, kita perlu menyadari bahwa ini adalah masalah yang tidak terbatas. Yaitu, ada banyak kombinasi pendorong yang dapat menembak untuk menghasilkan rotasi dalam arah yang sama. Saya berasumsi bahwa dalam situasi Anda hanya ada dua negara untuk pendorong, "on", dan "off", dan semua pendorong menghasilkan kekuatan yang sama.

Kedua, mengamati model Anda, sepertinya "pusat massa" Anda sebenarnya bukan pusat massa Anda. Untungnya, ini tidak akan mempengaruhi perhitungan Anda untuk torsi. Namun, itu akan mempengaruhi perhitungan Anda untuk pusat perpindahan massa. Saya tidak yakin apakah Anda peduli tentang akurasi pada tingkat itu, karena "pusat massa" Anda setidaknya adalah kuadrat terdekat dengan pusat massa sebenarnya.

Ketiga, jika Anda ingin menghitung bagaimana pendorong tertentu akan mempengaruhi rotasi, Anda sudah benar, meskipun Anda menggunakan formula yang tidak efisien. Torsi dapat dihitung sebagai r x F, yang memiliki magnitudo r*F*sin(theta). Namun, menghitung sudut dalam kasus ini adalah metode yang tidak efisien. Sebagai gantinya, Anda harus menggunakan definisi lintas-produk torsi secara langsung, karena ini akan jauh lebih mudah menggunakan representasi yang Anda miliki. Karena semua vektor Anda tidak memiliki komponen z, rumus untuk produk silang sangat disederhanakan.

Tanpa mengubah hasil perhitungan Anda sama sekali, kami hanya dapat memperbarui kode Anda

private function thrustTorque():Float
{
    var torque = distToCOM.x*dir.y-distToCOM.y*dir.x;
    return torque;
}

Itu jauh lebih bagus (dan lebih cepat).

Anda menyarankan dalam jawaban Anda sendiri bahwa solusi Anda adalah menembakkan semua pendorong dengan torsi ke arah yang benar. Sekarang, itu cukup banyak memecahkan pertanyaan yang Anda ajukan. Namun, saya berharap bahwa beberapa titik di sepanjang garis, Anda akan menemukan bahwa strategi Anda tidak begitu memuaskan, jika pengguna menekan tombol "putar", dan semua pendorong dengan putaran torsi positif, berpotensi memindahkannya di atas memutar mereka (saya tidak yakin tingkat detail simulasi Anda, jika Anda benar-benar menghitung kekuatan dari pendorong, atau jika Anda hanya secara visual menunjukkan mereka menembak dan kemudian memutar model Anda dengan akselerasi konstan atau sesuatu. cara, Anda ingin pendorong menembak setidaknya sekitar akurat).

Anda tidak mempertimbangkan kekuatan total di kapal. Jika Anda memiliki jumlah pendorong yang sewenang-wenang, maka ini bisa berubah menjadi masalah yang cukup rumit. Namun, karena pendorong kami hanya memiliki dua kondisi, cukup sederhana untuk dianalisis. Saya tidak yakin apa tujuan kami di sini, jadi saya bisa membayangkan dua yang berbeda: pertama, kami ingin meminimalkan kekuatan total, sambil tetap menjaga torsi ke arah yang kami inginkan. Kedua, kami ingin memaksimalkan rasio torsi terhadap kekuatan total.

Sebagai tambahan, jika Anda bisa membayangkan kontrol "volume pendorong" tambahan yang memengaruhi kekuatan semua pendorong secara bersamaan, maka Anda dapat mengatur kontrol ini sehingga dua solusi Anda memiliki torsi yang sama, dan Anda melihat bahwa solusi kedua hanya dapat memiliki perpindahan lebih kecil dari yang pertama. Namun, kita harus ingat bahwa jika memungkinkan untuk menyalakan pendorong sehingga Anda hanya memutar dan tidak bergerak sama sekali, maka kedua solusi akan sama.

Jadi, kita akan pergi dengan solusi kedua, berdasarkan argumen dari paragraf sebelumnya. Sekarang, ketika menganalisis kekuatan total, kita dapat dengan mudah mencatat bahwa hanya ada empat arah yang dapat ditunjukkan oleh mesin. Jadi total gaya dalam arah x hanyalah jumlah pendorong yang menunjuk ke kiri dikurangi jumlah yang menunjuk ke kanan, dan juga untuk arah y.

Setelah menulis sejauh ini, saya harus memikirkan lebih lanjut tentang algoritma untuk mengoptimalkannya. Saya pikir sisa posting saya sangat membantu, jadi saya mempostingnya, tetapi saya akan memperbarui ketika saya mencari cara terbaik untuk mengoptimalkan konfigurasi ini (saya sudah memikirkan beberapa cara untuk mendapatkan perkiraan jawaban, tetapi tidak satupun dari mereka yang tepat).

Jeremy Salwen
sumber
Terima kasih atas jawabannya (dan solusi yang lebih cepat dan lebih bersih untuk menghitung torsi). Lingkaran merah bukanlah COM kapal, melainkan inti kekuatan. Saya menggunakan mesin fisika dan saya hanya menerapkan dorongan lokal ke kapal. Saya baik-baik saja dengan solusi yang tidak sempurna karena membuatnya sangat menyenangkan untuk bermain-main dengan konfigurasi yang berbeda, tapi saya ingin tahu apa yang Anda hasilkan.
migimunz
1
Anda dapat menghitung torsi dari titik referensi acak. Jumlah yang dihasilkan akan berubah, tetapi selama Anda memutar kapal di sekitar titik ini, yang tidak perlu menjadi pusat massa, perilaku fisik tidak akan. Bahkan, tanpa informasi tentang distribusi massa, pusat massa itu sendiri sewenang-wenang dan tidak dapat dihitung seperti itu.
Marcks Thomas