MCPcopy Create free account
hub / github.com/RenderKit/embree / solvePositionConstraint

Method solvePositionConstraint

tutorials/collide/constraints.cpp:25–73  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

23}
24
25void 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
75void CollisionConstraint::initConstraint (size_t qID, const vec_t& x0, const vec_t& n, float d) {
76

Callers 1

constrainPositionsFunction · 0.80

Calls 2

distanceFunction · 0.50
dotFunction · 0.50

Tested by

no test coverage detected