1#include "TJConstraintSolver.h"
2#include "SharedFuncsForRigidBody.h"
6 IMPLEMENT_TCLASS(TJConstraintSolver, TDataType)
8 template<typename TDataType>
9 TJConstraintSolver<TDataType>::TJConstraintSolver()
12 this->inContacts()->tagOptional(true);
15 template<typename TDataType>
16 TJConstraintSolver<TDataType>::~TJConstraintSolver()
20 template<typename TDataType>
21 void TJConstraintSolver<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)
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 mErrors.resize(constraint_size);
224 calculateEtaVectorForPJSBaumgarte(
227 this->inVelocity()->getData(),
228 this->inAngularVelocity()->getData(),
229 this->inCenter()->getData(),
230 this->inQuaternion()->getData(),
231 mVelocityConstraints,
233 this->varSlop()->getValue(),
234 this->varBaumgarteBias()->getValue(),
235 this->varSubStepping()->getValue(),
239 if (contact_size != 0)
241 calculateContactPoints(
242 this->inContacts()->getData(),
247 template<typename TDataType>
248 void TJConstraintSolver<TDataType>::constrain()
250 uint bodyNum = this->inCenter()->size();
252 auto topo = this->inDiscreteElements()->constDataPtr();
254 mImpulseC.resize(bodyNum * 2);
255 mImpulseExt.resize(bodyNum * 2);
259 Real dt = this->inTimeStep()->getData();
262 if (!this->inContacts()->isEmpty() || topo->totalJointSize() > 0)
264 if (mContactsInLocalFrame.size() != this->inContacts()->size()) {
265 mContactsInLocalFrame.resize(this->inContacts()->size());
268 setUpContactsInLocalFrame(
269 mContactsInLocalFrame,
270 this->inContacts()->getData(),
271 this->inCenter()->getData(),
272 this->inRotationMatrix()->getData()
275 Real dh = dt / this->varSubStepping()->getValue();
277 for (int i = 0; i < this->varSubStepping()->getValue(); i++)
279 if (this->varGravityEnabled()->getValue())
283 this->varGravityValue()->getValue(),
290 this->inAttribute()->getData(),
291 this->inVelocity()->getData(),
292 this->inAngularVelocity()->getData(),
294 this->varLinearDamping()->getValue(),
295 this->varAngularDamping()->getValue(),
300 initializeJacobian(dh);
301 for (int j = 0; j < this->varIterationNumberForVelocitySolver()->getValue(); j++)
309 mVelocityConstraints,
314 this->inMass()->getData(),
315 this->inFrictionCoefficients()->getData(),
316 this->varFrictionCoefficient()->getData(),
317 this->varGravityValue()->getData(),
323 this->inAttribute()->getData(),
324 this->inVelocity()->getData(),
325 this->inAngularVelocity()->getData(),
327 this->varLinearDamping()->getValue(),
328 this->varAngularDamping()->getValue(),
333 this->inAttribute()->getData(),
334 this->inCenter()->getData(),
335 this->inQuaternion()->getData(),
336 this->inRotationMatrix()->getData(),
337 this->inInertia()->getData(),
338 this->inVelocity()->getData(),
339 this->inAngularVelocity()->getData(),
340 this->inInitialInertia()->getData(),
348 if (this->varGravityEnabled()->getValue())
352 this->varGravityValue()->getValue(),
359 this->inAttribute()->getData(),
360 this->inVelocity()->getData(),
361 this->inAngularVelocity()->getData(),
363 this->varLinearDamping()->getValue(),
364 this->varAngularDamping()->getValue(),
369 this->inAttribute()->getData(),
370 this->inCenter()->getData(),
371 this->inQuaternion()->getData(),
372 this->inRotationMatrix()->getData(),
373 this->inInertia()->getData(),
374 this->inVelocity()->getData(),
375 this->inAngularVelocity()->getData(),
376 this->inInitialInertia()->getData(),
383 DEFINE_CLASS(TJConstraintSolver);