feat: implement new "small-steps" solver + joint improvements

This commit is contained in:
Sébastien Crozet
2024-01-21 21:02:23 +01:00
parent 9ac3503b87
commit 9b87f06a85
76 changed files with 6672 additions and 4305 deletions

View File

@@ -7,7 +7,7 @@ use crate::geometry::{
ColliderHandle, ColliderMassProps, ColliderParent, ColliderPosition, ColliderSet, ColliderShape,
};
use crate::math::{AngVector, Isometry, Point, Real, Rotation, Vector};
use crate::utils::WCross;
use crate::utils::SimdCross;
use num::Zero;
#[cfg_attr(feature = "serde-serialize", derive(Serialize, Deserialize))]
@@ -36,6 +36,7 @@ pub struct RigidBody {
/// The dominance group this rigid-body is part of.
pub(crate) dominance: RigidBodyDominance,
pub(crate) enabled: bool,
pub(crate) additional_solver_iterations: usize,
/// User-defined data associated to this rigid-body.
pub user_data: u128,
}
@@ -64,6 +65,7 @@ impl RigidBody {
dominance: RigidBodyDominance::default(),
enabled: true,
user_data: 0,
additional_solver_iterations: 0,
}
}
@@ -72,6 +74,27 @@ impl RigidBody {
self.ids = Default::default();
}
/// Set the additional number of solver iterations run for this rigid-body and
/// everything interacting with it.
///
/// See [`Self::set_additional_solver_iterations`] for additional information.
pub fn additional_solver_iterations(&self) -> usize {
self.additional_solver_iterations
}
/// Set the additional number of solver iterations run for this rigid-body and
/// everything interacting with it.
///
/// Increasing this number will help improve simulation accuracy on this rigid-body
/// and every rigid-body interacting directly or indirectly with it (through joints
/// or contacts). This implies a performance hit.
///
/// The default value is 0, meaning [`IntegrationParameters::num_solver_iterations`] will
/// be used as number of solver iterations for this body.
pub fn set_additional_solver_iterations(&mut self, additional_iterations: usize) {
self.additional_solver_iterations = additional_iterations;
}
/// The activation status of this rigid-body.
pub fn activation(&self) -> &RigidBodyActivation {
&self.activation
@@ -1030,6 +1053,11 @@ pub struct RigidBodyBuilder {
pub enabled: bool,
/// An arbitrary user-defined 128-bit integer associated to the rigid-bodies built by this builder.
pub user_data: u128,
/// The additional number of solver iterations run for this rigid-body and
/// everything interacting with it.
///
/// See [`RigidBody::set_additional_solver_iterations`] for additional information.
pub additional_solver_iterations: usize,
}
impl RigidBodyBuilder {
@@ -1051,6 +1079,7 @@ impl RigidBodyBuilder {
dominance_group: 0,
enabled: true,
user_data: 0,
additional_solver_iterations: 0,
}
}
@@ -1090,6 +1119,15 @@ impl RigidBodyBuilder {
Self::new(RigidBodyType::Dynamic)
}
/// Sets the additional number of solver iterations run for this rigid-body and
/// everything interacting with it.
///
/// See [`RigidBody::set_additional_solver_iterations`] for additional information.
pub fn additional_solver_iterations(mut self, additional_iterations: usize) -> Self {
self.additional_solver_iterations = additional_iterations;
self
}
/// Sets the scale applied to the gravity force affecting the rigid-body to be created.
pub fn gravity_scale(mut self, scale_factor: Real) -> Self {
self.gravity_scale = scale_factor;
@@ -1311,6 +1349,7 @@ impl RigidBodyBuilder {
rb.vels.angvel = self.angvel;
rb.body_type = self.body_type;
rb.user_data = self.user_data;
rb.additional_solver_iterations = self.additional_solver_iterations;
if self.additional_mass_properties
!= RigidBodyAdditionalMassProps::MassProps(MassProperties::zero())