feat: implement new "small-steps" solver + joint improvements
This commit is contained in:
@@ -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())
|
||||
|
||||
Reference in New Issue
Block a user