use delta instead of epsilon

This commit is contained in:
Irlan 2018-05-16 18:32:16 -03:00
parent 631048668f
commit 2fa4532b01

View File

@ -506,7 +506,7 @@ void b3SpringSolver::Solve(b3DenseVec3& dv, b3DenseVec3& e, u32& iterations, con
P_filtered_b[i][2] = P[i][2] * filtered_b[i][2]; P_filtered_b[i][2] = P[i][2] * filtered_b[i][2];
} }
float32 eps0 = b3Dot(filtered_b, P_filtered_b); float32 delta0 = b3Dot(filtered_b, P_filtered_b);
// r = filter(b - Adv) // r = filter(b - Adv)
b3DenseVec3 r = b - A * dv; b3DenseVec3 r = b - A * dv;
@ -522,26 +522,26 @@ void b3SpringSolver::Solve(b3DenseVec3& dv, b3DenseVec3& e, u32& iterations, con
} }
b3Filter(c, c, S, m_massCount); b3Filter(c, c, S, m_massCount);
// epsNew = dot(r, c) // deltaNew = dot(r, c)
float32 epsNew = b3Dot(r, c); float32 deltaNew = b3Dot(r, c);
B3_ASSERT(b3IsValid(deltaNew));
// [0, 1] // [0, 1]
const float32 kTol = 1000.0f * B3_EPSILON; const float32 epsilon = 1000.0f * B3_EPSILON;
// Limit number of iterations to prevent cycling. // Limit number of iterations to prevent cycling.
const u32 kMaxIters = 1000; const u32 maxIters = 1000;
// Main iteration loop. // Main iteration loop.
u32 iter = 0; u32 iter = 0;
while (iter < kMaxIters && epsNew > kTol * kTol * eps0) while (iter < maxIters && deltaNew > epsilon * epsilon * delta0)
{ {
// q = filter(A * c) // q = filter(A * c)
b3DenseVec3 q = A * c; b3DenseVec3 q = A * c;
b3Filter(q, q, S, m_massCount); b3Filter(q, q, S, m_massCount);
// alpha = epsNew / dot(c, q) // alpha = deltaNew / dot(c, q)
B3_ASSERT(b3IsValid(b3Dot(c, q))); float32 alpha = deltaNew / b3Dot(c, q);
float32 alpha = epsNew / b3Dot(c, q);
// dv = dv + alpha * c // dv = dv + alpha * c
dv = dv + alpha * c; dv = dv + alpha * c;
@ -558,16 +558,15 @@ void b3SpringSolver::Solve(b3DenseVec3& dv, b3DenseVec3& e, u32& iterations, con
s[i][2] = inv_P[i][2] * r[i][2]; s[i][2] = inv_P[i][2] * r[i][2];
} }
// epsOld = epsNew // deltaOld = deltaNew
float32 epsOld = epsNew; float32 deltaOld = deltaNew;
B3_ASSERT(b3IsValid(epsOld));
// epsNew = dot(r, s) // deltaNew = dot(r, s)
epsNew = b3Dot(r, s); deltaNew = b3Dot(r, s);
B3_ASSERT(b3IsValid(epsNew)); B3_ASSERT(b3IsValid(deltaNew));
// beta = epsNew / epsOld // beta = deltaNew / deltaOld
float32 beta = epsNew / epsOld; float32 beta = deltaNew / deltaOld;
// c = filter(s + beta * c) // c = filter(s + beta * c)
c = s + beta * c; c = s + beta * c;