@@ -44,8 +44,6 @@ void b2RigidPlasticJointDef::Initialize(b2Body* bA, b2Body* bB, const b2Vec2& an
44
44
b2RigidPlasticJoint::b2RigidPlasticJoint (const b2RigidPlasticJointDef* def)
45
45
: b2ElasticPlasticJoint(def)
46
46
{
47
- m_linearImpulse.SetZero ();
48
- m_angularImpulse = 0 .0f ;
49
47
}
50
48
51
49
void b2RigidPlasticJoint::Dump ()
@@ -92,18 +90,15 @@ void b2RigidPlasticJoint::InitVelocityConstraints(const b2SolverData& data)
92
90
m_rB = b2Mul (qB, m_localAnchorB - m_localCenterB);
93
91
float32 mA = m_invMassA, mB = m_invMassB;
94
92
float32 iA = m_invIA, iB = m_invIB;
95
- b2Mat22 K;
96
- K.ex .x = mA + mB + iA * m_rA.y * m_rA.y + iB * m_rB.y * m_rB.y ;
97
- K.ex .y = -iA * m_rA.x * m_rA.y - iB * m_rB.x * m_rB.y ;
98
- K.ey .x = K.ex .y ;
99
- K.ey .y = mA + mB + iA * m_rA.x * m_rA.x + iB * m_rB.x * m_rB.x ;
100
- m_linearMass = K.GetInverse ();
93
+ float32 iM = mA + mB ;
94
+ m_linearMass.SetZero ();
95
+ m_linearMass.ex .x = iM != 0 .f ? 1 .f / iM : 0 .f ;
96
+ m_linearMass.ey .y = m_linearMass.ex .x ;
101
97
m_angularMass = iA + iB;
102
98
if (m_angularMass > 0 .0f )
103
99
{
104
100
m_angularMass = 1 .0f / m_angularMass;
105
101
}
106
-
107
102
if (wasOverLoaded (RZ)) {
108
103
m_dw0 = wB - wA;
109
104
// K.GetInverse22(&m_mass);
@@ -113,6 +108,8 @@ void b2RigidPlasticJoint::InitVelocityConstraints(const b2SolverData& data)
113
108
m_dw0 = 0 ;
114
109
}
115
110
if (!initImpulseDone) {
111
+ m_linearImpulse.SetZero ();
112
+ m_angularImpulse = 0 .0f ;
116
113
m_impulse.SetZero ();
117
114
}
118
115
// ep
@@ -142,64 +139,67 @@ void b2RigidPlasticJoint::SolveVelocityConstraints(const b2SolverData& data)
142
139
#ifdef EP_LOG
143
140
if (epLogActive && epLogEnabled) {
144
141
if (mA != 0 ) {
145
- epLog (" J :VC:%d vA1=%g %g %g\n " , id,
142
+ epLog (" RPJ :VC:%d vA1=%g %g %g\n " , id,
146
143
vA.x , vA.y , wA);
147
144
}
148
145
if (mB != 0 ) {
149
- epLog (" J :VC:%d vB1=%g %g %g\n " , id,
146
+ epLog (" RPJ :VC:%d vB1=%g %g %g\n " , id,
150
147
vB.x , vB.y , wB);
151
148
}
152
- epLog (" J :VC:%d m_impulse=%g %g %g\n " , id,
149
+ epLog (" RPJ :VC:%d m_impulse=%g %g %g\n " , id,
153
150
m_impulse.x , m_impulse.y , m_impulse.z );
154
151
}
155
152
#endif
156
153
if (nullptr != debugListener) {
157
154
debugListener->BeginVelocityIteration (this , data);
158
155
}
159
- b2Vec2 Cdot1;
160
156
b2Vec3 impulse;
157
+ Cdot.SetZero ();
158
+ impulse.SetZero ();
161
159
float32 h = data.step .dt ;
162
- if (isOverLoaded ()) {
163
- Cdot.SetZero ();
164
- impulse.SetZero ();
165
- }
166
- else {
167
- // from b2Friction.cpp
168
- // Solve angular part
169
- {
170
- float32 aCdot = wB - wA-m_dw0;
171
- float32 aImpulse = -m_angularMass * aCdot;
172
- float32 oldImpulse = m_angularImpulse;
173
- float32 maxImpulse = h * m_maxTorque;
174
- m_angularImpulse = b2Clamp
175
- (m_angularImpulse + aImpulse, -maxImpulse, maxImpulse);
176
- aImpulse = m_angularImpulse - oldImpulse;
177
- impulse.z = aImpulse;
178
- Cdot.z = aCdot;
179
- }
160
+ if (!isOverLoaded ()) {
161
+ /* * Adapted from b2Friction.cpp
162
+ *
163
+ */
180
164
// Solve linear part
181
- {
182
- b2Vec2 lCdot = vB + b2Cross (wB, m_rB) - vA - b2Cross (wA, m_rA);
165
+ b2Vec2 lCdot = vB + b2Cross (wB, m_rB) - vA - b2Cross (wA, m_rA);
166
+ if ( lCdot. LengthSquared () > 0 . f ) {
183
167
b2Vec2 lImpulse = -b2Mul (m_linearMass, lCdot);
184
- b2Vec2 oldImpulse = m_linearImpulse;
168
+ b2Vec2 oldLImpulse = m_linearImpulse;
185
169
m_linearImpulse += lImpulse;
186
170
if (m_linearImpulse.LengthSquared () > m_maxForce.LengthSquared ())
187
171
{
188
172
m_linearImpulse.Normalize ();
189
173
m_linearImpulse *= m_maxForce.Length ();
190
174
}
191
- impulse.x = m_linearImpulse.x - oldImpulse .x ;
192
- impulse.y = m_linearImpulse.y - oldImpulse .y ;
175
+ impulse.x = m_linearImpulse.x - oldLImpulse .x ;
176
+ impulse.y = m_linearImpulse.y - oldLImpulse .y ;
193
177
Cdot.x = lCdot.x ;
194
178
Cdot.y = lCdot.y ;
179
+ wA += m_invIA * b2Cross (m_rA, lImpulse);
180
+ wB += m_invIB * b2Cross (m_rB, lImpulse);
181
+ }
182
+ // Solve angular part
183
+ float32 aCdot = wB - wA - m_dw0;
184
+ if (b2Abs (aCdot) > 0 .f ) {
185
+ float32 aImpulse = -m_angularMass * aCdot;
186
+ float32 oldAImpulse = m_angularImpulse;
187
+ float32 maxImpulse = h * m_maxTorque;
188
+ m_angularImpulse = b2Clamp
189
+ (m_angularImpulse + aImpulse, -maxImpulse, maxImpulse);
190
+ aImpulse = m_angularImpulse - oldAImpulse;
191
+ impulse.z = aImpulse;
195
192
}
193
+ Cdot.z = aCdot;
196
194
m_impulse += impulse;
197
195
#ifdef EP_LOG
198
196
if (epLogActive && epLogEnabled) {
199
- epLog (" J:VC:%d Cdot=%g %g %g\n " , id,
200
- Cdot.x , Cdot.y , Cdot.z );
201
- epLog (" J:VC:%d impulse=%g %g %g\n " , id,
202
- impulse.x , impulse.y , impulse.z );
197
+ if (b2Dot (Cdot, Cdot) > 0 .f ) {
198
+ epLog (" RPJ:VC:%d Cdot=%g %g %g\n " , id,
199
+ Cdot.x , Cdot.y , Cdot.z );
200
+ epLog (" RPJ:VC:%d impulse=%g %g %g\n " , id,
201
+ impulse.x , impulse.y , impulse.z );
202
+ }
203
203
}
204
204
#endif
205
205
}
0 commit comments