| 23 | } |
| 24 | |
| 25 | void DistanceConstraint::solvePositionConstraint (ClothModel & model, float timeStep, size_t iter) { |
| 26 | |
| 27 | auto mi0 = model.m_inv_[bodyIDs_[0]]; |
| 28 | auto mi1 = model.m_inv_[bodyIDs_[1]]; |
| 29 | auto wSum = mi0 + mi1; |
| 30 | if (0.f == wSum) { |
| 31 | return; |
| 32 | } |
| 33 | |
| 34 | auto & x0 = model.x_[bodyIDs_[0]]; |
| 35 | auto & x1 = model.x_[bodyIDs_[1]]; |
| 36 | auto alpha = 1.f / (model.k_stretch_ * timeStep * timeStep); |
| 37 | auto gamma = model.k_damp_ / (model.k_stretch_ * timeStep); |
| 38 | |
| 39 | auto d = distance (x1, x0); |
| 40 | auto delta = d - rl_; |
| 41 | auto normd = 1.f / d; |
| 42 | |
| 43 | if (iter == 0) { |
| 44 | lambda_old_0_ = 0.f; |
| 45 | lambda_old_1_ = 0.f; |
| 46 | } |
| 47 | auto norml = 1.f / ((1.f+gamma)*wSum + alpha); |
| 48 | |
| 49 | vec_t jac; |
| 50 | jac.x = normd * (x1.x - x0.x); |
| 51 | jac.y = normd * (x1.y - x0.y); |
| 52 | jac.z = normd * (x1.z - x0.z); |
| 53 | |
| 54 | if (mi0 != 0.f) { |
| 55 | auto & xl = model.x_old_[bodyIDs_[0]]; |
| 56 | auto dot = jac.x*(x0.x-xl.x) + jac.y*(x0.y-xl.y) + jac.z*(x0.z-xl.z); |
| 57 | auto lambda = norml * (delta - alpha*lambda_old_0_ - gamma*dot); |
| 58 | x0.x += mi0 * jac.x * lambda; |
| 59 | x0.y += mi0 * jac.y * lambda; |
| 60 | x0.z += mi0 * jac.z * lambda; |
| 61 | lambda_old_0_ = lambda; |
| 62 | } |
| 63 | |
| 64 | if (mi1 != 0.f) { |
| 65 | auto & xl = model.x_old_[bodyIDs_[1]]; |
| 66 | auto dot = jac.x*(x1.x-xl.x) + jac.y*(x1.y-xl.y) + jac.z*(x1.z-xl.z); |
| 67 | auto lambda = norml * (-delta - alpha*lambda_old_1_ - gamma*dot); |
| 68 | x1.x += mi1 * jac.x * lambda; |
| 69 | x1.y += mi1 * jac.y * lambda; |
| 70 | x1.z += mi1 * jac.z * lambda; |
| 71 | lambda_old_1_ = lambda; |
| 72 | } |
| 73 | } |
| 74 | |
| 75 | void CollisionConstraint::initConstraint (size_t qID, const vec_t& x0, const vec_t& n, float d) { |
| 76 |
no test coverage detected