1#include "PJSoftConstraintSolver.h"
2#include "SharedFuncsForRigidBody.h"
6 IMPLEMENT_TCLASS(PJSoftConstraintSolver, TDataType)
8 template<typename TDataType>
9 PJSoftConstraintSolver<TDataType>::PJSoftConstraintSolver()
12 this->inContacts()->tagOptional(true);
15 template<typename TDataType>
16 PJSoftConstraintSolver<TDataType>::~PJSoftConstraintSolver()
20 template<typename TDataType>
21 void PJSoftConstraintSolver<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 if (mContactsInLocalFrame.size() != this->inContacts()->size()) {
78 mContactsInLocalFrame.resize(this->inContacts()->size());
81 setUpContactsInLocalFrame(
82 mContactsInLocalFrame,
83 this->inContacts()->getData(),
84 this->inCenter()->getData(),
85 this->inRotationMatrix()->getData()
88 auto& contacts = this->inContacts()->getData();
89 setUpContactAndFrictionConstraints(
91 mContactsInLocalFrame,
92 this->inCenter()->getData(),
93 this->inRotationMatrix()->getData(),
94 this->varFrictionEnabled()->getData()
98 if (ballAndSocketJoint_size != 0)
100 auto& joints = topo->ballAndSocketJoints();
101 int begin_index = contact_size;
103 if (this->varFrictionEnabled()->getData())
105 begin_index += 2 * contact_size;
108 setUpBallAndSocketJointConstraints(
109 mVelocityConstraints,
111 this->inCenter()->getData(),
112 this->inRotationMatrix()->getData(),
117 if (sliderJoint_size != 0)
119 auto& joints = topo->sliderJoints();
120 int begin_index = contact_size;
122 if (this->varFrictionEnabled()->getData())
124 begin_index += 2 * contact_size;
126 begin_index += 3 * ballAndSocketJoint_size;
127 setUpSliderJointConstraints(
128 mVelocityConstraints,
130 this->inCenter()->getData(),
131 this->inRotationMatrix()->getData(),
132 this->inQuaternion()->getData(),
137 if (hingeJoint_size != 0)
139 auto& joints = topo->hingeJoints();
140 int begin_index = contact_size + 3 * ballAndSocketJoint_size + 8 * sliderJoint_size;
141 if (this->varFrictionEnabled()->getData())
143 begin_index += 2 * contact_size;
145 setUpHingeJointConstraints(
146 mVelocityConstraints,
148 this->inCenter()->getData(),
149 this->inRotationMatrix()->getData(),
150 this->inQuaternion()->getData(),
155 if (fixedJoint_size != 0)
157 auto& joints = topo->fixedJoints();
158 int begin_index = contact_size + 3 * ballAndSocketJoint_size + 8 * sliderJoint_size + 8 * hingeJoint_size;
159 if (this->varFrictionEnabled()->getData())
161 begin_index += 2 * contact_size;
163 setUpFixedJointConstraints(
164 mVelocityConstraints,
166 this->inRotationMatrix()->getData(),
167 this->inQuaternion()->getData(),
172 if (pointJoint_size != 0)
174 auto& joints = topo->pointJoints();
175 int begin_index = contact_size + 3 * ballAndSocketJoint_size + 8 * sliderJoint_size + 8 * hingeJoint_size + 6 * fixedJoint_size;
176 if (this->varFrictionEnabled()->getData())
178 begin_index += 2 * contact_size;
180 setUpPointJointConstraints(
181 mVelocityConstraints,
183 this->inCenter()->getData(),
188 auto sizeOfRigids = this->inCenter()->size();
189 mContactNumber.resize(sizeOfRigids);
191 mJ.resize(4 * constraint_size);
192 mB.resize(4 * constraint_size);
193 mK_1.resize(constraint_size);
194 mK_2.resize(constraint_size);
195 mK_3.resize(constraint_size);
196 mEta.resize(constraint_size);
197 mLambda.resize(constraint_size);
207 mContactNumber.reset();
209 calculateJacobianMatrix(
212 this->inCenter()->getData(),
213 this->inInertia()->getData(),
214 this->inMass()->getData(),
215 this->inRotationMatrix()->getData(),
220 mVelocityConstraints,
223 this->inCenter()->getData(),
224 this->inInertia()->getData(),
225 this->inMass()->getData(),
231 calculateEtaVectorForPJSoft(
234 this->inVelocity()->getData(),
235 this->inAngularVelocity()->getData(),
236 this->inCenter()->getData(),
237 this->inQuaternion()->getData(),
238 mVelocityConstraints,
239 this->varSlop()->getValue(),
240 this->varDampingRatio()->getValue(),
241 this->varHertz()->getData(),
246 if (contact_size != 0)
248 calculateContactPoints(
249 this->inContacts()->getData(),
254 template<typename TDataType>
255 void PJSoftConstraintSolver<TDataType>::constrain()
257 uint bodyNum = this->inCenter()->size();
259 auto topo = this->inDiscreteElements()->constDataPtr();
261 mImpulseC.resize(bodyNum * 2);
262 mImpulseExt.resize(bodyNum * 2);
266 Real dt = this->inTimeStep()->getData();
268 if (this->varGravityEnabled()->getValue())
272 this->varGravityValue()->getValue(),
279 this->inAttribute()->getData(),
280 this->inVelocity()->getData(),
281 this->inAngularVelocity()->getData(),
283 this->varLinearDamping()->getValue(),
284 this->varAngularDamping()->getValue(),
288 if (!this->inContacts()->isEmpty() || topo->totalJointSize() > 0)
290 initializeJacobian(dt);
291 int constraint_size = mVelocityConstraints.size();
292 for (int i = 0; i < this->varIterationNumberForVelocitySolver()->getValue(); i++)
294 JacobiIterationForSoft(
300 mVelocityConstraints,
305 this->inMass()->getData(),
306 this->inFrictionCoefficients()->getData(),
307 this->varGravityValue()->getValue(),
309 this->varDampingRatio()->getValue(),
310 this->varHertz()->getValue()
316 this->inAttribute()->getData(),
317 this->inVelocity()->getData(),
318 this->inAngularVelocity()->getData(),
320 this->varLinearDamping()->getValue(),
321 this->varAngularDamping()->getValue(),
326 this->inAttribute()->getData(),
327 this->inCenter()->getData(),
328 this->inQuaternion()->getData(),
329 this->inRotationMatrix()->getData(),
330 this->inInertia()->getData(),
331 this->inVelocity()->getData(),
332 this->inAngularVelocity()->getData(),
333 this->inInitialInertia()->getData(),
338 DEFINE_CLASS(PJSoftConstraintSolver);