Skip to content

Commit e298934

Browse files
authored
Merge pull request #65 from InteractiveComputerGraphics/fix_Stretch_Shear_constraint
fixed #64
2 parents 5980708 + bcb29c9 commit e298934

File tree

1 file changed

+11
-2
lines changed

1 file changed

+11
-2
lines changed

PositionBasedDynamics/PositionBasedElasticRods.cpp

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,17 @@ bool PositionBasedCosseratRods::solve_StretchShearConstraint(
3131
d3[2] = q0.w() * q0.w() - q0.x() * q0.x() - q0.y() * q0.y() + q0.z() * q0.z();
3232

3333
Vector3r gamma = (p1 - p0) / restLength - d3;
34-
gamma /= (invMass1 + invMass0) / restLength + invMassq0 * static_cast<Real>(4.0)*restLength + static_cast<Real>(1.0e-6);
35-
for (int i = 0; i<3; i++) gamma[i] *= stretchingAndShearingKs[i];
34+
gamma /= (invMass1 + invMass0) / restLength + invMassq0 * static_cast<Real>(4.0)*restLength + eps;
35+
36+
if (std::abs(stretchingAndShearingKs[0] - stretchingAndShearingKs[1]) < eps && std::abs(stretchingAndShearingKs[0] - stretchingAndShearingKs[2]) < eps) //all Ks are approx. equal
37+
for (int i = 0; i<3; i++) gamma[i] *= stretchingAndShearingKs[i];
38+
else //diffenent stretching and shearing Ks. Transform diag(Ks[0], Ks[1], Ks[2]) into world space using Ks_w = R(q0) * diag(Ks[0], Ks[1], Ks[2]) * R^T(q0) and multiply it with gamma
39+
{
40+
Matrix3r R = q0.toRotationMatrix();
41+
gamma = (R.transpose() * gamma).eval();
42+
for (int i = 0; i<3; i++) gamma[i] *= stretchingAndShearingKs[i];
43+
gamma = (R * gamma).eval();
44+
}
3645

3746
corr0 = invMass0 * gamma;
3847
corr1 = -invMass1 * gamma;

0 commit comments

Comments
 (0)