@@ -16,8 +16,8 @@ bool gCameraZooming = false;
16
16
bool gCameraPanning = false ;
17
17
bool gAnimating = false ;
18
18
bool gSingleStep = false ;
19
- bool gShowGrid = true ;
20
- bool gShowCenterAxes = true ;
19
+ bool gShowGrid = false ;
20
+ bool gShowCenterAxes = false ;
21
21
bool gSaveFrame = false ;
22
22
23
23
int gSteps = 0 ;
@@ -182,26 +182,67 @@ void Display() {
182
182
glFlush ();
183
183
}
184
184
185
+ static Vec<Real> gTranslationStart = Vec<Real>::LinSpaced(5000 , 0 , 2.5 );
186
+ static Vec<Real> gTranslationEnd = Vec<Real>::LinSpaced(5000 , -2.5 , 0 );
187
+ static int gTranslationIndex = 0 ;
188
+ static int gFramesSaved = 0 ;
189
+ static int gStopFrame = 10000 ;
185
190
static void GlutIdle () {
186
191
if (gStopped ) {
187
192
return ;
188
193
}
189
194
190
195
if (gAnimating || gSingleStep ) {
191
- Vec3<Real> gravity;
192
- gravity.setZero ();
196
+ Vec3<Real> gravity (0 , -0.981 , 0 );
193
197
++gSteps ;
194
198
195
- gMesh ->der ->thetas (0 ) += 0.01 ;
196
- gMesh ->der ->thetas (gMesh ->der ->thetas .rows () - 1 ) += 0.01 ;
199
+ gIntegrator ->AddGravity (gravity);
197
200
gIntegrator ->Step ();
198
201
199
202
if (gSingleStep ) {
200
203
gSingleStep = !gSingleStep ;
201
204
}
205
+
206
+ if (gSteps > 1000 && gTranslationIndex < gTranslationStart .rows ()) {
207
+ gMesh ->TranslatePinnedX (gTranslationStart (gTranslationIndex ), 0 );
208
+ gMesh ->TranslatePinnedX (
209
+ gTranslationEnd .reverse ().eval ()(gTranslationIndex ), 4 );
210
+ ++gTranslationIndex ;
211
+ }
212
+ }
213
+
214
+ if (gSteps == gStopFrame ) {
215
+ gAnimating = false ;
216
+ gStopped = true ;
202
217
}
203
218
204
219
if (gSteps % 10 == 0 && gAnimating ) {
220
+ if (gSaveFrame ) {
221
+
222
+
223
+ char filename[512 ];
224
+ sprintf (filename, " /Users/jarredparr/Downloads/output/frame_%05i.obj" ,
225
+ gFramesSaved );
226
+ ++gFramesSaved ;
227
+
228
+ std::ofstream file (filename);
229
+
230
+ const auto &vertices = gMesh ->der ->vertices ;
231
+ for (int jj = 0 ; jj < vertices.rows (); ++jj) {
232
+ // Write vertices.row(ii) to the file
233
+ file << " v " << vertices.row (jj) << std::endl;
234
+ }
235
+
236
+ file << " l " ;
237
+ for (int jj = 0 ; jj < vertices.rows (); ++jj) {
238
+ int index = (jj + 1 );
239
+ file << index << " " ;
240
+ }
241
+
242
+ file << std::endl;
243
+ file.close ();
244
+ }
245
+
205
246
glutPostRedisplay ();
206
247
}
207
248
}
@@ -222,12 +263,14 @@ auto main(int argc, char **argv) -> int {
222
263
// Set the mesh
223
264
Mat<Real> v (5 , 3 );
224
265
for (int ii = 0 ; ii < v.rows (); ++ii) {
225
- v.row (ii) = Vec3<Real>(ii, 2 , 0 );
266
+ v.row (ii) = Vec3<Real>(ii, 0 , 0 );
226
267
}
227
268
228
269
gMesh = std::make_shared<StrandMesh>(v);
229
- gIntegrator =
230
- std::make_shared<ForwardEulerStrand>(gMesh , nullptr , 1 / 100'000 , 5 , 0.3 );
270
+ gMesh ->pinned (0 ) = 1 ;
271
+ gMesh ->pinned (v.rows () - 1 ) = 1 ;
272
+ gIntegrator = std::make_shared<ForwardEulerStrand>(gMesh , nullptr ,
273
+ 1.0 / 1'000.0 , 5 , 0.3 );
231
274
232
275
glutInit (&argc, argv);
233
276
glutInitDisplayMode (GLUT_DEPTH | GLUT_RGBA);
0 commit comments