1#include "TJSoftConstraintSolver.h"
2#include "SharedFuncsForRigidBody.h"
3//#define USE_RELAXATION
6 IMPLEMENT_TCLASS(TJSoftConstraintSolver, TDataType)
8 template<typename TDataType>
9 TJSoftConstraintSolver<TDataType>::TJSoftConstraintSolver()
12 this->inContacts()->tagOptional(true);
15 template<typename TDataType>
16 TJSoftConstraintSolver<TDataType>::~TJSoftConstraintSolver()
20 template<typename TDataType>
21 void TJSoftConstraintSolver<TDataType>::initializeJacobian(Real dt)
23 int constraint_size = 0;
24 int contact_size = this->inContacts()->size();
26 auto topo = this->inDiscreteElements()->constDataPtr();
28 int ballAndSocketJoint_size = topo->ballAndSocketJoints().size();
29 int sliderJoint_size = topo->sliderJoints().size();
30 int hingeJoint_size = topo->hingeJoints().size();
31 int fixedJoint_size = topo->fixedJoints().size();
32 int pointJoint_size = topo->pointJoints().size();
34 if (this->varFrictionEnabled()->getData())
36 constraint_size += 3 * contact_size;
40 constraint_size = contact_size;
43 if (ballAndSocketJoint_size != 0)
45 constraint_size += 3 * ballAndSocketJoint_size;
48 if (sliderJoint_size != 0)
50 constraint_size += 8 * sliderJoint_size;
53 if (hingeJoint_size != 0)
55 constraint_size += 8 * hingeJoint_size;
58 if (fixedJoint_size != 0)
60 constraint_size += 6 * fixedJoint_size;
63 if (pointJoint_size != 0)
65 constraint_size += 3 * pointJoint_size;
68 if (constraint_size == 0)
72 if(mVelocityConstraints.size() != constraint_size)
73 mVelocityConstraints.resize(constraint_size);
75 if (contact_size != 0)
77 auto& contacts = this->inContacts()->getData();
78 setUpContactAndFrictionConstraints(
80 mContactsInLocalFrame,
81 this->inCenter()->getData(),
82 this->inRotationMatrix()->getData(),
83 this->varFrictionEnabled()->getData()
87 if (ballAndSocketJoint_size != 0)
89 auto& joints = topo->ballAndSocketJoints();
90 int begin_index = contact_size;
92 if (this->varFrictionEnabled()->getData())
94 begin_index += 2 * contact_size;
97 setUpBallAndSocketJointConstraints(
100 this->inCenter()->getData(),
101 this->inRotationMatrix()->getData(),
106 if (sliderJoint_size != 0)
108 auto& joints = topo->sliderJoints();
109 int begin_index = contact_size;
111 if (this->varFrictionEnabled()->getData())
113 begin_index += 2 * contact_size;
115 begin_index += 3 * ballAndSocketJoint_size;
116 setUpSliderJointConstraints(
117 mVelocityConstraints,
119 this->inCenter()->getData(),
120 this->inRotationMatrix()->getData(),
121 this->inQuaternion()->getData(),
126 if (hingeJoint_size != 0)
128 auto& joints = topo->hingeJoints();
129 int begin_index = contact_size + 3 * ballAndSocketJoint_size + 8 * sliderJoint_size;
130 if (this->varFrictionEnabled()->getData())
132 begin_index += 2 * contact_size;
134 setUpHingeJointConstraints(
135 mVelocityConstraints,
137 this->inCenter()->getData(),
138 this->inRotationMatrix()->getData(),
139 this->inQuaternion()->getData(),
144 if (fixedJoint_size != 0)
146 auto& joints = topo->fixedJoints();
147 int begin_index = contact_size + 3 * ballAndSocketJoint_size + 8 * sliderJoint_size + 8 * hingeJoint_size;
148 if (this->varFrictionEnabled()->getData())
150 begin_index += 2 * contact_size;
152 setUpFixedJointConstraints(
153 mVelocityConstraints,
155 this->inRotationMatrix()->getData(),
156 this->inQuaternion()->getData(),
161 if (pointJoint_size != 0)
163 auto& joints = topo->pointJoints();
164 int begin_index = contact_size + 3 * ballAndSocketJoint_size + 8 * sliderJoint_size + 8 * hingeJoint_size + 6 * fixedJoint_size;
165 if (this->varFrictionEnabled()->getData())
167 begin_index += 2 * contact_size;
169 setUpPointJointConstraints(
170 mVelocityConstraints,
172 this->inCenter()->getData(),
177 auto sizeOfRigids = this->inCenter()->size();
178 mContactNumber.resize(sizeOfRigids);
180 mJ.resize(4 * constraint_size);
181 mB.resize(4 * constraint_size);
182 mK_1.resize(constraint_size);
183 mK_2.resize(constraint_size);
184 mK_3.resize(constraint_size);
185 mEta.resize(constraint_size);
186 mLambda.resize(constraint_size);
196 mContactNumber.reset();
198 calculateJacobianMatrix(
201 this->inCenter()->getData(),
202 this->inInertia()->getData(),
203 this->inMass()->getData(),
204 this->inRotationMatrix()->getData(),
209 mVelocityConstraints,
212 this->inCenter()->getData(),
213 this->inInertia()->getData(),
214 this->inMass()->getData(),
220 calculateEtaVectorForPJSoft(
223 this->inVelocity()->getData(),
224 this->inAngularVelocity()->getData(),
225 this->inCenter()->getData(),
226 this->inQuaternion()->getData(),
227 mVelocityConstraints,
228 this->varSlop()->getValue(),
229 this->varDampingRatio()->getValue(),
230 this->varHertz()->getValue(),
231 this->varSubStepping()->getValue(),
235 if (contact_size != 0)
237 calculateContactPoints(
238 this->inContacts()->getData(),
243 template<typename TDataType>
244 void TJSoftConstraintSolver<TDataType>::constrain()
246 uint bodyNum = this->inCenter()->size();
248 auto topo = this->inDiscreteElements()->constDataPtr();
250 mImpulseC.resize(bodyNum * 2);
251 mImpulseExt.resize(bodyNum * 2);
255 Real dt = this->inTimeStep()->getData();
258 if (!this->inContacts()->isEmpty() || topo->totalJointSize() > 0)
260 if (mContactsInLocalFrame.size() != this->inContacts()->size()) {
261 mContactsInLocalFrame.resize(this->inContacts()->size());
264 setUpContactsInLocalFrame(
265 mContactsInLocalFrame,
266 this->inContacts()->getData(),
267 this->inCenter()->getData(),
268 this->inRotationMatrix()->getData()
271 Real dh = dt / this->varSubStepping()->getValue();
273 for (int i = 0; i < this->varSubStepping()->getValue(); i++)
275 if (this->varGravityEnabled()->getValue())
279 this->varGravityValue()->getValue(),
286 this->inAttribute()->getData(),
287 this->inVelocity()->getData(),
288 this->inAngularVelocity()->getData(),
290 this->varLinearDamping()->getValue(),
291 this->varAngularDamping()->getValue(),
296 initializeJacobian(dh);
297 for (int j = 0; j < this->varIterationNumberForVelocitySolver()->getValue(); j++)
299 JacobiIterationForSoft(
305 mVelocityConstraints,
310 this->inMass()->getData(),
311 this->inFrictionCoefficients()->getData(),
312 this->varGravityValue()->getValue(),
314 this->varDampingRatio()->getValue(),
315 this->varHertz()->getValue()
320 this->inAttribute()->getData(),
321 this->inVelocity()->getData(),
322 this->inAngularVelocity()->getData(),
324 this->varLinearDamping()->getValue(),
325 this->varAngularDamping()->getValue(),
330 this->inAttribute()->getData(),
331 this->inCenter()->getData(),
332 this->inQuaternion()->getData(),
333 this->inRotationMatrix()->getData(),
334 this->inInertia()->getData(),
335 this->inVelocity()->getData(),
336 this->inAngularVelocity()->getData(),
337 this->inInitialInertia()->getData(),
345 if (this->varGravityEnabled()->getValue())
349 this->varGravityValue()->getValue(),
356 this->inAttribute()->getData(),
357 this->inVelocity()->getData(),
358 this->inAngularVelocity()->getData(),
360 this->varLinearDamping()->getValue(),
361 this->varAngularDamping()->getValue(),
366 this->inAttribute()->getData(),
367 this->inCenter()->getData(),
368 this->inQuaternion()->getData(),
369 this->inRotationMatrix()->getData(),
370 this->inInertia()->getData(),
371 this->inVelocity()->getData(),
372 this->inAngularVelocity()->getData(),
373 this->inInitialInertia()->getData(),
380 DEFINE_CLASS(TJSoftConstraintSolver);