use delta instead of epsilon
This commit is contained in:
parent
631048668f
commit
2fa4532b01
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user