PeriDyno 0.9.2
Loading...
Searching...
No Matches
Vechicle.cpp
Go to the documentation of this file.
1#include "Vechicle.h"
2
11
17
18#include "Module/CarDriver.h"
19
20namespace dyno
21{
23
24 template<typename 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 contactMapper = std::make_shared<ContactsToEdgeSet<DataType3f>>();
38 elementQuery->outContacts()->connect(contactMapper->inContacts());
39 contactMapper->varScale()->setValue(3.0);
40 this->graphicsPipeline()->pushModule(contactMapper);
41
42 auto wireRender = std::make_shared<GLWireframeVisualModule>();
43 wireRender->setColor(Color(1, 0, 0));
44 contactMapper->outEdgeSet()->connect(wireRender->inEdgeSet());
45 this->graphicsPipeline()->pushModule(wireRender);
46
47// auto cdBV = std::make_shared<CollistionDetectionBoundingBox<TDataType>>();
48// this->stateTopology()->connect(cdBV->inDiscreteElements());
49// this->animationPipeline()->pushModule(cdBV);
50
51 /*auto cdBV = std::make_shared<CollistionDetectionTriangleSet<TDataType>>();
52 this->stateTopology()->connect(cdBV->inDiscreteElements());
53 this->inTriangleSet()->connect(cdBV->inTriangleSet());*/
54 auto cdBV = std::make_shared<CollistionDetectionBoundingBox<TDataType>>();
55 this->stateTopology()->connect(cdBV->inDiscreteElements());
56 this->animationPipeline()->pushModule(cdBV);
57
58
59 auto merge = std::make_shared<ContactsUnion<TDataType>>();
60 elementQuery->outContacts()->connect(merge->inContactsA());
61 cdBV->outContacts()->connect(merge->inContactsB());
62 this->animationPipeline()->pushModule(merge);
63
64 auto iterSolver = std::make_shared<PJSConstraintSolver<TDataType>>();
65 this->stateTimeStep()->connect(iterSolver->inTimeStep());
66 this->varFrictionEnabled()->connect(iterSolver->varFrictionEnabled());
67 this->varGravityEnabled()->connect(iterSolver->varGravityEnabled());
68 this->varGravityValue()->connect(iterSolver->varGravityValue());
69 //this->varFrictionCoefficient()->connect(iterSolver->varFrictionCoefficient());
70 this->varFrictionCoefficient()->setValue(20.0f);
71 this->varSlop()->connect(iterSolver->varSlop());
72 this->stateMass()->connect(iterSolver->inMass());
73 this->stateCenter()->connect(iterSolver->inCenter());
74 this->stateVelocity()->connect(iterSolver->inVelocity());
75 this->stateAngularVelocity()->connect(iterSolver->inAngularVelocity());
76 this->stateRotationMatrix()->connect(iterSolver->inRotationMatrix());
77 this->stateInertia()->connect(iterSolver->inInertia());
78 this->stateQuaternion()->connect(iterSolver->inQuaternion());
79 this->stateInitialInertia()->connect(iterSolver->inInitialInertia());
80
81 this->stateTopology()->connect(iterSolver->inDiscreteElements());
82
83 merge->outContacts()->connect(iterSolver->inContacts());
84
85 this->animationPipeline()->pushModule(iterSolver);
86
87 auto driver = std::make_shared<SimpleVechicleDriver>();
88
89 this->stateFrameNumber()->connect(driver->inFrameNumber());
90 this->stateInstanceTransform()->connect(driver->inInstanceTransform());
91
92 this->animationPipeline()->pushModule(driver);
93
94 this->inTriangleSet()->tagOptional(true);
95 }
96
97 template<typename TDataType>
102
103 template<typename TDataType>
105 {
107
108 auto topo = this->stateTopology()->constDataPtr();
109
110 int sizeOfRigids = topo->totalSize();
111
112 auto texMesh = this->inTextureMesh()->constDataPtr();
113
114 uint N = texMesh->shapes().size();
115
118 instanceNum.reset();
119
120 //Calculate instance number
121 for (uint i = 0; i < mBindingPair.size(); i++)
122 {
123 instanceNum[mBindingPair[i].first]++;
124 }
125 tms.resize(instanceNum);
126
127 //Initialize CArrayList
128 for (uint i = 0; i < N; i++)
129 {
130 for (uint j = 0; j < instanceNum[i]; j++)
131 {
132 tms[i].insert(Transform3f());
133 }
134 }
135
136 this->stateInstanceTransform()->assign(tms);
137
138 auto deTopo = this->stateTopology()->constDataPtr();
139 auto offset = deTopo->calculateElementOffset();
140
141 std::vector<Pair<uint, uint>> bindingPair(sizeOfRigids);
142 std::vector<int> tags(sizeOfRigids, 0);
143
144 for (int i = 0; i < mBindingPair.size(); i++)
145 {
146 auto actor = mActors[i];
147 int idx = actor->idx + offset.checkElementOffset(actor->shapeType);
148
149 bindingPair[idx] = mBindingPair[i];
150 tags[idx] = 1;
151 }
152
153 mBindingPairDevice.assign(bindingPair);
154 mBindingTagDevice.assign(tags);
155
156 mInitialRot.assign(this->stateRotationMatrix()->constData());
157
158 this->updateInstanceTransform();
159
160 tms.clear();
161 bindingPair.clear();
162 tags.clear();
163 }
164
165 template<typename TDataType>
167 {
169
170 this->updateInstanceTransform();
171 }
172
173 template<typename TDataType>
175 {
177 this->stateInstanceTransform()->getData(),
178 this->stateOffset()->getData(),
179 this->stateCenter()->getData(),
180 this->stateRotationMatrix()->getData(),
181 mInitialRot,
182 mBindingPairDevice,
183 mBindingTagDevice);
184 }
185
186 template<typename TDataType>
188 {
189 mActors.push_back(actor);
190 mBindingPair.push_back(shapeId);
191 }
192
194
195 //Jeep
197
198 template<typename TDataType>
202 {
204 //car body
205 box1.center = Vec3f(0, 1.171, -0.011);
206 box1.halfLength = Vec3f(1.011, 0.793, 2.4);
207
208
209 box2.center = Vec3f(0, 1.044, -2.254);
210 box2.halfLength = Vec3f(0.447, 0.447, 0.15);
211
212 box3.center = Vec3f(0.812, 0.450, 1.722);
213 box3.halfLength = Vec3f(0.2f);
214 box4.center = Vec3f(-0.812, 0.450, 1.722);
215 box4.halfLength = Vec3f(0.2f);
217
218 capsule1.center = Vec3f(0.812, 0.450, 1.722);
219 capsule1.rot = Quat1f(M_PI / 2, Vec3f(0, 0, 1));
220 capsule1.halfLength = 0.1495;
221 capsule1.radius = 0.450;
222 capsule2.center = Vec3f(-0.812, 0.450, 1.722);
223 capsule2.rot = Quat1f(M_PI / 2, Vec3f(0, 0, 1));
224 capsule2.halfLength = 0.1495;
225 capsule2.radius = 0.450;
226 capsule3.center = Vec3f(-0.812, 0.450, -1.426);
227 capsule3.rot = Quat1f(M_PI / 2, Vec3f(0, 0, 1));
228 capsule3.halfLength = 0.1495;
229 capsule3.radius = 0.450;
230 capsule4.center = Vec3f(0.812, 0.450, -1.426);
231 capsule4.rot = Quat1f(M_PI / 2, Vec3f(0, 0, 1));
232 capsule4.halfLength = 0.1495;
233 capsule4.radius = 0.450;
234
236
237 Vec3f offset = Vec3f(0.0f, -0.721f, 0.148f);
238 rigidbody.offset = offset;
239 auto bodyActor = this->addBox(box1, rigidbody, 10);
240
241 rigidbody.offset = Vec3f(0.0f);
242
243 auto spareTireActor = this->addBox(box2, rigidbody, 100);
244 auto frontLeftSteerActor = this->addBox(box3, rigidbody, 1000);
245 auto frontRightSteerActor = this->addBox(box4, rigidbody, 1000);
246
247 Real wheel_velocity = 10;
248
249 auto frontLeftTireActor = this->addCapsule(capsule1, rigidbody, 100);
250 auto frontRightTireActor = this->addCapsule(capsule2, rigidbody, 100);
251 auto rearLeftTireActor = this->addCapsule(capsule3, rigidbody, 100);
252 auto rearRightTireActor = this->addCapsule(capsule4, rigidbody, 100);
253
254 //front rear
256 joint1.setAnchorPoint(frontLeftTireActor->center);
257 joint1.setMoter(wheel_velocity);
258 joint1.setAxis(Vec3f(1, 0, 0));
259
261 joint2.setAnchorPoint(frontRightTireActor->center);
262 joint2.setMoter(wheel_velocity);
263 joint2.setAxis(Vec3f(1, 0, 0));
264
265 //back rear
267 joint3.setAnchorPoint(rearLeftTireActor->center);
268 joint3.setMoter(wheel_velocity);
269 joint3.setAxis(Vec3f(1, 0, 0));
270
272 joint4.setAnchorPoint(rearRightTireActor->center);
273 joint4.setMoter(wheel_velocity);
274 joint4.setAxis(Vec3f(1, 0, 0));
275
276
277 //FixedJoint<Real> joint5(0, 1);
279 joint5.setAnchorPoint((bodyActor->center + spareTireActor->center) / 2);
281 joint6.setAnchorPoint((bodyActor->center + frontLeftSteerActor->center) / 2);
283 joint7.setAnchorPoint((bodyActor->center + frontRightSteerActor->center) / 2);
284
285 this->bind(bodyActor, Pair<uint, uint>(5, 0));
291
292
293 auto driver = std::make_shared<CarDriver<DataType3f>>();
294 this->animationPipeline()->pushModule(driver);
295 this->stateQuaternion()->connect(driver->inQuaternion());
296 this->stateTopology()->connect(driver->inTopology());
297 }
298
299 template<typename TDataType>
301 {
302
303 }
304
305 template<typename TDataType>
307 {
309
310 auto loc = this->varLocation()->getValue();
311
312 Coord tr = Coord(loc.x, loc.y, loc.z);
313
315 hostCenter.assign(this->stateCenter()->constData());
316
317 for (uint i = 0; i < hostCenter.size(); i++)
318 {
319 hostCenter[i] += tr;
320 }
321
322 this->stateCenter()->assign(hostCenter);
323
324 this->updateTopology();
325
326 this->updateInstanceTransform();
327
328 hostCenter.clear();
329 }
330
332}
#define DEFINE_CLASS(name)
Definition Object.h:140
#define IMPLEMENT_TCLASS(name, T1)
Definition Object.h:103
#define M_PI
Definition Typedef.inl:35
TDataType::Coord Coord
Definition Vechicle.h:59
TDataType::Real Real
Definition Vechicle.h:58
void resetStates() override
Definition Vechicle.cpp:306
~Jeep() override
Definition Vechicle.cpp:300
std::shared_ptr< GraphicsPipeline > graphicsPipeline()
Definition Node.cpp:312
virtual void updateStates()
Definition Node.cpp:136
std::shared_ptr< AnimationPipeline > animationPipeline()
Definition Node.cpp:303
Implementation of a rigid body system containing a variety of rigid bodies with different shapes.
std::shared_ptr< PdActor > addBox(const BoxInfo &box, const RigidBodyInfo &bodyDef, const Real density=Real(100))
HingeJoint & createHingeJoint(std::shared_ptr< PdActor > actor1, std::shared_ptr< PdActor > actor2)
void resetStates() override
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))
void updateStates() override
Definition Vechicle.cpp:166
void bind(std::shared_ptr< PdActor > actor, Pair< uint, uint > shapeId)
Definition Vechicle.cpp:187
void updateInstanceTransform()
Definition Vechicle.cpp:174
~Vechicle() override
Definition Vechicle.cpp:98
void resetStates() override
Definition Vechicle.cpp:104
#define N(x, y, z)
This is an implementation of AdditiveCCD based on peridyno.
Definition Array.h:24
Quat< float > Quat1f
Definition Quat.h:135
ArrayMap< T, DeviceType::GPU > DArrayMap
Definition ArrayMap.inl:80
Transform< float, 3 > Transform3f
Vector< float, 3 > Vec3f
Definition Vector3D.h:93
void ApplyTransform(DArrayList< Transform3f > &instanceTransform, const DArray< Vec3f > &diff, const DArray< Vec3f > &translate, const DArray< Mat3f > &rotation, const DArray< Mat3f > &rotationInit, const DArray< Pair< uint, uint > > &binding, const DArray< int > &bindingtag)
unsigned int uint
Definition VkProgram.h:14