Fisika tersentak
Perpustakaan fisika dan deteksi tabrakan yang ramah multi -inti. Cocok untuk game dan aplikasi VR. Digunakan oleh Horizon Forbidden West.
|
|---|
| Video YouTube yang menampilkan tumpukan Ragdoll yang disimulasikan dengan fisika tersentak. |
Untuk lebih banyak demo dan video, kunjungi bagian sampel.
Pertimbangan desain
Mengapa membuat mesin fisika lain? Pertama, ini telah menjadi proyek pembelajaran pribadi. Kedua, saya ingin mengatasi beberapa masalah yang saya miliki dengan mesin fisika yang ada:
- Game melakukan lebih dari sekadar mensimulasikan fisika. Hal -hal ini terjadi di beberapa utas. Kami menekankan pada mengakses data fisika secara bersamaan di luar pembaruan simulasi utama:
- Bagian simulasi dapat dimuat / diturunkan di latar belakang. Kami menyiapkan sejumlah tubuh fisika pada utas latar belakang tanpa mengunci atau mempengaruhi simulasi. Kami memasukkan batch ke dalam simulasi dengan dampak minimal pada kinerja.
- Kueri tabrakan dapat berjalan sejajar dengan menambah / menghapus atau memperbarui tubuh. Jika perubahan pada tubuh terjadi di utas yang sama, perubahan akan segera terlihat. Jika perubahan terjadi di utas lain, kueri akan melihat konsisten sebelum atau sesudah keadaan. Alternatifnya adalah memiliki versi membaca dan menulis dunia. Ini mencegah perubahan menjadi segera terlihat, jadi kami menghindari ini.
- Kueri tabrakan dapat berjalan sejajar dengan simulasi fisika utama. Kami melakukan pemeriksaan kasar (kueri fase luas) sebelum langkah simulasi dan melakukan pemeriksaan halus (kueri fase sempit) di latar belakang. Dengan cara ini, proses berjalan yang lama (seperti generasi navigasi mesh) dapat tersebar di beberapa frame.
- Bangun tubuh yang tidak disengaja menyebabkan masalah kinerja saat memuat / membongkar konten. Oleh karena itu, tubuh tidak akan bangun secara otomatis saat dibuat. Mayat tetangga tidak akan terbangun ketika mayat dihilangkan. Ini dapat dipicu secara manual jika diinginkan.
- Simulasi berjalan secara deterministik. Anda dapat mereplikasi simulasi ke klien jarak jauh hanya dengan mereplikasi input ke simulasi. Baca bagian simulasi deterministik untuk memahami batasannya.
- Kami mencoba mensimulasikan perilaku tubuh yang kaku di dunia nyata tetapi membuat perkiraan. Oleh karena itu, perpustakaan ini terutama harus digunakan untuk game atau simulasi VR.
Fitur
- Simulasi tubuh kaku dari berbagai bentuk menggunakan deteksi tabrakan kontinu:
- Bola
- Kotak
- Kapsul
- Kapsul meruncing
- Silinder
- Tapered-Cylinder
- Hull cembung
- Pesawat
- Menggabungkan
- Mesh (segitiga)
- Medan (lapangan tinggi)
- Simulasi kendala antar tubuh:
- Tetap
- Titik
- Jarak (termasuk mata air)
- Engsel
- Slider (juga disebut prismatik)
- Kerucut
- Rak dan pinion
- Gigi
- Katrol
- Jalur spline yang halus
- Swing-twist (untuk bahu humanoid)
- 6 dof
- Motor untuk mendorong kendala.
- Deteksi Tabrakan:
- Casting Rays.
- Bentuk pengujian vs bentuk.
- Melemparkan bentuk vs bentuk lain.
- Broadphase hanya menguji untuk dengan cepat menentukan objek mana yang dapat berpotongan.
- Sensor (volume pemicu).
- Ragdoll animasi:
- Kunci keras (hanya tubuh kaku kinematik).
- Kunci lunak (pengaturan kecepatan pada tubuh kaku dinamis).
- Mengemudi kendala motor ke pose animasi.
- Memetakan kerangka detail tinggi (animasi) ke kerangka detail rendah (ragdoll) dan sebaliknya.
- Simulasi Karakter Game (kapsul)
- Karakter tubuh yang kaku. Bergerak selama simulasi fisika. Opsi termurah dan respons tabrakan paling akurat antara karakter dan badan dinamis.
- Karakter virtual. Tidak memiliki tubuh yang kaku dalam simulasi tetapi mensimulasikan satu menggunakan pemeriksaan tabrakan. Diperbarui di luar pembaruan fisika untuk kontrol lebih lanjut. Interaksi yang kurang akurat dengan tubuh dinamis.
- Kendaraan
- Kendaraan beroda.
- Kendaraan yang dilacak.
- Sepeda motor.
- Simulasi tubuh lembut (misalnya bola lembut atau sepotong kain).
- Kendala tepi.
- Kendala tikungan dihedral.
- Kendala Volume Tetrahedron.
- Kendala lampiran jarak jauh (juga disebut Tethers).
- Membatasi simulasi untuk tetap berada dalam kisaran tertentu dari titik berkulit.
- Tekanan internal.
- Tabrakan dengan tubuh kaku yang disimulasikan.
- Tes tabrakan terhadap tubuh lunak.
- Perhitungan daya apung air.
- Mode presisi ganda opsional yang memungkinkan dunia besar.
Platform yang didukung
- Windows (Desktop atau UWP) X86/X64/ARM32/ARM64
- Linux (Diuji pada Ubuntu) X64/ARM64
- Freebsd
- Android X86/X64/ARM32/ARM64
- Platform Blue (konsol game populer) x64
- MacOS x64/ARM64
- iOS x64/ARM64
- MSYS2 MINGW64
- WebAssembly, lihat proyek terpisah ini.
Fitur CPU yang diperlukan
- Pada x86/x64 persyaratan minimal adalah SSE2. Perpustakaan dapat dikompilasi menggunakan SSE4.1, SSE4.2, AVX, AVX2, atau AVX512.
- Pada ARM64 perpustakaan menggunakan neon dan fp16. Pada ARM32 dapat dikompilasi tanpa instruksi CPU khusus.
Dokumentasi
Untuk mempelajari lebih lanjut tentang Jolt, buka arsitektur terbaru dan dokumentasi API. Dokumentasi untuk rilis tertentu juga tersedia.
Untuk memulai, lihat contoh HelloWorld. Contoh HelloWorld Menggunakan CMake FetchContent juga tersedia untuk menunjukkan bagaimana Anda dapat mengintegrasikan Fisika Jolt dalam proyek CMake.
Beberapa algoritma yang digunakan oleh Jolt dijelaskan secara rinci dalam GDC 2022 Talk: Arsitekting Fisika Jolt untuk 'Horizon Forbidden West' (slide, slide dengan catatan speaker, video).
Menyusun
- Kompilasi dengan Visual Studio 2019+, Clang 10+ atau GCC 9+.
- Menggunakan C ++ 17.
- Hanya tergantung pada pustaka template standar.
- Tidak menggunakan RTTI.
- Tidak menggunakan pengecualian.
Jika Anda ingin menjalankan di Platform Blue, Anda harus menyediakan lingkungan build dan platformblue Anda sendiri. Karena persyaratan NDA. File ini tersedia di Platform Blue Developer Forum.
Untuk instruksi build, buka bagian build. Saat meningkatkan dari versi perpustakaan yang lebih lama, buka catatan rilis atau bagian perubahan API.
Pertunjukan
Jika Anda tertarik pada bagaimana jolt berskala dengan beberapa CPU dan dibandingkan dengan mesin fisika lainnya, lihat dokumen ini.
Struktur folder
- Aset - Folder ini berisi aset yang digunakan oleh TestFramework, sampel dan Joltviewer.
- Build - Berisi semua yang diperlukan untuk membangun perpustakaan, lihat bagian build.
- Documents - berisi dokumentasi untuk perpustakaan.
- HelloWorld - Aplikasi sederhana yang menunjukkan cara menggunakan perpustakaan Fisika Jolt.
- Jolt - Semua kode sumber untuk perpustakaan ada di folder ini.
- JOLTVIEWER - Dimungkinkan untuk merekam output mesin fisika menggunakan kelas DebugRenderErcorder (file .jor), folder ini berisi kode sumber ke aplikasi yang dapat memvisualisasikan perekaman. Ini berguna untuk EG memvisualisasikan output dari performancetest dari platform yang berbeda. Saat ini tersedia di Windows saja.
- PerformanceTest - Berisi aplikasi sederhana yang menjalankan tes kinerja dan mengumpulkan informasi waktu.
- Sampel - Ini berisi aplikasi sampel, lihat bagian sampel. Saat ini tersedia di Windows saja.
- TestFramework - Kerangka kerja rendering untuk memvisualisasikan hasil mesin fisika. Digunakan oleh sampel dan joltviewer. Saat ini tersedia di Windows saja.
- Unittests - Satu set tes unit untuk memvalidasi perilaku mesin fisika.
- Webincludes - Sejumlah sumber daya JavaScript yang digunakan oleh kerangka profil internal dari mesin fisika.
Binding untuk bahasa lain
- C di sini dan di sini
- C#
- Jawa
- Javascript
- Zig
Integrasi di mesin lain
Lihat daftar proyek yang menggunakan Fisika Jolt di sini.
Lisensi
Proyek ini didistribusikan di bawah lisensi MIT.
Kontribusi
Semua kontribusi dipersilakan! Jika Anda bermaksud melakukan perubahan yang lebih besar, silakan diskusikan terlebih dahulu di bagian Diskusi GitHub. Untuk perubahan non-sepele, kami mengharuskan Anda menyetujui perjanjian kontributor. Saat Anda membuat PR, CLA Assistant akan meminta Anda untuk menandatanganinya.