Skip to content

Commit ce743f8

Browse files
committed
Partial fix to #13
1 parent 50d7f59 commit ce743f8

File tree

1 file changed

+40
-40
lines changed

1 file changed

+40
-40
lines changed

Box2D/Dynamics/Joints/b2RigidPlasticJoint.cpp

Lines changed: 40 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,6 @@ void b2RigidPlasticJointDef::Initialize(b2Body* bA, b2Body* bB, const b2Vec2& an
4444
b2RigidPlasticJoint::b2RigidPlasticJoint(const b2RigidPlasticJointDef* def)
4545
: b2ElasticPlasticJoint(def)
4646
{
47-
m_linearImpulse.SetZero();
48-
m_angularImpulse = 0.0f;
4947
}
5048

5149
void b2RigidPlasticJoint::Dump()
@@ -92,18 +90,15 @@ void b2RigidPlasticJoint::InitVelocityConstraints(const b2SolverData& data)
9290
m_rB = b2Mul(qB, m_localAnchorB - m_localCenterB);
9391
float32 mA = m_invMassA, mB = m_invMassB;
9492
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;
10197
m_angularMass = iA + iB;
10298
if (m_angularMass > 0.0f)
10399
{
104100
m_angularMass = 1.0f / m_angularMass;
105101
}
106-
107102
if (wasOverLoaded(RZ)) {
108103
m_dw0 = wB - wA;
109104
//K.GetInverse22(&m_mass);
@@ -113,6 +108,8 @@ void b2RigidPlasticJoint::InitVelocityConstraints(const b2SolverData& data)
113108
m_dw0 = 0;
114109
}
115110
if (!initImpulseDone) {
111+
m_linearImpulse.SetZero();
112+
m_angularImpulse = 0.0f;
116113
m_impulse.SetZero();
117114
}
118115
// ep
@@ -142,64 +139,67 @@ void b2RigidPlasticJoint::SolveVelocityConstraints(const b2SolverData& data)
142139
#ifdef EP_LOG
143140
if (epLogActive && epLogEnabled) {
144141
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,
146143
vA.x, vA.y, wA);
147144
}
148145
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,
150147
vB.x, vB.y, wB);
151148
}
152-
epLog("J:VC:%d m_impulse=%g %g %g\n", id,
149+
epLog("RPJ:VC:%d m_impulse=%g %g %g\n", id,
153150
m_impulse.x, m_impulse.y, m_impulse.z);
154151
}
155152
#endif
156153
if (nullptr != debugListener) {
157154
debugListener->BeginVelocityIteration(this, data);
158155
}
159-
b2Vec2 Cdot1;
160156
b2Vec3 impulse;
157+
Cdot.SetZero();
158+
impulse.SetZero();
161159
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+
*/
180164
// 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) {
183167
b2Vec2 lImpulse = -b2Mul(m_linearMass, lCdot);
184-
b2Vec2 oldImpulse = m_linearImpulse;
168+
b2Vec2 oldLImpulse = m_linearImpulse;
185169
m_linearImpulse += lImpulse;
186170
if (m_linearImpulse.LengthSquared() > m_maxForce.LengthSquared())
187171
{
188172
m_linearImpulse.Normalize();
189173
m_linearImpulse *= m_maxForce.Length();
190174
}
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;
193177
Cdot.x = lCdot.x;
194178
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;
195192
}
193+
Cdot.z = aCdot;
196194
m_impulse += impulse;
197195
#ifdef EP_LOG
198196
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+
}
203203
}
204204
#endif
205205
}

0 commit comments

Comments
 (0)