7 days of WordPress themes, graphics & videos - for free!* Unlimited asset downloads! Start 7-Day Free Trial
Advertisement
  1. Game Development
  2. Programming

Bagaimana untuk menciptakan 2D kebiasaan fisika mesin: berorientasi kaku tubuh

Scroll to top
Read Time: 15 mins
This post is part of a series called How to Create a Custom Physics Engine.
How to Create a Custom 2D Physics Engine: Friction, Scene and Jump Table

Indonesian (Bahasa Indonesia) translation by fodal fadel (you can also view the original English article)

Sejauh ini, kita telah membahas impuls resolusi, inti arsitektur dan gesekan. Dalam hal ini, tutorial terakhir dalam seri ini, kami akan pergi ke topik yang sangat menarik: orientasi.

Pada artikel ini kita akan membahas topik-topik berikut:

  • Rotasi matematika
  • Bentuk berorientasi
  • Deteksi tumbukan
  • Tabrakan resolusi

Saya sangat merekomendasikan membaca di tiga artikel sebelumnya dalam seri sebelum mencoba untuk menangani satu ini. Sebagian besar informasi kunci di artikel sebelumnya adalah prasyarat untuk beristirahat dari artikel ini.


Contoh kode

Saya telah membuat sebuah mesin sampel kecil dalam c + +, dan saya merekomendasikan bahwa Anda browse dan merujuk pada kode sumber seluruh membaca artikel ini, karena banyak rincian implementasi praktis tidak bisa masuk ke dalam artikel itu sendiri.

Repo GitHub ini berisi mesin sampel itu sendiri, bersama dengan sebuah proyek Visual Studio 2010. GitHub memungkinkan Anda untuk melihat sumber tanpa perlu men-download sumber itu sendiri, untuk kenyamanan Anda.


Orientasi matematika

Matematika yang melibatkan rotasi di 2D cukup sederhana, meskipun penguasaan subjek akan diminta untuk membuat sesuatu yang berharga dalam mesin fisika. Newton kedua hukum menyatakan:

\ [Persamaan \: 1:\\
F = ma\]

Ada persamaan serupa yang berhubungan secara khusus Angkatan sudut dan percepatan sudut. Namun, sebelum persamaan ini dapat ditampilkan, keterangan singkat tentang produk salib di 2D diperlukan.

Perkalian vektor

Produk kayu salib dalam 3D adalah operasi yang terkenal. Namun, produk kayu salib di 2D bisa cukup membingungkan, benar-benar tidak ada interpretasi geometris yang padat.

Produk kayu salib 2D, tidak seperti versi 3D, tidak kembali vektor tetapi skalar. Nilai skalar ini benar-benar mewakili besarnya vektor ortogonal sepanjang sumbu z, jika produk cross benar-benar dilakukan dalam 3D. Dengan cara, salib 2D produk ini hanya versi sederhana dari produk salib 3D, karena ekstensi 3D vektor matematika.

Jika ini membingungkan, jangan khawatir: pemahaman yang menyeluruh tentang produk salib 2D ini tidak semua yang diperlukan. Hanya tahu persis bagaimana untuk melakukan operasi, dan tahu bahwa urutan operasi penting: \ (\times b\) adalah tidak sama dengan \(b \times a\). Artikel ini akan membuat penggunaan berat produk salib untuk mengubah sudut kecepatan menjadi kecepatan linier.

Mengetahui bagaimana melakukan produk salib di 2D sangat penting, namun. Dua vektor dapat menyeberang, skalar dapat disilangkan dengan vektor, dan sebuah vektor dapat disilangkan dengan skalar. Berikut adalah operasi:

Torsi dan kecepatan sudut

Seperti yang kita semua harus tahu dari artikel sebelumnya, persamaan ini mewakili hubungan antara Angkatan bertindak atas tubuh dengan massa tubuh itu dan percepatan. Ada analog putaran:

\ [Persamaan \: 2:\\
T = r \: \times \: \omega\]

\(T\) adalah singkatan dari torsi. Torsi adalah kekuatan rotasi.

\(r\) adalah vektor dari pusat massa (COM) titik tertentu pada objek. \(r\) dapat dianggap sebagai merujuk kepada "jari" dari COM ke titik. Setiap titik unik pada objek akan membutuhkan nilai \(r\) berbeda diwakili di persamaan 2.

\(\omega\) disebut "omega", dan mengacu pada kecepatan rotasi. Hubungan ini akan digunakan untuk mengintegrasikan kecepatan sudut dari tubuh kaku.

Hal ini penting untuk memahami bahwa linier kecepatan kecepatan COM tubuh kaku. Dalam artikel sebelumnya, semua benda telah tidak ada komponen rotasi, sehingga kecepatan linier com adalah kecepatan yang sama untuk semua poin pada tubuh. Ketika orientasi diperkenalkan, poin jauh dari COM memutar lebih cepat daripada yang dekat COM. Ini berarti kita perlu persamaan baru menemukan kecepatan dari titik pada tubuh, karena tubuh sekarang dapat berputar dan menerjemahkan pada waktu yang sama.

Menggunakan persamaan berikut untuk memahami hubungan antara titik pada tubuh dan kecepatan saat itu:

\ [Persamaan \: 3:\\
\omega = r \: \times v \]

\(v\) mewakili kecepatan linier. Untuk mengubah linier kecepatan menjadi kecepatan sudut, cross jari-jari \(r\) dengan \(v\).

Demikian pula, kita dapat mengatur ulang 3 persamaan untuk membentuk versi lain:

\ [Persamaan \: 4:\\
v = \omega \: \times r \]

Persamaan dari bagian terakhir cukup kuat hanya jika kaku tubuh memiliki kepadatan seragam. Bebas-seragam kepadatan membuat matematika terlibat dalam menghitung sesuatu diperlukan rotasi dan perilaku tubuh kaku terlalu rumit. Selain itu, jika titik mewakili tubuh kaku tidak di COM, maka perhitungan mengenai \(r\) akan menjadi sepenuhnya miring.

Inersia

Dalam dua dimensi objek berputar tentang z-sumbu imajiner. Putaran ini dapat cukup sulit tergantung pada berapa banyak massa objek telah, dan seberapa jauh dari COM objek 's massa. Sebuah lingkaran dengan massa sama tongkat tipis panjang akan lebih mudah untuk memutar dari batang. Ini "kesulitan untuk memutar" faktor dapat dianggap sebagai Momen inersia suatu objek.

Dalam arti, inersia adalah massa Rotasi obyek. Inersia lebih sesuatu telah, semakin sulit untuk mendapatkannya berputar.

Mengetahui hal ini, salah satu bisa menyimpan inersia objek dalam tubuh sebagai format yang sama sebagai massa. Itu akan bijaksana untuk juga menyimpan invers nilai inersia ini, berhati-hati untuk tidak melakukan pembagian dengan nol. Silakan lihat artikel sebelumnya dalam seri ini untuk informasi lebih lanjut di massa dan massa terbalik.

Integrasi

Setiap tubuh kaku akan memerlukan beberapa bidang lain untuk menyimpan informasi rotasi. Berikut adalah sebuah contoh cepat dari sebuah struktur untuk menyimpan beberapa data tambahan:

Mengintegrasikan kecepatan sudut dan orientasi tubuh sangat mirip dengan integrasi kecepatan dan percepatan. Berikut adalah contoh cepat kode untuk menunjukkan bagaimana hal ini dilakukan (Catatan: rincian tentang integrasi tertutup dalam artikel sebelumnya):

Dengan jumlah kecil informasi yang disajikan sejauh ini, Anda harus dapat mulai memutar berbagai hal pada layar tanpa ada masalah. Dengan hanya beberapa baris kode, sesuatu yang agak mengesankan dapat dibangun, mungkin dengan melempar sebuah bentuk ke udara sementara berputar tentang COM sebagai gravitasi menariknya ke bawah untuk membentuk jalur arced perjalanan.

Mat22

Orientasi harus disimpan sebagai nilai tunggal radian, seperti yang terlihat di atas, meskipun sering kali penggunaan matriks putaran kecil dapat menjadi pilihan yang jauh lebih baik untuk beberapa bentuk.

Sebuah contoh yang bagus adalah berorientasi berlari kotak (OBB). OBB terdiri dari tingkat yang lebar dan tinggi, yang keduanya dapat diwakili oleh vektor. Vektor-vektor dua sejauh ini kemudian dapat diputar oleh rotasi dua oleh dua matriks mewakili sumbu OBB.

Saya sarankan penciptaan kelas matriks Mat22 yang akan ditambahkan ke Perpustakaan matematika apa pun yang Anda gunakan. Saya sendiri menggunakan sebuah perpustakaan kecil kustom matematika yang dikemas dalam demo sumber terbuka. Berikut adalah contoh dari apa benda seperti itu yang mungkin terlihat seperti:

Beberapa operasi yang berguna meliputi: konstruksi dari sudut, konstruksi dari kolom vektor, transpos, kalikan dengan Vec2, kalikan dengan lain Mat22, nilai mutlak.

Fungsi berguna terakhir adalah untuk dapat mengambil kolom x atau y dari vektor. Fungsi kolom akan terlihat seperti:

Teknik ini berguna untuk mengambil vektor satuan sepanjang sumbu rotasi, sumbu x atau y. Selain itu, dua oleh dua matriks dapat dibangun dari dua unit ortogonal vektor, seperti setiap vektor dapat langsung dimasukkan ke dalam baris. Meskipun metode konstruksi ini agak jarang untuk 2D fisika mesin, itu masih bisa sangat berguna untuk memahami bagaimana rotasi dan matriks bekerja secara umum.

Konstruktor ini mungkin terlihat seperti:

Karena operasi matriks putaran yang paling penting adalah untuk melakukan rotasi didasarkan dari sudut, sangat penting untuk membangun sebuah matriks dari sudut dan kalikan vektor oleh ini matriks (untuk memutar berlawanan arah jarum jam vektor oleh sudut matriks adalah dibangun dengan):

Untuk singkatnya saya tidak akan memperoleh mengapa matriks berlawanan arah jarum jam rotasi bentuk:

Namun sangat penting untuk setidaknya tahu bahwa ini adalah bentuk matriks rotasi. Untuk informasi lebih lanjut tentang rotasi matriks silakan lihat di halaman Wikipedia.


Mengubah dasar

Hal ini penting untuk memahami perbedaan antara model dan dunia ruang. Model ruang adalah koordinat sistem lokal ke bentuk fisika. Asal adalah di COM, dan orientasi sistem koordinat sejajar dengan sumbu bentuk itu sendiri.

Untuk mengubah bentuk ke dunia ruang itu harus diputar dan diterjemahkan. Rotasi harus terjadi pertama, sebagai rotasi selalu dilakukan tentang asal. Karena objek dalam ruang model (asal di COM), rotasi akan memutar tentang COM bentuk. Rotasi akan terjadi dengan matriks Mat22. Dalam kode contoh, orientasi matriks yang u nama.

Setelah rotasi dijalankan, objek dapat kemudian diterjemahkan ke posisi di dunia oleh penjumlahan vektor.

Setelah objek dalam dunia ruang, itu dapat kemudian diterjemahkan ke ruang model object yang sama sekali berbeda dengan menggunakan transformasi invers. Invers rotasi, diikuti oleh invers terjemahan digunakan untuk melakukannya. Ini adalah berapa banyak matematika sederhana selama deteksi tabrakan!

Inverse transformation from world space to model space of the red polygon.Inverse transformation from world space to model space of the red polygon.Inverse transformation from world space to model space of the red polygon.
Invers transformasi (kiri ke kanan) dari dunia ruang ke ruang model poligon merah.

Seperti yang terlihat dalam gambar di atas, jika invers transformasi obyek merah diterapkan untuk poligon merah dan biru, kemudian tes deteksi tabrakan dapat dikurangi untuk bentuk AABB vs OBB tes, bukan komputasi matematika yang rumit antara dua bentuk yang berorientasi.

Dalam sebagian besar kode sumber contoh, simpul terus-menerus berubah dari model untuk dunia dan kembali ke model, untuk berbagai alasan. Anda harus memiliki pemahaman yang jelas tentang apa artinya untuk memahami kode deteksi tabrakan sampel.


Deteksi tabrakan dan generasi Manifold

Dalam bagian ini, saya akan hadir cepat garis tabrakan poligon dan lingkaran. Silakan lihat sampel kode sumber untuk lebih banyak rincian pelaksanaan mendalam.

Poligon untuk poligon

Mari kita mulai dengan rutin deteksi tabrakan paling kompleks di seluruh artikel seri ini. Ide untuk memeriksa tumbukan antara dua poligon yang terbaik dilakukan (menurut saya) dengan teorema sumbu memisahkan (SAT).

Namun, bukan memproyeksikan setiap poligon extent ke satu sama lain, ada metode yang sedikit lebih baru dan lebih efisien, seperti yang digariskan oleh Dirk Gregorius dalam ceramahnya GDC 2013 (slide tersedia di sini secara gratis).

Hal pertama yang harus dipelajari adalah konsep dukungan poin.

Dukungan poin

Titik dukungan sebuah poligon adalah vertex yang terjauh sepanjang arah yang diberikan. Jika dua Vertex memiliki jarak sepanjang arah tertentu, baik dapat diterima.

Untuk menghitung titik pendukung, produk dot harus digunakan untuk menemukan jarak yang ditandatangani bersama arah yang diberikan. Karena ini sangat sederhana, aku akan menunjukkan sebuah contoh cepat dalam artikel ini:

Produk dot digunakan pada titik setiap. Produk dot mewakili jarak ditandatangani dalam arah tertentu, jadi vertex dengan jarak proyeksi terbesar akan menjadi vertex kembali. Operasi ini dilakukan dalam model ruang poligon diberikan dalam mesin sampel.

Menemukan Axis pemisahan

Dengan menggunakan konsep dukungan poin, mencari sumbu pemisahan dapat dilakukan antara dua poligon (poligon A dan poligon B). Gagasan tentang pencarian ini adalah loop sepanjang semua wajah poligon A dan menemukan titik dukungan dalam negatif normal untuk wajah itu.

SupportPoints

Gambar di atas, dua dukungan poin ditampilkan: satu di setiap objek. Normal biru akan sesuai dengan titik mendukung poligon lain sebagai vertex terjauh sepanjang dalam arah yang berlawanan normal biru. Demikian pula, normal merah akan digunakan untuk menemukan titik dukungan yang terletak di ujung panah merah.

Jarak dari masing-masing pendukung titik ke wajah saat ini akan ditandatangani penetrasi. Dengan menyimpan jarak terbesar mungkin minimal poros penetrasi dapat direkam.

Berikut adalah contoh fungsi dari kode sumber contoh yang menemukan sumbu mungkin minimal penetrasi menggunakan GetSupport fungsi:

Karena fungsi ini mengembalikan penetrasi terbesar, jika penetrasi ini positif itu berarti dua bentuk tidak bertumpuk (penetrasi negatif akan menandakan axis tidak pisah).

Fungsi ini akan perlu untuk dapat disebut dua kali, membalik objek A dan B setiap panggilan.

Kliping insiden dan referensi wajah

Dari sini, insiden dan referensi wajah perlu diidentifikasi, dan wajah insiden perlu dipotong terhadap pesawat sisi wajah referensi. Ini adalah operasi yang agak non-sepele, meskipun Erin Catto (pencipta Box2D, dan semua fisika saat ini digunakan oleh Blizzard) telah menciptakan beberapa slide besar yang meliputi topik ini secara rinci.

Kliping ini akan menghasilkan dua titik kontak potensial. Semua kontak poin di belakang referensi wajah dapat dianggap sebagai titik kontak.

Selain slide Erin Catto, Mesin sampel juga memiliki rutinitas kliping diimplementasikan sebagai contoh.

Lingkaran untuk poligon

Lingkaran vs poligon tabrakan rutin ini cukup sedikit lebih sederhana daripada poligon vs deteksi tabrakan poligon. Pertama, wajah terdekat di poligon ke pusat lingkaran dihitung dengan cara yang sama untuk menggunakan dukungan poin dari bagian sebelumnya: dengan mengulang melalui normal wajah setiap poligon dan menemukan jarak dari pusat circle ke wajah.

Jika Pusat lingkaran di belakang ini wajah yang terdekat, informasi kontak tertentu dapat dihasilkan dan rutin dapat segera berakhir.

Setelah mengidentifikasi wajah terdekat, tes devolves ke segmen garis vs lingkaran tes. Ruas garis memiliki tiga wilayah yang menarik yang disebut Voronoi daerah. Memeriksa diagram berikut:

Voronoi regions of a line segment.Voronoi regions of a line segment.Voronoi regions of a line segment.
Voronoi daerah segmen garis.

Secara intuitif, tergantung pada mana pusat lingkaran terletak informasi kontak yang berbeda dapat diturunkan. Bayangkan Pusat lingkaran terletak di wilayah vertex baik. Ini berarti bahwa titik terdekat dengan pusat circle akan vertex tepi, dan tumbukan tepat normal akan vektor dari titik ini ke pusat lingkaran.

Jika lingkaran dalam wilayah wajah maka titik terdekat segmen ke pusat lingkaran akan proyek Pusat lingkaran ke segmen. Tumbukan normal hanya akan menjadi wajah normal.

Untuk menghitung wilayah Voronoi yang terletak di lingkaran, kami menggunakan produk dot antara beberapa simpul. Idenya adalah untuk membuat sebuah segitiga imajiner dan menguji untuk melihat apakah sudut sudut dibangun dengan segmen vertex atas atau di bawah 90 derajat. Satu segitiga dibuat untuk setiap vertex segmen garis.

Projecting vector from edge vertex to circle center onto the edge.Projecting vector from edge vertex to circle center onto the edge.Projecting vector from edge vertex to circle center onto the edge.
Memproyeksikan vektor dari vertex tepi lingkaran pusat ke tepi.

Nilai di atas 90 derajat akan berarti wilayah tepi yang telah diidentifikasi. Jika tidak segitiga tepi vertex sudut di atas 90 derajat, kemudian Pusat lingkaran yang perlu diproyeksikan ke segmen sendiri untuk menghasilkan bermacam-macam informasi. Seperti yang terlihat pada gambar di atas, jika vektor dari tepi vertex ke pusat lingkaran yang dihiasi dengan vektor tepi itu sendiri negatif, maka terletak di wilayah Voronoi lingkaran dikenal.

Untungnya, dot produk dapat digunakan untuk menghitung proyeksi ditandatangani, dan tanda ini akan negatif jika di atas 90 derajat dan positif jika di bawah.


Tabrakan resolusi

Waktu itu lagi: kita akan kembali ke kode resolusi dorongan kita untuk ketiga dan terakhir kalinya. Sekarang, Anda harus sepenuhnya nyaman menulis sendiri kode resolusi yang menghitung impuls resolusi, bersama dengan impuls gesekan, dan juga dapat dilakukan linier proyeksi untuk menyelesaikan sisa penetrasi.

Rotasi komponen perlu ditambahkan ke resolusi gesekan dan penetrasi. Sebagian energi akan ditempatkan dalam kecepatan sudut.

Berikut adalah resolusi dorongan kami ketika kami meninggalkan dari artikel sebelumnya pada gesekan:

\ [Persamaan 5: \\
j = \frac{-(1 + e) ((V ^ {A} - V ^ {B}) * t)} {\frac {1} {massa ^ {A}} + \frac{1}{mass^{B}}}
\]

Jika kita melempar dalam rotasi komponen, persamaan akhir akan terlihat seperti ini:

\ [Persamaan 6: \\
j = \frac{-(1 + e) ((V ^ {A} - V ^ {B}) * t)} {\frac {1} {massa ^ {A}} + \frac{1}{mass^{B}} + \frac{(r^{A} \times t) ^ {2}} {saya ^ {A}} + \frac{(r^{B} \times t) ^ {2}} {saya ^ {B}}}
\]

Dalam persamaan di atas, \(r\) adalah lagi "radius", seperti vektor dari COM objek ke titik kontak. Turunan lebih mendalam dari persamaan ini dapat ditemukan di situs Chris Hecker's.

Penting untuk menyadari bahwa kecepatan sebuah titik tertentu pada objek:

\ [Persamaan 7: \\
V' = V + \omega \times r
\]

Aplikasi impuls perubahan sedikit untuk memperhitungkan persyaratan rotasi:


Kesimpulan

Ini menyimpulkan artikel terakhir dari seri ini. Sekarang, beberapa topik yang telah dibahas, termasuk impuls berdasarkan resolusi, manifold generasi, gesekan, dan orientasi, Semua dalam dua dimensi.

Jika Anda telah membuat ini sejauh ini, saya harus mengucapkan selamat kepada Anda! Fisika mesin pemrograman untuk permainan adalah sangat sulit bidang studi. Saya berharap semua pembaca luck, dan sekali lagi silahkan merasa bebas untuk komentar atau mengajukan pertanyaan di bawah ini.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Game Development tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.