Fix issue 925 (wheel rotation calculation)#945
Conversation
added missing `filter` parameters
FeatureId support
chore: update typedoc to 0.22
Add basic debug-render support
Simplify handles
The iteration order is now determined by the index part of the inserted handles.
Ensure that the iteration orders remain the same after deserialization
chore: update timestep jsdoc
chore: install wasm-pack via npm
* better extensions naming for rapier compat files * Add changelog
* feat: un-deprecate collider properties accessors * feat: add functions for getting a collider’s translation/rotation wrt. its parent rigid-body * Update to rapier 0.27.0-beta.0 * Release v0.18.0-beta.0 * chore: run prettier
* feat: update to rust rapier 0.27 * feat: add access to the internal performance monitoring from JS * feat: add function to get/set the max number of CCD substeps & run prettier * chore: update Cargo.lock * Release v0.18.0 * chore: re-run prettier
* chore: update to rapier 0.28 * Release v0.18.1
* Expose revolute joints with separate local axes * Update src/dynamics/joint.rs Co-authored-by: Sébastien Crozet <sebastien@crozet.re> --------- Co-authored-by: Sébastien Crozet <sebastien@crozet.re>
wasm-bindgen 0.2.109 removed the `new Function("return this")` fallback
for getting the global object (PR wasm-bindgen/wasm-bindgen#4910),
which required `'unsafe-eval'` in Content-Security-Policy `script-src`.
With this update, applications using @dimforge/rapier3d-compat can use
the more restrictive `'wasm-unsafe-eval'` instead of `'unsafe-eval'`,
blocking JavaScript eval() while still allowing WebAssembly compilation.
Refs: dimforge/rapier.js#366
…e#370) This implements the frame transformation capabilities requested in issue dimforge#271, allowing users to set joint frames after joint creation via: - setFrameX1() / setFrameX2() for rotation frames - setLocalFrame1() / setLocalFrame2() for full frame (anchor + rotation) These methods enable more flexible joint configuration in physics simulations, particularly for use cases like VistaKine where joint frames need adjustment after initial setup. Fixes dimforge#271
|
video evidence of the bug: offroadJS_v2.rapier_current.mp4and the fix: offroadJS_v2.rapier_fixed.mp4 |
|
As I was testing, found out that the fix is not complete. I'm comparing the ccde to cannon-es (also bullet port), and will update this PR |
|
I added 2 extra conditions based on cannon-es implementation. this handles if a wheel should start spinning (if wheel in air and engine force is applied, or on ground but looses grip while engine force is applied [burnout]): this handles if a wheel should stop spinning: I also checked ammo.js and these issues are there as well |
#925
explanation (by Claude):
The Bug
In
src/control/ray_cast_vehicle_controller.rs, the wheel rotation update uses afwd(forward) vector computed independently from the chassis rotation:But the friction impulse system in
update_friction()computes forward as:These two methods produce vectors that can point in opposite directions depending on the axle axis convention. For example, with
index_forward_axis = 2(Z forward) and a wheel axle along-X:forward_ws[i]=Y × (-X)=-Zfwd=+Z← exact opposite!The result:
delta_rotationhas the wrong sign, making the wheel appear to spin backward (and it cancels out to ~0). When steering is applied, the axle rotates, which partially corrupts/corrects the mismatch — which is exactly why rotation only appears when steering.