Menghitung gaya rotasi sprite 2D

35

Saya bertanya-tanya apakah seseorang memiliki cara yang elegan untuk menghitung skenario berikut.

Saya memiliki objek (n) jumlah kotak, bentuk acak, tetapi kita akan berpura-pura mereka semua persegi panjang.

Kita berhadapan tanpa gravitasi, jadi pertimbangkan objek di ruang angkasa, dari perspektif top-down. Saya menerapkan gaya pada objek di kotak tertentu (seperti yang diilustrasikan di bawah).

Menerapkan kekuatan

Bagaimana cara menghitung sudut rotasi, berdasarkan gaya yang diterapkan, di lokasi yang diterapkan. Jika diterapkan di tengah, itu akan lurus. Bagaimana seharusnya berperilaku semakin jauh saya pindah dari pusat? Bagaimana cara menghitung kecepatan rotasi?

jallan
sumber
Apa yang Anda inginkan terjadi pada gaya melalui waktu ketika objek berputar? Apakah itu selalu berlaku untuk kotak yang sama di arah yang sama? Apakah itu "menyapu" di sepanjang tepi objek? Dengan informasi yang Anda berikan, Anda hanya bisa mendapatkan gaya rotasi yang sesuai (alias. Torsi) tetapi jika Anda ingin menyimpulkan kecepatan rotasi dari itu, Anda harus memberikan dorongan (bukan gaya) atau menjelaskan bagaimana gaya harus diterapkan seiring berjalannya waktu.
sam hocevar
Jujur ini mungkin akan menjadi pertanyaan yang lebih baik untuk fisika.stackexchange.com, karena ini sepenuhnya merupakan pertanyaan tentang mekanika dasar.
BlueRaja - Danny Pflughoeft

Jawaban:

44

Anda mencoba menghitung Torsi. Torsi tergantung pada gaya yang diberikan F, titik aplikasi, dan pusat massa benda.

1) Pusat Massa . Tentukan pusat massa objek.

2) Titik Penerapan : Tetapkan titik di mana gaya bekerja.

3) Moment Arm : Jarak antara dua titik yang ditentukan di atas.

Point centerofMass
Point applicationPoint
Vector momentArm = applicationPoint - centerofMass

4) Gaya sudut : Bagilah gaya F Anda menjadi dua vektor ortogonal, satu Paralel dengan garis dalam 3) dan satu Perpendicular. Komponen paralel tidak mempengaruhi momentum sudut. Yang tegak lurus tidak. Anda dapat menghitung komponen paralel dengan proyeksi vektor. Anda dapat mengurangi itu dari yang asli untuk mendapatkan komponen tegak lurus. Dalam pseudocode ( dotberarti dot-produk)

Vector myForce
Vector momentArm

parallelComponent = momentArm * (dot(myForce, momentArm) / dot(momentArm, momentArm))
angularForce = myForce - parallelComponent

5) Torsi : Komponen gaya tegak lurus dikalikan dengan panjang lengan momen.

Vector angularForce
Vector torque = angularForce * momentArm.Length

Untuk beralih dari Torsi ke kecepatan sudut:

1) Momen Inersia : Definisi berapa banyak inersia rotasi yang dimiliki suatu objek. Sebagai contoh, dibutuhkan lebih banyak torsi untuk memutar batang panjang daripada bola dengan massa yang sama. Jika Anda tidak peduli dengan realisme, Anda dapat berpura-pura momen inersia relatif terhadap massa, atau Anda bisa mengabaikan bentuk dan massa objek sepenuhnya.

2) percepatan sudut :

Vector angularAcceleration = torque / momentOfInertia

3) Kecepatan Sudut : Kecepatan sudut akan terus meningkat selama torsi diterapkan. Jadi rumus kira-kira akan menjadi "Kecepatan Sudut pada saat T adalah jumlah kumulatif percepatan Angular hingga T. " Ini dinyatakan dalam pseudocode sebagai

void Update(float elapsedSeconds):
    orientation += 0.5 * angularVelocity * elapsedSeconds;
    angularVelocity += angularAcceleration * elapsedSeconds;
    orientation += 0.5 * angularVelocity * elapsedSeconds;
Jimmy
sumber
Akan tetapi, informasi hebat, bagian yang paling tidak jelas bagi saya adalah bagaimana menentukan gaya torsi yang seharusnya. Saya memiliki semua komponen pada tempatnya seperti yang telah Anda jelaskan.
jgallant
@ Jon: Anda memiliki komponen, artinya Anda memiliki langkah 1 - 3 dan tidak tahu cara menghitung langkah 4? Itu terutama langkah yang sulit. Saya akan menambahkan sedikit lebih detail di sana.
Jimmy
3
Orientasi sebagai jumlah kumulatif dari kecepatan sudut, orientation += angularVelocity * elapsedSecondsadalah salah karena terlalu melebih-lebihkan kecepatan pada langkah waktu, yang berarti bahwa framerate yang berbeda akan memberikan orientasi yang berbeda. Sebuah formula yang tepat akan menjadi: float oldVelocity = angularVelocity; angularVelocity += angularAcceleration * elapsedSeconds; orientation += 0.5f * (angularVelocity + oldVelocity) * elapsedSeconds;. Juga, karena tidak ada gravitasi, saya sarankan menggunakan "pusat massa" sebagai gantinya. +1 untuk penjelasan yang sangat bagus.
sam hocevar
1
Bagian dari gaya tegak lurus akan bertindak untuk mempercepat pusat massa, dan ketika gaya diterapkan lebih dekat ke pusat massa, faktor ini meningkat. Jawabannya bagus dan sangat jelas, tetapi tampaknya tidak lengkap dalam hal ini.
Sam Watkins
Untuk menjawab komentar saya sendiri, saya membaca artikel Chris Hecker tentang fisika: chrishecker.com/Rigid_body_dynamics . Ternyata suatu gaya atau impuls pada titik mana pun memiliki efek yang diketahui pada pusat massa menurut F = ma atau a2 = a1 + p, seolah-olah tubuh tidak dapat berputar. Ini mengikuti dari hukum kekekalan momentum linear. Komponen gaya yang tegak lurus terhadap jari-jari juga menyebabkan torsi dan perubahan momentum sudut, seperti dijelaskan dalam jawaban Jimmy.
Sam Watkins
7

jika gaya tidak terlalu kuat akan jauh lebih mudah untuk mensimulasikan rotasi menggunakan banyak titik dan pegas yang menghubungkannya. dalam hal ini Anda hanya menganggap bentuk Anda terdiri dari beberapa titik yang dihubungkan oleh pegas. setiap titik mewakili massa dan semua benda lainnya memiliki massa sama dengan nol.

pegas & titik

pada gambar di atas, titik hitam mewakili massa dan garis merah mewakili pegas. lalu untuk menerapkan gaya Anda hanya perlu menerapkannya ke titik terdekat dan Anda akan melihat objek Anda akan berputar seperti yang Anda inginkan. untuk membuat bentuk Anda terlihat seperti struktur yang solid lebih baik untuk mendefinisikan mata air dengan nilai redaman tinggi dan nilai k tinggi.

Ali1S232
sumber