- Rapier adalah rangkaian mesin fisika berbasis Rust yang ditujukan untuk aplikasi yang memerlukan fisika real-time seperti game, animasi, dan robotika
- Ditujukan untuk eksekusi cepat dan stabil, serta secara opsional mendukung determinisme lintas platform bila diperlukan
- Menyediakan fitur yang dibutuhkan untuk simulasi fisika seperti tumbukan dan gaya benda tegar, batasan joint, event kontak·sensor, snapshot, dan lainnya
- Menyediakan binding JavaScript sehingga Rapier dapat digunakan juga di lingkungan selain Rust
- Merupakan open source gratis dengan lisensi Apache 2.0, dikembangkan oleh Dimforge dan didukung melalui GitHub Sponsor
Kasus penggunaan yang dituju Rapier
- Rapier adalah rangkaian mesin fisika 2D dan 3D yang ditulis dengan Rust
- Target utamanya adalah aplikasi yang memerlukan pemrosesan fisika real-time
- video game
- animasi
- robotika
- Tujuan desainnya adalah operasi yang cepat dan stabil, dengan dukungan determinisme lintas platform secara opsional
Fitur yang disediakan dan cara distribusinya
- Mencakup fitur utama untuk simulasi fisika
- tumbukan benda tegar dan gaya
- batasan joint
- event kontak dan sensor
- snapshot
- determinisme lintas platform opsional
- binding JavaScript
- Rapier adalah open source gratis dan didistribusikan dengan lisensi Apache 2.0
- Pengembangnya adalah perusahaan open source Dimforge
- Dukungan dapat diberikan melalui GitHub Sponsor
1 komentar
Komentar Hacker News
Membuat game multipemain online dengan mode deterministik Rapier
Pemain bergiliran menabrakkan serangga ke arah tim lawan dan merebut bukit
Belum ada mode pemain tunggal, dan menulis AI-nya lebih sulit daripada game mirip catur yang pernah dibuat sebelumnya
Gamenya bisa dilihat di https://evrimzone.itch.io/crittershowdown, dan sumber logika fisika/game ada di https://github.com/evrimoztamur/crittershowdown/blob/e4d9a19...
Nanti saya berencana menulis bagaimana semuanya dirangkai dan apa yang dipelajari; secara keseluruhan ini pustaka yang sangat solid, dan berkat desain API yang terasa khas Rust saya bisa mengimplementasikan semua yang diperlukan
Penasaran apakah dikompilasi ke WebAssembly, atau seluruh logikanya di-host di server lokal
Beberapa bulan lalu saya terpikat pada Aljabar Geometrik (Geometric Algebra), dan itu tampak seperti cara yang sangat ringkas dan intuitif untuk menangani beragam geometri: 2D, 3D, 4D ke atas, non-Euklides, dan lain-lain
Jadi saya penasaran apakah aljabar geometrik bisa menjadi fondasi yang baik untuk engine fisika
Ada beberapa pustaka Rust yang tampak menarik [1][2], tetapi sepertinya belum ada yang mendapat perhatian besar
Penasaran apakah ada yang sudah menelusuri bidang ini
[1]: https://crates.io/keywords/geometric-algebra
[2]: https://github.com/Lichtso/geometric_algebra
Jika ingin mulai, “Why can't you multiply vectors?” dari Freya Holmér bisa menjadi pintu masuk yang bagus: https://www.youtube.com/watch?v=htYh-Tq7ZBI dan https://bivector.net/index.html
Aljabar geometrik isomorfik dengan aljabar vektor Heaviside “klasik”, sedangkan masalah sulitnya ada pada penanganan tumbukan, konservasi energi, stabilitas, dan semacamnya
Jadi saya membuat pustaka yang bisa menghasilkan aljabar geometrik arbitrer dan melakukan berbagai operasi menarik, dan bisa juga dipakai sebagai fondasi engine fisika
Kalau tertarik, ada di sini: https://cljdoc.org/d/net.clojars.jordibc/geometric-algebra/
Saya menulis panduan plugin Bevy Rapier untuk Rust: https://taintedcoders.com/bevy/rapier/
Di sisi Bevy ada juga alternatif menarik, Bevy XPBD, dan itu juga sudah saya rangkum dalam tulisan: https://taintedcoders.com/bevy/xpbd/
Disebutkan bahwa “Sleeping” adalah teknik untuk meningkatkan performa dengan mengurangi biaya simulasi objek yang tidak bergerak, dan dapat disetel dengan resource
SleepingThresholdContoh nilai default-nya mencakup
linear: 0.1,angular: 0.2Sampai sekarang ada satu masalah ketika beberapa tumbukan menghilang selama satu frame, tetapi hal seperti ini mudah diakali, atau lebih baik lagi dilaporkan agar bisa diperbaiki
Sejauh ini hanya rotasi yang belum benar-benar beres, selebihnya kompleksitasnya terasa meleleh begitu saja
Aljabar linear? Tidak perlu. Cukup
Vec3. Matriks? Solver? Seperti kembali ke tahun 1998, cukup penuhi semua constraint secara iteratifMargin tumbukan? Masalah skill. Broad phase? GJK? Jangan terlalu dipikirkan, serahkan saja ke CPU modern
Setelah mengoptimalkan
collect_pairslalu menyadari bahwa bottleneck sebenarnya adalahmallocdan memperbaikinya, sekitar 100 objek bisa ditangani dengan mudah. Tidak perlu BulletTahap koreksi kecepatan juga awalnya membingungkan, tetapi setelah membuat prototipe dengan AABB, rasanya bisa dipindahkan lagi ke bentuk umum
Awalnya saya melewatkan tahap ini, dan semua tumbukan jadi sedikit berperilaku seperti elastis
Dimforge benar-benar melakukan pekerjaan yang luar biasa
Akan sangat menarik jika nalgebra + Rust bisa menggantikan Eigen + C++ di bidang seperti lokalisasi dan pemetaan dalam robotika
Banyak hal di Rust yang langsung berjalan begitu saja. Sayangnya masih ada generasi lama yang bersikeras menolak berinvestasi di Rust
Jujur saja, karena ada industri besar di sekitar kode robotika C++, saya bisa memahami alasannya
Saya penasaran apakah saat ini ada framework robotika yang layak dipakai di Rust
Saya dengar ROS2 perlahan mulai memasukkan Rust [1], tetapi tidak begitu tahu sejauh apa perkembangannya
Karena integrasi/abstraksi hardware sudah tersedia dalam C++, ROS bisa menjadi pintu masuk yang baik ke sensor fusion, pemetaan, dan lokalisasi
Saya juga penasaran apakah perusahaan-perusahaan sudah menggunakannya
[1] https://github.com/ros2-rust/ros2_rust
Dari ingatan saya saat membuat engine fisika benda tegar puluhan tahun lalu, stacking adalah masalah yang sangat sulit
Saat itu solusi terbaik untuk menghindari objek tenggelam ke lantai adalah membuat graf asiklik berarah yang dimulai dari lantai dan mendorong objek ke luar
Agar konvergen, ini harus diulang berkali-kali dan terasa cukup hacky
Saya penasaran apakah masalah ini sudah terpecahkan sekarang. Saya tidak menemukan penyebutan tentang stacking di proyek ini
Video penulis yang ditautkan di bagian bawah artikel menunjukkan bagaimana tiap solver menangani berbagai masalah stacking yang sulit: https://youtu.be/sKHf_o_UCzI
Tidak perlu graf asiklik, dan jika jumlah iterasi solver dinaikkan cukup banyak, ia akan konvergen
Mengingat jumlah constraint kontak dan gesekan, melakukan banyak iterasi adalah hal yang wajar, dan jika melacak residual maksimum, Anda bisa menjalankannya sampai hampir mencapai 0
Bagian yang agak bermasalah adalah collision dan solver hanya berjalan pada frekuensi update yang terbatas
Jika dari awal sudah dimulai dalam keadaan saling menembus, itu harus diselesaikan, tetapi benda nyata tidak menembus seperti itu, jadi ini agak merupakan penanganan “palsu” dan dapat menimbulkan gerakan tambahan yang mengurangi stabilitas stack
Meski begitu, ada berbagai cara untuk mengakalinya, dan engine fisika populer masing-masing punya solusi dengan caranya sendiri
Rust tampaknya terus membuktikan stereotipnya
Saya teringat lelucon bahwa ada 50 game engine yang dibuat dengan Rust, tetapi hanya 5 game yang dibuat dengan Rust
Rapier tidak benar-benar memenuhi kebutuhan yang saya perlukan, tetapi tidak ada alternatif yang bagus
Jadi sepertinya ini memungkinkan untuk game 2D kecil yang tidak perlu banyak menulis kode engine
Game ini sebagian besar menangani semuanya dengan SDL
Saya juga pernah membuat demo web kecil dengan Rapier: https://github.com/iErcann/NotRoblox
Saya tidak memakai Rust
Hal yang saya suka adalah dokumentasinya lebih baik daripada AmmoJS. Untuk AmmoJS, saya harus membaca pybullet
Rapier relatif modern, dan bisa dijalankan di sisi server (Node) maupun klien (browser)
Di sini saya menjalankannya di sisi server, tetapi menjalankannya di kedua sisi lalu mengimplementasikan prediksi dan koreksi klien juga memungkinkan
Bundle-nya juga kecil. Seingat saya AmmoJS sekitar 2MB
Untungnya masih terikat ke versi sebelumnya, jadi tidak terlalu buruk
Interoperabilitas JavaScript-nya juga sangat bagus: https://www.rapier.rs/docs/user_guides/javascript/getting_st...
https://threlte.xyz/docs/reference/rapier/getting-started
Dimforge dulu punya engine fisika bernama nphysics, yang mendukung soft body dan multibody
Sekarang engine itu ditinggalkan demi Rapier, tetapi Rapier bahkan belum mendukung setengah dari fitur-fitur itu atau fitur lain yang dulu dimiliki nphysics
Akibatnya, nphysics terlalu tua sehingga sulit dipakai di ekosistem modern, sementara Rapier terlalu baru sehingga fiturnya jauh lebih sedikit
Hal serupa juga pernah terjadi sebelumnya. Ada library simulasi fluida bernama Salva yang mendukung coupling dua arah dengan nphysics dan berjalan di semua GPU/CPU, tetapi sekarang ditinggalkan demi Sparkl
Namun Sparkl tidak memiliki fitur-fitur itu dan hanya mendukung CUDA. Jadi Salva sudah setua nphysics, sedangkan Sparkl terlalu baru, fiturnya jauh lebih sedikit, dan tidak punya dukungan lintas platform
Bahkan ini terasa disengaja. Seolah-olah “menulis ulang kode ini agar menjadi kurang lintas platform”
Saya berharap suatu hari rangkaian penulisan ulang ini berhenti, dan mereka menetap pada sesuatu yang benar-benar mendukung semua fitur yang diperlukan
Namun jika setiap penulisan ulang kehilangan fitur, saya tidak yakin ekosistem Dimforge cocok untuk saya
Bagaimana saya bisa tahu Rapier tidak akan suatu hari ditinggalkan demi sesuatu yang lebih baru, lalu engine baru itu bahkan tidak mendukung setengah dari fitur Rapier
Saya paham bahwa sebagai proyek baru, ia belum bisa mendukung semua fitur nphysics yang sudah matang
Tetapi masalahnya adalah justru nphysics yang matang itu sudah sepenuhnya ditinggalkan dan tidak dipelihara
Kalau Dimforge tidak punya preseden seperti ini, kekhawatiran ini akan terasa tidak realistis, tetapi rekam jejaknya ada
Mungkin suatu hari Rapier akan mencapai tingkat fitur yang sudah dimiliki nphysics 5 tahun lalu, tetapi bagi developer yang ingin membangun sesuatu di atas fitur-fitur yang saat ini hilang, ini terasa seperti kemunduran 5 tahun yang arbitrer