Rust में लिखा गया 2D·3D physics engine Rapier
(rapier.rs)- Rapier Rust आधारित physics engines का एक set है, जो games, animation और robotics जैसे real-time physics की जरूरत वाले applications के लिए लक्षित है
- इसका लक्ष्य तेज execution और stability है, और जरूरत पड़ने पर cross-platform determinism को वैकल्पिक रूप से support करता है
- यह physics simulation के लिए जरूरी features देता है, जैसे rigid-body collisions और forces, joint constraints, contact events·sensors, snapshots आदि
- JavaScript bindings उपलब्ध कराता है, जिससे Rust के बाहर के environments में भी Rapier का उपयोग किया जा सकता है
- यह Apache 2.0 license के तहत मुफ्त open source है, Dimforge इसे develop करता है और GitHub Sponsor के जरिए sponsorship लेता है
Rapier किन उपयोगों को लक्षित करता है
- Rapier Rust में लिखा गया 2D और 3D physics engines का set है
- इसका मुख्य target वे applications हैं जिन्हें real-time physics processing की जरूरत होती है
- Video games
- Animation
- Robotics
- Design goal तेज और stable operation है, और यह वैकल्पिक रूप से cross-platform determinism को support करता है
उपलब्ध features और distribution तरीका
- Physics simulation के लिए मुख्य features शामिल हैं
- Rigid-body collisions और forces
- Joint constraints
- Contact events और sensors
- Snapshots
- वैकल्पिक cross-platform determinism
- JavaScript bindings
- Rapier मुफ्त open source है और Apache 2.0 license के तहत distributed है
- इसे Dimforge open source company develop करती है
- Sponsorship GitHub Sponsor के जरिए की जा सकती है
1 टिप्पणियां
Hacker News की राय
Rapier deterministic mode से एक ऑनलाइन multiplayer game बनाया
इसमें खिलाड़ी बारी-बारी से कीड़ों को विरोधी टीम की तरफ टकराते हैं और पहाड़ी पर कब्ज़ा करते हैं
अभी single-player mode नहीं है, और AI लिखना पहले बनाए गए chess-जैसे game की तुलना में ज़्यादा मुश्किल है
game https://evrimzone.itch.io/crittershowdown पर देखा जा सकता है, और physics/game logic का source https://github.com/evrimoztamur/crittershowdown/blob/e4d9a19... पर है
बाद में यह लिखने की योजना है कि इसे कैसे जोड़ा और क्या सीखा, लेकिन कुल मिलाकर यह बहुत मजबूत library है और Rust-जैसे API design की वजह से जो चाहिए था वह सब implement कर पाया
क्या इसे WebAssembly में compile किया गया था, या पूरी logic को local server पर host करने का तरीका अपनाया गया था?
कुछ महीने पहले Geometric Algebra में डूब गया था, और 2D, 3D, 4D से आगे, non-Euclidean वगैरह जैसी बहुत तरह की geometries को संभालने का यह हैरानीजनक रूप से concise और intuitive तरीका लगा
इसलिए सोच रहा था कि क्या Geometric Algebra physics engine के लिए अच्छा आधार बन सकता है
कुछ दिलचस्प Rust libraries दिखती हैं [1][2], लेकिन कोई बहुत ज़्यादा ध्यान खींचती नहीं दिखती
जानना चाहूंगा कि क्या किसी ने इस दिशा में देखा है
[1]: https://crates.io/keywords/geometric-algebra
[2]: https://github.com/Lichtso/geometric_algebra
अगर शुरू करना चाहें तो Freya Holmér का “Why can't you multiply vectors?” अच्छा प्रवेश बिंदु हो सकता है: https://www.youtube.com/watch?v=htYh-Tq7ZBI और https://bivector.net/index.html
Geometric Algebra “classical” Heaviside-style vector algebra के isomorphic है, और मुश्किल समस्याएं collision handling, energy conservation, stability जैसी चीज़ों में हैं
इसलिए ऐसी library बनाई जो arbitrary geometric algebra generate कर सकती है और कई मज़ेदार operations कर सकती है; इसे physics engine के आधार के तौर पर भी इस्तेमाल किया जा सकता है
रुचि हो तो यह रही: https://cljdoc.org/d/net.clojars.jordibc/geometric-algebra/
Rust के लिए Bevy Rapier plugin guide लिखी है: https://taintedcoders.com/bevy/rapier/
Bevy side पर एक दिलचस्प alternative Bevy XPBD भी है, और उसके बारे में भी लिखा है: https://taintedcoders.com/bevy/xpbd/
“Sleeping” एक technique है जो न चलने वाली objects की simulation cost घटाकर performance बढ़ाती है, और इसे
SleepingThresholdresource से adjust किया जा सकता हैdefault value के उदाहरण में
linear: 0.1,angular: 0.2हैंअब तक एक समस्या आई है कि कुछ collisions एक frame के लिए गायब हो जाते हैं, लेकिन ऐसी चीज़ों को आसानी से workaround किया जा सकता है, या बेहतर यह कि report करके fix कराया जा सकता है
अभी सिर्फ rotation ठीक से नहीं कर पाया, बाकी में complexity जैसे पिघलती हुई लगती है
linear algebra? ज़रूरत नहीं। बस
Vec3है। matrices? solver? जैसे 1998 में लौट आए हों, सभी constraints को बार-बार satisfy करा दोcollision margin? skill issue है। broad phase? GJK? ज़्यादा मत सोचो, modern CPU पर छोड़ दो
collect_pairsoptimization करने के बाद जब समझ आया कि असली bottleneckmallocथा और उसे ठीक कर दिया, तो करीब 100 objects आराम से संभल जाते हैं। Bullet की ज़रूरत नहींvelocity correction step भी शुरुआत में confusing था, लेकिन AABB से prototype करने के बाद लगता है कि इसे general shapes पर भी वापस ले जा सकता हूं
पहले इस step को skip किया था, तो सभी collisions हल्के elastic जैसे behave कर रहे थे
Dimforge सचमुच कमाल का काम कर रहा है
रोबोटिक्स में localization और mapping जैसे क्षेत्रों में अगर nalgebra + Rust, Eigen + C++ की जगह ले सके, तो यह वाकई रोमांचक होगा
Rust में बहुत-सी चीज़ें बस अपने-आप हो जाती हैं। बस अफसोस है कि पुरानी पीढ़ी के कुछ लोग हैं जो पीछे हटने को तैयार नहीं और Rust में निवेश से इनकार करते हैं
ईमानदारी से कहूँ तो C++ robotics code के इर्द-गिर्द एक बहुत बड़ा industry ecosystem है, इसलिए वजह समझ आती है
जानना चाहता हूँ कि अभी Rust में इस्तेमाल करने लायक कोई robotics framework है या नहीं
सुना है कि ROS2 धीरे-धीरे Rust को शामिल कर रहा है [1], लेकिन यह कितना आगे बढ़ा है, ठीक से नहीं पता
hardware integration/abstraction पहले से C++ में है, इसलिए ROS sensor fusion, mapping और localization में प्रवेश का अच्छा रास्ता हो सकता है
यह भी जानना चाहता हूँ कि क्या कंपनियाँ इसका इस्तेमाल कर रही हैं
[1] https://github.com/ros2-rust/ros2_rust
दशकों पहले जब मैंने rigid body physics engine बनाया था, मेरी याद में stacking बहुत कठिन समस्या थी
उस समय objects को floor में धँसने से बचाने का सबसे अच्छा उपाय था floor से शुरू करके objects को बाहर धकेलने वाला एक directed acyclic graph बनाना
converge करने के लिए कई iterations करने पड़ते थे और यह काफी hacky लगता था
जानना चाहता हूँ कि आजकल यह समस्या हल हो गई है या नहीं। इस project में stacking का कोई उल्लेख नहीं मिला
पोस्ट के नीचे link किया गया लेखक का video दिखाता है कि अलग-अलग solvers कई कठिन stacking problems को कैसे handle करते हैं: https://youtu.be/sKHf_o_UCzI
acyclic graph की ज़रूरत नहीं होती, और solver iteration count पर्याप्त बढ़ाने पर convergence हो जाता है
contact और friction constraints की संख्या देखते हुए कई बार iterate करना स्वाभाविक है, और maximum residual track करें तो लगभग 0 तक पहुँचने तक चला सकते हैं
थोड़ी टूटी हुई बात यह है कि collision और solver सीमित update rate पर ही चलते हैं
अगर शुरुआत से ही penetration state में हों तो इसे हल करना पड़ता है, लेकिन वास्तविक objects ऐसे penetrate नहीं करते, इसलिए यह कुछ हद तक “fake” handling है और अतिरिक्त motion पैदा हो सकता है, जिससे stack stability घट सकती है
फिर भी इसे bypass करने के कई तरीके हैं, और लोकप्रिय physics engines के पास अपने-अपने ढंग से कोई न कोई समाधान है
Rust लगातार stereotype को साबित करता लगता है
वह joke याद आता है कि Rust में बने game engines 50 हैं, लेकिन Rust में बने games सिर्फ 5 हैं
Rapier मेरी exact जरूरत पूरी नहीं करता, और कोई अच्छा alternative नहीं है
इसलिए छोटे 2D games में, जहाँ ज्यादा engine code लिखने की ज़रूरत नहीं होती, यह संभव लगता है
यह game ज्यादातर काम SDL से कर रहा था
Rapier से एक छोटा web demo भी बनाया था: https://github.com/iErcann/NotRoblox
Rust इस्तेमाल नहीं किया
जो बात अच्छी लगी वह यह कि documentation AmmoJS से बेहतर है। AmmoJS के लिए pybullet पढ़ना पड़ा था
यह अपेक्षाकृत नया है, और server (Node) तथा client (browser) दोनों तरफ चल सकता है
यहाँ इसे server side पर चलाया गया है, लेकिन दोनों तरफ चलाकर client prediction और correction implement करना भी संभव है
bundle भी छोटा है। AmmoJS शायद करीब 2MB था
शुक्र है कि यह पुराने version से बंधा है, इसलिए बहुत बुरा नहीं है
JavaScript interoperability भी वाकई अच्छी है: https://www.rapier.rs/docs/user_guides/javascript/getting_st...
https://threlte.xyz/docs/reference/rapier/getting-started
Dimforge के पास पहले nphysics नाम का physics engine था, जो soft bodies और multibodies को support करता था
अब उसे Rapier के लिए deprecate कर दिया गया है, लेकिन Rapier उन चीज़ों या nphysics के दूसरे features के आधे को भी support नहीं करता
नतीजतन nphysics इतना पुराना हो गया है कि modern ecosystem में इस्तेमाल करना मुश्किल है, और Rapier इतना नया है कि features बहुत कम हैं
पहले भी ऐसा ही हुआ था। Salva नाम की fluid simulation library nphysics के साथ bidirectional coupling support करती थी और सभी GPU/CPU पर चलती थी, लेकिन अब उसे Sparkl के लिए deprecate कर दिया गया है
मगर Sparkl में वे features नहीं हैं और वह केवल CUDA support करता है। इसलिए Salva, nphysics जितना outdated हो गया है, और Sparkl बहुत नया है, features काफी कम हैं और cross-platform support भी नहीं है
यहाँ तक कि यह जानबूझकर किया गया लगता है। मानो “इस code को कम cross-platform बनाने के लिए फिर से लिखा” गया हो
उम्मीद है कि कभी न कभी लगातार rewrites रुकेंगे और वे किसी ऐसी चीज़ पर टिकेंगे जो सचमुच ज़रूरी सभी features support करती हो
लेकिन अगर हर rewrite में features खोते हैं, तो मुझे नहीं पता कि Dimforge ecosystem मेरे लिए सही है या नहीं
कैसे पता चले कि Rapier भी किसी दिन किसी और नई चीज़ के लिए deprecate नहीं होगा, और वह नया engine Rapier के आधे features भी support नहीं करेगा
यह समझ आता है कि नया project होने के कारण यह mature nphysics के सभी features support नहीं कर सकता
लेकिन समस्या यह है कि वही mature nphysics पूरी तरह deprecate हो चुका है और maintain नहीं किया जा रहा
अगर Dimforge का पहले से ऐसा precedent न होता तो यह चिंता अवास्तविक होती, लेकिन record मौजूद है
शायद किसी दिन Rapier उन features के स्तर तक पहुँच जाए जो nphysics के पास 5 साल पहले ही थे, लेकिन जो developer अभी missing features के ऊपर कुछ बनाना चाहता है, उसके लिए यह मनमाना 5 साल पीछे जाना लगता है