1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
use crate::dynamics::SpringModel;
use crate::math::{Point, Real, Rotation, Vector};
#[derive(Copy, Clone)]
#[cfg_attr(feature = "serde-serialize", derive(Serialize, Deserialize))]
pub struct BallJoint {
pub local_anchor1: Point<Real>,
pub local_anchor2: Point<Real>,
pub impulse: Vector<Real>,
#[cfg(feature = "dim2")]
pub motor_target_vel: Real,
#[cfg(feature = "dim3")]
pub motor_target_vel: Vector<Real>,
pub motor_target_pos: Rotation<Real>,
pub motor_stiffness: Real,
pub motor_damping: Real,
pub motor_max_impulse: Real,
#[cfg(feature = "dim2")]
pub motor_impulse: Real,
#[cfg(feature = "dim3")]
pub motor_impulse: Vector<Real>,
pub motor_model: SpringModel,
}
impl BallJoint {
pub fn new(local_anchor1: Point<Real>, local_anchor2: Point<Real>) -> Self {
Self::with_impulse(local_anchor1, local_anchor2, Vector::zeros())
}
pub(crate) fn with_impulse(
local_anchor1: Point<Real>,
local_anchor2: Point<Real>,
impulse: Vector<Real>,
) -> Self {
Self {
local_anchor1,
local_anchor2,
impulse,
motor_target_vel: na::zero(),
motor_target_pos: Rotation::identity(),
motor_stiffness: 0.0,
motor_damping: 0.0,
motor_impulse: na::zero(),
motor_max_impulse: Real::MAX,
motor_model: SpringModel::default(),
}
}
pub fn supports_simd_constraints(&self) -> bool {
self.motor_max_impulse == 0.0 || (self.motor_stiffness == 0.0 && self.motor_damping == 0.0)
}
pub fn configure_motor_model(&mut self, model: SpringModel) {
self.motor_model = model;
}
#[cfg(feature = "dim2")]
pub fn configure_motor_velocity(&mut self, target_vel: Real, factor: Real) {
self.configure_motor(self.motor_target_pos, target_vel, 0.0, factor)
}
#[cfg(feature = "dim3")]
pub fn configure_motor_velocity(&mut self, target_vel: Vector<Real>, factor: Real) {
self.configure_motor(self.motor_target_pos, target_vel, 0.0, factor)
}
pub fn configure_motor_position(
&mut self,
target_pos: Rotation<Real>,
stiffness: Real,
damping: Real,
) {
self.configure_motor(target_pos, na::zero(), stiffness, damping)
}
#[cfg(feature = "dim2")]
pub fn configure_motor(
&mut self,
target_pos: Rotation<Real>,
target_vel: Real,
stiffness: Real,
damping: Real,
) {
self.motor_target_vel = target_vel;
self.motor_target_pos = target_pos;
self.motor_stiffness = stiffness;
self.motor_damping = damping;
}
#[cfg(feature = "dim3")]
pub fn configure_motor(
&mut self,
target_pos: Rotation<Real>,
target_vel: Vector<Real>,
stiffness: Real,
damping: Real,
) {
self.motor_target_vel = target_vel;
self.motor_target_pos = target_pos;
self.motor_stiffness = stiffness;
self.motor_damping = damping;
}
}