28 auto elementQuery = std::make_shared<NeighborElementQuery<TDataType>>();
29 elementQuery->varSelfCollision()->setValue(
false);
30 this->stateTopology()->connect(elementQuery->inDiscreteElements());
31 this->stateCollisionMask()->connect(elementQuery->inCollisionMask());
32 this->stateAttribute()->connect(elementQuery->inAttribute());
35 auto cdBV = std::make_shared<CollistionDetectionTriangleSet<TDataType>>();
36 this->stateTopology()->connect(cdBV->inDiscreteElements());
37 this->inTriangleSet()->connect(cdBV->inTriangleSet());
43 auto merge = std::make_shared<ContactsUnion<TDataType>>();
44 elementQuery->outContacts()->connect(merge->inContactsA());
45 cdBV->outContacts()->connect(merge->inContactsB());
48 auto iterSolver = std::make_shared<TJConstraintSolver<TDataType>>();
49 this->stateTimeStep()->connect(iterSolver->inTimeStep());
50 this->varFrictionEnabled()->connect(iterSolver->varFrictionEnabled());
51 this->varGravityEnabled()->connect(iterSolver->varGravityEnabled());
52 this->varGravityValue()->connect(iterSolver->varGravityValue());
54 this->varFrictionCoefficient()->setValue(20.0f);
55 this->varSlop()->connect(iterSolver->varSlop());
56 this->stateMass()->connect(iterSolver->inMass());
57 this->stateCenter()->connect(iterSolver->inCenter());
58 this->stateVelocity()->connect(iterSolver->inVelocity());
59 this->stateAngularVelocity()->connect(iterSolver->inAngularVelocity());
60 this->stateRotationMatrix()->connect(iterSolver->inRotationMatrix());
61 this->stateInertia()->connect(iterSolver->inInertia());
62 this->stateQuaternion()->connect(iterSolver->inQuaternion());
63 this->stateInitialInertia()->connect(iterSolver->inInitialInertia());
65 this->stateTopology()->connect(iterSolver->inDiscreteElements());
67 merge->outContacts()->connect(iterSolver->inContacts());
78 this->inTriangleSet()->tagOptional(
true);
93 this->inTriangleSet()->tagOptional(
true);
108 if (!this->inTextureMesh()->isEmpty())
110 this->stateTextureMesh()->setDataPtr(this->inTextureMesh()->constDataPtr());
113 if (!this->varVehicleConfiguration()->getValue().isValid() && !
bool(this->varVehiclesTransform()->getValue().size()) || this->stateTextureMesh()->isEmpty())
116 auto texMesh = this->stateTextureMesh()->constDataPtr();
117 const auto config = this->varVehicleConfiguration()->getValue();
119 const auto rigidInfo = config.mVehicleRigidBodyInfo;
120 const auto jointInfo = config.mVehicleJointInfo;
123 auto instances = this->varVehiclesTransform()->getValue();
124 uint vehicleNum = instances.size();
126 for (
size_t i = 0; i < rigidInfo.size(); i++)
128 if (rigidInfo[i].rigidGroup > maxGroup)
129 maxGroup = rigidInfo[i].rigidGroup;
132 for (
size_t j = 0; j < vehicleNum; j++)
136 std::vector<std::shared_ptr<PdActor>> Actors;
138 Actors.resize(rigidInfo.size());
141 for (
size_t i = 0; i < rigidInfo.size(); i++)
144 rigidbody.
bodyId = j * (maxGroup + 1) + rigidInfo[i].rigidGroup;
146 rigidbody.
offset = rigidInfo[i].Offset;
147 rigidbody.
friction = this->varFrictionCoefficient()->getValue();
149 auto type = rigidInfo[i].shapeType;
150 auto shapeId = rigidInfo[i].meshShapeId;
152 Real density = rigidInfo[i].mDensity;
154 if (shapeId > texMesh->shapes().size() - 1)
163 up = texMesh->shapes()[shapeId]->boundingBox.v1;
164 down = texMesh->shapes()[shapeId]->boundingBox.v0;
165 T = texMesh->shapes()[shapeId]->boundingTransform.translation();
184 currentBox.
halfLength = (up - down) / 2 * rigidInfo[i].mHalfLength;
189 Actors[i] = this->
addBox(currentBox, rigidbody, density);
193 printf(
"Need Tet Configuration\n");
199 currentCapsule.
halfLength = (up.y - down.y) / 2 * rigidInfo[i].capsuleLength;
200 currentCapsule.
radius = std::abs(up.y - down.y) / 2 * rigidInfo[i].radius;
204 Actors[i] = this->
addCapsule(currentCapsule, rigidbody, density);
210 currentSphere.
radius = std::abs(up.y - down.y) / 2 * rigidInfo[i].radius;
214 Actors[i] = this->
addSphere(currentSphere, rigidbody, density);
218 printf(
"Need Tri Configuration\n");
223 printf(
"Need OtherShape Configuration\n");
231 else if (shapeId == -1)
237 currentBox.
halfLength = rigidInfo[i].mHalfLength;
242 Actors[i] = this->
addBox(currentBox, rigidbody, density);
246 printf(
"Need Tet Configuration\n");
247 currentTet.
v[0] = rigidInfo[i].tet[0];
248 currentTet.
v[1] = rigidInfo[i].tet[1];
249 currentTet.
v[2] = rigidInfo[i].tet[2];
250 currentTet.
v[3] = rigidInfo[i].tet[3];
257 currentCapsule.
halfLength = rigidInfo[i].capsuleLength;
258 currentCapsule.
radius = rigidInfo[i].radius;
262 Actors[i] = this->
addCapsule(currentCapsule, rigidbody, density);
268 currentSphere.
radius = rigidInfo[i].radius;
272 Actors[i] = this->
addSphere(currentSphere, rigidbody, density);
276 printf(
"Need Tri Configuration\n");
280 printf(
"Need OtherShape Configuration\n");
288 if (shapeId != -1 && Actors[i] != NULL)
296 for (
size_t i = 0; i < jointInfo.size(); i++)
299 auto type = jointInfo[i].mJointType;
300 int first = jointInfo[i].mRigidBodyName_1.rigidBodyId;
301 int second = jointInfo[i].mRigidBodyName_2.rigidBodyId;
302 Real speed = jointInfo[i].mMoter;
303 auto axis =
Quat1f(instances[j].rotation()).
rotate(jointInfo[i].mAxis);
304 auto anchorOffset = jointInfo[i].mAnchorPoint;
306 if (first == -1 || second == -1)
308 if (Actors[first] == NULL || Actors[second] == NULL)
315 joint.setAnchorPoint(Actors[first]->center + anchorOffset);
317 if (jointInfo[i].mUseMoter)
318 joint.setMoter(speed);
319 if (jointInfo[i].mUseRange)
320 joint.setRange(jointInfo[i].mMin, jointInfo[i].mMax);
326 sliderJoint.setAnchorPoint((Actors[first]->center + Actors[first]->center) / 2 + anchorOffset);
327 sliderJoint.setAxis(axis);
328 if (jointInfo[i].mUseMoter)
329 sliderJoint.setMoter(speed);
330 if (jointInfo[i].mUseRange)
331 sliderJoint.setRange(jointInfo[i].mMin, jointInfo[i].mMax);
336 fixedJoint1.setAnchorPoint((Actors[first]->center + Actors[first]->center) / 2 + anchorOffset);
341 pointJoint.setAnchorPoint(Actors[first]->center + anchorOffset);
346 ballAndSocketJoint.setAnchorPoint((Actors[first]->center + Actors[first]->center) / 2 + anchorOffset);
void bind(std::shared_ptr< PdActor > actor, Pair< uint, uint > shapeId)
std::shared_ptr< PdActor > addBox(const BoxInfo &box, const RigidBodyInfo &bodyDef, const Real density=Real(100))
SliderJoint & createSliderJoint(std::shared_ptr< PdActor > actor1, std::shared_ptr< PdActor > actor2)
HingeJoint & createHingeJoint(std::shared_ptr< PdActor > actor1, std::shared_ptr< PdActor > actor2)
FixedJoint & createFixedJoint(std::shared_ptr< PdActor > actor1, std::shared_ptr< PdActor > actor2)
std::shared_ptr< PdActor > addCapsule(const CapsuleInfo &capsule, const RigidBodyInfo &bodyDef, const Real density=Real(100))
std::shared_ptr< PdActor > addSphere(const SphereInfo &sphere, const RigidBodyInfo &bodyDef, const Real density=Real(100))
BallAndSocketJoint & createBallAndSocketJoint(std::shared_ptr< PdActor > actor1, std::shared_ptr< PdActor > actor2)
Vector< Real, 3 > offset
An offset from the barycenter to the geometric center.
Vector< Real, 3 > position
The barycenter of the body.