PeriDyno 1.0.0
Loading...
Searching...
No Matches
MultibodySystem.cpp
Go to the documentation of this file.
1#include "MultibodySystem.h"
2
5
11
13#include <Mapping/DiscreteElementsToTriangleSet.h>
15
17
18#include "Module/CarDriver.h"
19
20namespace dyno
21{
23
24 template<typename TDataType>
26 : RigidBodySystem<TDataType>()
27 {
28 this->animationPipeline()->clear();
29
30 auto elementQuery = std::make_shared<NeighborElementQuery<TDataType>>();
31 elementQuery->varSelfCollision()->setValue(false);
32 this->stateTopology()->connect(elementQuery->inDiscreteElements());
33 this->stateCollisionMask()->connect(elementQuery->inCollisionMask());
34 this->stateAttribute()->connect(elementQuery->inAttribute());
35 this->animationPipeline()->pushModule(elementQuery);
36
37 auto cdBV = std::make_shared<CollistionDetectionTriangleSet<TDataType>>();
38 this->stateTopology()->connect(cdBV->inDiscreteElements());
39 this->inTriangleSet()->connect(cdBV->inTriangleSet());
40 this->animationPipeline()->pushModule(cdBV);
41
42 auto merge = std::make_shared<ContactsUnion<TDataType>>();
43 elementQuery->outContacts()->connect(merge->inContactsA());
44 cdBV->outContacts()->connect(merge->inContactsB());
45 this->animationPipeline()->pushModule(merge);
46
47 auto iterSolver = std::make_shared<TJSoftConstraintSolver<TDataType>>();
48 this->stateTimeStep()->connect(iterSolver->inTimeStep());
49 this->varFrictionEnabled()->connect(iterSolver->varFrictionEnabled());
50 this->varGravityEnabled()->connect(iterSolver->varGravityEnabled());
51 this->varGravityValue()->connect(iterSolver->varGravityValue());
52 this->varFrictionCoefficient()->setValue(20.0f);
53 this->varSlop()->connect(iterSolver->varSlop());
54 this->stateMass()->connect(iterSolver->inMass());
55 this->stateCenter()->connect(iterSolver->inCenter());
56 this->stateVelocity()->connect(iterSolver->inVelocity());
57 this->stateAngularVelocity()->connect(iterSolver->inAngularVelocity());
58 this->stateRotationMatrix()->connect(iterSolver->inRotationMatrix());
59 this->stateInertia()->connect(iterSolver->inInertia());
60 this->stateQuaternion()->connect(iterSolver->inQuaternion());
61 this->stateInitialInertia()->connect(iterSolver->inInitialInertia());
62 this->stateAttribute()->connect(iterSolver->inAttribute());
63 this->stateFrictionCoefficients()->connect(iterSolver->inFrictionCoefficients());
64
65 this->stateTopology()->connect(iterSolver->inDiscreteElements());
66
67 merge->outContacts()->connect(iterSolver->inContacts());
68
69 this->animationPipeline()->pushModule(iterSolver);
70
71 this->inTriangleSet()->tagOptional(true);
72 }
73
74 template<typename TDataType>
79
80 template<typename TDataType>
82 {
83// RigidBodySystem<TDataType>::resetStates();
84
85 auto vehicles = this->getVehicles();
86
87 if (vehicles.size() > 0)
88 {
90
91 uint sizeOfRigidBodies = 0;
92 for (uint i = 0; i < vehicles.size(); i++)
93 {
94 auto vehicle = vehicles[i];
95
96 auto inTopo = vehicle->stateTopology()->getDataPtr();
97
98 topos.pushBack(inTopo);
99
100 sizeOfRigidBodies += vehicle->stateMass()->size();
101 }
102
103 auto curTopo = this->stateTopology()->getDataPtr();
104
105 curTopo->merge(topos);
106
107 topos.clear();
108
109 this->stateMass()->resize(sizeOfRigidBodies);
110 this->stateCenter()->resize(sizeOfRigidBodies);
111 this->stateVelocity()->resize(sizeOfRigidBodies);
112 this->stateAngularVelocity()->resize(sizeOfRigidBodies);
113 this->stateRotationMatrix()->resize(sizeOfRigidBodies);
114 this->stateInertia()->resize(sizeOfRigidBodies);
115 this->stateInitialInertia()->resize(sizeOfRigidBodies);
116 this->stateQuaternion()->resize(sizeOfRigidBodies);
117 this->stateCollisionMask()->resize(sizeOfRigidBodies);
118 this->stateAttribute()->resize(sizeOfRigidBodies);
119 this->stateFrictionCoefficients()->resize(sizeOfRigidBodies);
120
121 auto& stateMass = this->stateMass()->getData();
122 auto& stateCenter = this->stateCenter()->getData();
123 auto& stateVelocity = this->stateVelocity()->getData();
124 auto& stateAngularVelocity = this->stateAngularVelocity()->getData();
125 auto& stateRotationMatrix = this->stateRotationMatrix()->getData();
126 auto& stateInertia = this->stateInertia()->getData();
127 auto& stateInitialInertia = this->stateInitialInertia()->getData();
128 auto& stateQuaternion = this->stateQuaternion()->getData();
129 auto& stateCollisionMask = this->stateCollisionMask()->getData();
130 auto& stateAttribute = this->stateAttribute()->getData();
131 auto& stateFrictionCoefficients = this->stateFrictionCoefficients()->getData();
132
133 uint offset = 0;
134 for (uint i = 0; i < vehicles.size(); i++)
135 {
136 auto vehicle = vehicles[i];
137
138 uint num = vehicle->stateMass()->size();
139
140 stateMass.assign(vehicle->stateMass()->constData(), vehicle->stateMass()->size(), offset, 0);
141 stateCenter.assign(vehicle->stateCenter()->constData(), vehicle->stateCenter()->size(), offset, 0);
142 stateVelocity.assign(vehicle->stateVelocity()->constData(), vehicle->stateVelocity()->size(), offset, 0);
143 stateAngularVelocity.assign(vehicle->stateAngularVelocity()->constData(), vehicle->stateAngularVelocity()->size(), offset, 0);
144 stateRotationMatrix.assign(vehicle->stateRotationMatrix()->constData(), vehicle->stateRotationMatrix()->size(), offset, 0);
145 stateInertia.assign(vehicle->stateInertia()->constData(), vehicle->stateInertia()->size(), offset, 0);
146 stateInitialInertia.assign(vehicle->stateInitialInertia()->constData(), vehicle->stateInitialInertia()->size(), offset, 0);
147 stateQuaternion.assign(vehicle->stateQuaternion()->constData(), vehicle->stateQuaternion()->size(), offset, 0);
148 stateCollisionMask.assign(vehicle->stateCollisionMask()->constData(), vehicle->stateCollisionMask()->size(), offset, 0);
149 stateAttribute.assign(vehicle->stateAttribute()->constData(), vehicle->stateAttribute()->size(), offset, 0);
150 stateFrictionCoefficients.assign(vehicle->stateFrictionCoefficients()->constData(), vehicle->stateFrictionCoefficients()->size(), offset, 0);
151 offset += num;
152 }
153
154 //TODO: Replace with a GPU-based algorithm?
155 CArray<Attribute> hAttributes;
156 hAttributes.assign(stateAttribute);
157
158 uint offsetBodyId = 0;
159 uint offsetOfRigidBody = 0;
160 for (uint i = 0; i < vehicles.size(); i++)
161 {
162 auto vehicle = vehicles[i];
163
164 uint num = vehicle->stateMass()->size();
165
166 uint maxBodyId = 0;
167 for (uint j = 0; j < num; j++)
168 {
169 Attribute att = hAttributes[offsetOfRigidBody + j];
170 att.setObjectId(att.objectId() + offsetBodyId);
171
172 hAttributes[offsetOfRigidBody + j] = att;
173
174 maxBodyId = std::max(maxBodyId, att.objectId());
175 }
176
177 offsetOfRigidBody += num;
178 offsetBodyId += (maxBodyId + 1);
179 }
180
181 stateAttribute.assign(hAttributes);
182 hAttributes.clear();
183 }
184 }
185
186 template<typename TDataType>
188 {
189 auto& vehicles = this->getVehicles();
190
191 if (vehicles.size() > 0)
192 {
193 uint offset = 0;
194 for (uint i = 0; i < vehicles.size(); i++)
195 {
196 auto vehicle = vehicles[i];
197
198 uint sizeOfInput = vehicle->stateMass()->size();
199
200 auto& stateMass = vehicle->stateMass()->getData();
201 auto& stateCenter = vehicle->stateCenter()->getData();
202 auto& stateVelocity = vehicle->stateVelocity()->getData();
203 auto& stateAngularVelocity = vehicle->stateAngularVelocity()->getData();
204 auto& stateRotationMatrix = vehicle->stateRotationMatrix()->getData();
205 auto& stateInertia = vehicle->stateInertia()->getData();
206 auto& stateInitialInertia = vehicle->stateInitialInertia()->getData();
207 auto& stateQuaternion = vehicle->stateQuaternion()->getData();
208 auto& stateCollisionMask = vehicle->stateCollisionMask()->getData();
209 auto& stateAttribute = vehicle->stateAttribute()->getData();
210 auto& stateFrictionCoefficients = vehicle->stateFrictionCoefficients()->getData();
211
212
213 stateMass.assign(this->stateMass()->constData(), sizeOfInput, 0, offset);
214 stateCenter.assign(this->stateCenter()->constData(), sizeOfInput, 0, offset);
215 stateVelocity.assign(this->stateVelocity()->constData(), sizeOfInput, 0, offset);
216 stateAngularVelocity.assign(this->stateAngularVelocity()->constData(), sizeOfInput, 0, offset);
217 stateRotationMatrix.assign(this->stateRotationMatrix()->constData(), sizeOfInput, 0, offset);
218 stateInertia.assign(this->stateInertia()->constData(), sizeOfInput, 0, offset);
219 stateInitialInertia.assign(this->stateInitialInertia()->constData(), sizeOfInput, 0, offset);
220 stateQuaternion.assign(this->stateQuaternion()->constData(), sizeOfInput, 0, offset);
221 stateCollisionMask.assign(this->stateCollisionMask()->constData(), sizeOfInput, 0, offset);
222 stateAttribute.assign(this->stateAttribute()->constData(), sizeOfInput, 0, offset);
223 stateFrictionCoefficients.assign(this->stateFrictionCoefficients()->constData(), sizeOfInput, 0, offset);
224
225 auto topo = vehicle->stateTopology()->getDataPtr();
226
227 auto& topoPos = topo->position();
228 auto& topoRot = topo->rotation();
229
230 topoPos.assign(this->stateCenter()->constData(), sizeOfInput, 0, offset);
231 topoRot.assign(this->stateRotationMatrix()->constData(), sizeOfInput, 0, offset);
232 topo->update();
233
234 offset += sizeOfInput;
235 }
236 }
237
239 }
240
241 template<typename TDataType>
243 {
244 auto& vehicles = this->getVehicles();
245
246 return vehicles.size() > 0;
247 }
248
250}
#define DEFINE_CLASS(name)
Definition Object.h:140
#define IMPLEMENT_TCLASS(name, T1)
Definition Object.h:103
particle attribute 0x00000000: [31-30]material; [29]motion; [28]Dynamic; [27-8]undefined yet,...
Definition Attribute.h:26
DYN_FUNC unsigned objectId()
Definition Attribute.h:84
DYN_FUNC void setObjectId(unsigned id)
Definition Attribute.h:61
void postUpdateStates() override
bool validateInputs() override
void resetStates() override
std::shared_ptr< AnimationPipeline > animationPipeline()
Definition Node.cpp:311
void postUpdateStates() override
This is an implementation of AdditiveCCD based on peridyno.
Definition Array.h:25
Array< T, DeviceType::CPU > CArray
Definition Array.h:151
unsigned int uint
Definition VkProgram.h:14