1#include "PJSNJSConstraintSolver.h"
2#include "SharedFuncsForRigidBody.h"
6 IMPLEMENT_TCLASS(PJSNJSConstraintSolver, TDataType)
8 template<typename TDataType>
9 PJSNJSConstraintSolver<TDataType>::PJSNJSConstraintSolver()
12 this->inContacts()->tagOptional(true);
15 template<typename TDataType>
16 PJSNJSConstraintSolver<TDataType>::~PJSNJSConstraintSolver()
19 template<typename TDataType>
20 void PJSNJSConstraintSolver<TDataType>::initializeJacobian(Real dt)
22 int constraint_size = 0;
23 int contact_size = this->inContacts()->size();
25 auto topo = this->inDiscreteElements()->constDataPtr();
27 int ballAndSocketJoint_size = topo->ballAndSocketJoints().size();
28 int sliderJoint_size = topo->sliderJoints().size();
29 int hingeJoint_size = topo->hingeJoints().size();
30 int fixedJoint_size = topo->fixedJoints().size();
31 int pointJoint_size = topo->pointJoints().size();
33 if (this->varFrictionEnabled()->getData())
35 constraint_size += 3 * contact_size;
39 constraint_size = contact_size;
42 if (ballAndSocketJoint_size != 0)
44 constraint_size += 3 * ballAndSocketJoint_size;
47 if (sliderJoint_size != 0)
49 constraint_size += 8 * sliderJoint_size;
52 if (hingeJoint_size != 0)
54 constraint_size += 8 * hingeJoint_size;
57 if (fixedJoint_size != 0)
59 constraint_size += 6 * fixedJoint_size;
62 if (pointJoint_size != 0)
64 constraint_size += 3 * pointJoint_size;
67 if (constraint_size == 0)
72 mVelocityConstraints.resize(constraint_size);
74 if (contact_size != 0)
76 auto& contacts = this->inContacts()->getData();
77 setUpContactAndFrictionConstraints(
79 mContactsInLocalFrame,
80 this->inCenter()->getData(),
81 this->inRotationMatrix()->getData(),
82 this->varFrictionEnabled()->getData()
86 if (ballAndSocketJoint_size != 0)
88 auto& joints = topo->ballAndSocketJoints();
89 int begin_index = contact_size;
91 if (this->varFrictionEnabled()->getData())
93 begin_index += 2 * contact_size;
96 setUpBallAndSocketJointConstraints(
99 this->inCenter()->getData(),
100 this->inRotationMatrix()->getData(),
105 if (sliderJoint_size != 0)
107 auto& joints = topo->sliderJoints();
108 int begin_index = contact_size;
110 if (this->varFrictionEnabled()->getData())
112 begin_index += 2 * contact_size;
114 begin_index += 3 * ballAndSocketJoint_size;
115 setUpSliderJointConstraints(
116 mVelocityConstraints,
118 this->inCenter()->getData(),
119 this->inRotationMatrix()->getData(),
120 this->inQuaternion()->getData(),
125 if (hingeJoint_size != 0)
127 auto& joints = topo->hingeJoints();
128 int begin_index = contact_size + 3 * ballAndSocketJoint_size + 8 * sliderJoint_size;
129 if (this->varFrictionEnabled()->getData())
131 begin_index += 2 * contact_size;
133 setUpHingeJointConstraints(
134 mVelocityConstraints,
136 this->inCenter()->getData(),
137 this->inRotationMatrix()->getData(),
138 this->inQuaternion()->getData(),
143 if (fixedJoint_size != 0)
145 auto& joints = topo->fixedJoints();
146 int begin_index = contact_size + 3 * ballAndSocketJoint_size + 8 * sliderJoint_size + 8 * hingeJoint_size;
147 if (this->varFrictionEnabled()->getData())
149 begin_index += 2 * contact_size;
151 setUpFixedJointConstraints(
152 mVelocityConstraints,
154 this->inRotationMatrix()->getData(),
155 this->inQuaternion()->getData(),
160 if (pointJoint_size != 0)
162 auto& joints = topo->pointJoints();
163 int begin_index = contact_size + 3 * ballAndSocketJoint_size + 8 * sliderJoint_size + 8 * hingeJoint_size + 6 * fixedJoint_size;
164 if (this->varFrictionEnabled()->getData())
166 begin_index += 2 * contact_size;
168 setUpPointJointConstraints(
169 mVelocityConstraints,
171 this->inCenter()->getData(),
176 auto sizeOfRigids = this->inCenter()->size();
177 mContactNumber.resize(sizeOfRigids);
179 mJ.resize(4 * constraint_size);
180 mB.resize(4 * constraint_size);
181 mK_1.resize(constraint_size);
182 mK_2.resize(constraint_size);
183 mK_3.resize(constraint_size);
184 mEta.resize(constraint_size);
185 mLambda.resize(constraint_size);
195 mContactNumber.reset();
197 calculateJacobianMatrix(
200 this->inCenter()->getData(),
201 this->inInertia()->getData(),
202 this->inMass()->getData(),
203 this->inRotationMatrix()->getData(),
208 mVelocityConstraints,
211 this->inCenter()->getData(),
212 this->inInertia()->getData(),
213 this->inMass()->getData(),
219 calculateEtaVectorForPJS(
222 this->inVelocity()->getData(),
223 this->inAngularVelocity()->getData(),
227 if (contact_size != 0)
229 calculateContactPoints(
230 this->inContacts()->getData(),
235 template<typename TDataType>
236 void PJSNJSConstraintSolver<TDataType>::initializeJacobianForNJS()
238 int constraint_size = 0;
239 int contact_size = this->inContacts()->size();
241 auto topo = this->inDiscreteElements()->constDataPtr();
243 int ballAndSocketJoint_size = topo->ballAndSocketJoints().size();
244 int sliderJoint_size = topo->sliderJoints().size();
245 int hingeJoint_size = topo->hingeJoints().size();
246 int fixedJoint_size = topo->fixedJoints().size();
247 int pointJoint_size = topo->pointJoints().size();
249 constraint_size += contact_size;
251 if (ballAndSocketJoint_size != 0)
253 constraint_size += 3 * ballAndSocketJoint_size;
256 if (sliderJoint_size != 0)
258 constraint_size += 8 * sliderJoint_size;
261 if (hingeJoint_size != 0)
263 constraint_size += 8 * hingeJoint_size;
266 if (fixedJoint_size != 0)
268 constraint_size += 6 * fixedJoint_size;
271 if (pointJoint_size != 0)
273 constraint_size += 3 * pointJoint_size;
276 if (constraint_size == 0)
281 mPositionConstraints.resize(constraint_size);
283 if (contact_size != 0)
285 auto& contacts = this->inContacts()->getData();
286 setUpContactConstraints(
287 mPositionConstraints,
288 mContactsInLocalFrame,
289 this->inCenter()->getData(),
290 this->inRotationMatrix()->getData()
294 if (ballAndSocketJoint_size != 0)
296 auto& joints = topo->ballAndSocketJoints();
297 int begin_index = contact_size;
299 setUpBallAndSocketJointConstraints(
300 mPositionConstraints,
302 this->inCenter()->getData(),
303 this->inRotationMatrix()->getData(),
308 if (sliderJoint_size != 0)
310 auto& joints = topo->sliderJoints();
311 int begin_index = contact_size;
313 begin_index += 3 * ballAndSocketJoint_size;
314 setUpSliderJointConstraints(
315 mVelocityConstraints,
317 this->inCenter()->getData(),
318 this->inRotationMatrix()->getData(),
319 this->inQuaternion()->getData(),
324 if (hingeJoint_size != 0)
326 auto& joints = topo->hingeJoints();
327 int begin_index = contact_size + 3 * ballAndSocketJoint_size + 8 * sliderJoint_size;
329 setUpHingeJointConstraints(
330 mPositionConstraints,
332 this->inCenter()->getData(),
333 this->inRotationMatrix()->getData(),
334 this->inQuaternion()->getData(),
339 if (fixedJoint_size != 0)
341 auto& joints = topo->fixedJoints();
342 int begin_index = contact_size + 3 * ballAndSocketJoint_size + 8 * sliderJoint_size + 8 * hingeJoint_size;
344 setUpFixedJointConstraints(
345 mVelocityConstraints,
347 this->inRotationMatrix()->getData(),
348 this->inQuaternion()->getData(),
353 if (pointJoint_size != 0)
355 auto& joints = topo->pointJoints();
356 int begin_index = contact_size + 3 * ballAndSocketJoint_size + 8 * sliderJoint_size + 8 * hingeJoint_size + 6 * fixedJoint_size;
358 setUpPointJointConstraints(
359 mPositionConstraints,
361 this->inCenter()->getData(),
366 auto sizeOfRigids = this->inCenter()->size();
367 mJ_p.resize(4 * constraint_size);
368 mB_p.resize(4 * constraint_size);
369 mK_1.resize(constraint_size);
370 mK_2.resize(constraint_size);
371 mK_3.resize(constraint_size);
372 mEta_p.resize(constraint_size);
373 mLambda.resize(constraint_size);
383 calculateJacobianMatrixForNJS(
386 this->inCenter()->getData(),
387 this->inInertia()->getData(),
388 this->inMass()->getData(),
389 this->inRotationMatrix()->getData(),
394 mPositionConstraints,
397 this->inCenter()->getData(),
398 this->inInertia()->getData(),
399 this->inMass()->getData(),
405 calculateEtaVectorForNJS(
408 this->inCenter()->getData(),
409 this->inQuaternion()->getData(),
410 mPositionConstraints,
411 this->varSlop()->getValue(),
412 this->varBaumgarteBias()->getValue()
416 template<typename TDataType>
417 void PJSNJSConstraintSolver<TDataType>::constrain()
419 uint bodyNum = this->inCenter()->size();
421 auto topo = this->inDiscreteElements()->constDataPtr();
423 mImpulseC.resize(bodyNum * 2);
424 mImpulseExt.resize(bodyNum * 2);
428 Real dt = this->inTimeStep()->getData();
430 if (this->varGravityEnabled()->getValue())
434 this->varGravityValue()->getValue(),
440 this->inAttribute()->getData(),
441 this->inVelocity()->getData(),
442 this->inAngularVelocity()->getData(),
444 this->varLinearDamping()->getValue(),
445 this->varAngularDamping()->getValue(),
448 if (!this->inContacts()->isEmpty())
450 if (mContactsInLocalFrame.size() != this->inContacts()->size()) {
451 mContactsInLocalFrame.resize(this->inContacts()->size());
454 setUpContactsInLocalFrame(
455 mContactsInLocalFrame,
456 this->inContacts()->getData(),
457 this->inCenter()->getData(),
458 this->inRotationMatrix()->getData()
463 if (!this->inContacts()->isEmpty() || topo->totalJointSize() > 0)
465 initializeJacobian(dt);
466 int constraint_size = mVelocityConstraints.size();
467 for (int i = 0; i < this->varIterationNumberForVelocitySolver()->getValue(); i++)
475 mVelocityConstraints,
480 this->inMass()->getData(),
481 this->inFrictionCoefficients()->getData(),
482 this->varFrictionCoefficient()->getData(),
483 this->varGravityValue()->getData(),
490 this->inAttribute()->getData(),
491 this->inVelocity()->getData(),
492 this->inAngularVelocity()->getData(),
494 this->varLinearDamping()->getValue(),
495 this->varAngularDamping()->getValue(),
500 this->inAttribute()->getData(),
501 this->inCenter()->getData(),
502 this->inQuaternion()->getData(),
503 this->inRotationMatrix()->getData(),
504 this->inInertia()->getData(),
505 this->inVelocity()->getData(),
506 this->inAngularVelocity()->getData(),
507 this->inInitialInertia()->getData(),
512 if (!this->inContacts()->isEmpty() || topo->totalJointSize() > 0)
514 for (int i = 0; i < this->varIterationNumberForPositionSolver()->getValue(); i++)
518 initializeJacobianForNJS();
519 int constraint_size = mPositionConstraints.size();
520 for (int j = 0; j < 1; j++)
522 JacobiIterationForNJS(
528 mPositionConstraints,
536 updatePositionAndRotation(
537 this->inCenter()->getData(),
538 this->inQuaternion()->getData(),
539 this->inRotationMatrix()->getData(),
540 this->inInertia()->getData(),
541 this->inInitialInertia()->getData(),
547 DEFINE_CLASS(PJSNJSConstraintSolver);