@@ -53,7 +53,7 @@ int main( int argc, char **argv )
5353 REPORT_MEMORY_LEAKS
5454
5555 // OpenGL
56- MiniGL::init (argc, argv, 1024 , 768 , 0 , 0 , " Rigid body demo" );
56+ MiniGL::init (argc, argv, 1280 , 960 , 0 , 0 , " Rigid body demo" );
5757 MiniGL::initLights ();
5858 MiniGL::setClientIdleFunc (50 , timeStep);
5959 MiniGL::setKeyFunc (0 , ' r' , reset);
@@ -62,7 +62,7 @@ int main( int argc, char **argv )
6262 buildModel ();
6363
6464 MiniGL::setClientSceneFunc (render);
65- MiniGL::setViewport (50 .0f , 0 .1f , 500 .0f , Vector3f (8 .0f , -2 .5f , 17 .0f ), Vector3f (8 .0f , 0 .0f , 0 .0f ));
65+ MiniGL::setViewport (60 .0f , 0 .1f , 500 .0f , Vector3f (6 .0f , -5 .5f , 15 .0f ), Vector3f (6 .0f , - 3 .0f , 0 .0f ));
6666
6767 TwAddVarRW (MiniGL::getTweakBar (), " Pause" , TW_TYPE_BOOLCPP, &doPause, " label='Pause' group=Simulation key=SPACE " );
6868 TwAddVarCB (MiniGL::getTweakBar (), " TimeStepSize" , TW_TYPE_FLOAT, setTimeStep, getTimeStep, &model, " label='Time step size' min=0.0 max = 0.1 step=0.001 precision=4 group=Simulation " );
@@ -183,6 +183,11 @@ void renderUniversalJoint(UniversalJoint &uj)
183183 MiniGL::drawCylinder (uj.m_jointInfo .col (5 ) - 0.5 *uj.m_jointInfo .col (7 ), uj.m_jointInfo .col (5 ) + 0.5 *uj.m_jointInfo .col (7 ), jointColor, 0 .05f );
184184}
185185
186+ void renderSliderJoint (SliderJoint &joint)
187+ {
188+ MiniGL::drawCylinder (joint.m_jointInfo .col (7 ) - joint.m_jointInfo .col (11 ), joint.m_jointInfo .col (7 ) + joint.m_jointInfo .col (11 ), jointColor, 0 .05f );
189+ }
190+
186191void renderTargetAngleMotorHingeJoint (TargetAngleMotorHingeJoint &hj)
187192{
188193 MiniGL::drawSphere (hj.m_jointInfo .col (6 ) - 0.5 *hj.m_jointInfo .col (8 ), 0 .1f , jointColor);
@@ -246,6 +251,10 @@ void render ()
246251 {
247252 renderUniversalJoint (*(UniversalJoint*)constraints[i]);
248253 }
254+ else if (constraints[i]->getTypeId () == SliderJoint::TYPE_ID)
255+ {
256+ renderSliderJoint (*(SliderJoint*)constraints[i]);
257+ }
249258 else if (constraints[i]->getTypeId () == TargetAngleMotorHingeJoint::TYPE_ID)
250259 {
251260 renderTargetAngleMotorHingeJoint (*(TargetAngleMotorHingeJoint*)constraints[i]);
@@ -261,7 +270,9 @@ void render ()
261270 MiniGL::drawStrokeText (3 .0f , 1 .5f , 1 .0f , 0 .002f , " ball-on-line joint" , 19 , textColor);
262271 MiniGL::drawStrokeText (7 .3f , 1 .5f , 1 .0f , 0 .002f , " hinge joint" , 12 , textColor);
263272 MiniGL::drawStrokeText (11 .2f , 1 .5f , 1 .0f , 0 .002f , " universal joint" , 15 , textColor);
264- MiniGL::drawStrokeText (15 .0f , 1 .5f , 1 .0f , 0 .002f , " motor hinge joint" , 17 , textColor);
273+
274+ MiniGL::drawStrokeText (-1 .0f , -4 .0f , 1 .0f , 0 .002f , " motor hinge joint" , 17 , textColor);
275+ MiniGL::drawStrokeText (3 .4f , -4 .0f , 1 .0f , 0 .002f , " slider joint" , 12 , textColor);
265276
266277 MiniGL::drawTime ( TimeManager::getCurrent ()->getTime ());
267278}
@@ -283,50 +294,61 @@ void createBodyModel()
283294 SimulationModel::RigidBodyVector &rb = model.getRigidBodies ();
284295
285296 // static body
286- rb.resize (15 );
297+ rb.resize (18 );
287298 float startX = 0 .0f ;
288- for (unsigned int i = 0 ; i < 5 ; i++)
299+ float startY = 1 .0f ;
300+ for (unsigned int i = 0 ; i < 6 ; i++)
289301 {
290302 rb[3 *i] = new RigidBody ();
291303 rb[3 *i]->initBody (0 .0f ,
292- Eigen::Vector3f (startX, 1 . 0f , 1 .0f ),
304+ Eigen::Vector3f (startX, startY , 1 .0f ),
293305 computeInertiaTensorBox (1 .0f , 0 .5f , 0 .5f , 0 .5f ),
294306 Eigen::Quaternionf (1 .0f , 0 .0f , 0 .0f , 0 .0f ));
295307
296308 // dynamic body
297309 rb[3 *i+1 ] = new RigidBody ();
298310 rb[3 *i+1 ]->initBody (1 .0f ,
299- Eigen::Vector3f (startX, 0 . 75f , 2 .0f ),
311+ Eigen::Vector3f (startX, startY- 0 . 25f , 2 .0f ),
300312 computeInertiaTensorBox (1 .0f , width, height, depth),
301313 Eigen::Quaternionf (1 .0f , 0 .0f , 0 .0f , 0 .0f ));
302314
303315 // dynamic body
304316 rb[3 *i+2 ] = new RigidBody ();
305317 rb[3 *i+2 ]->initBody (1 .0f ,
306- Eigen::Vector3f (startX, 0 . 75f , 4 .0f ),
318+ Eigen::Vector3f (startX, startY- 0 . 25f , 4 .0f ),
307319 computeInertiaTensorBox (1 .0f , width, height, depth),
308320 Eigen::Quaternionf (1 .0f , 0 .0f , 0 .0f , 0 .0f ));
309321
310322 startX += 4 .0f ;
311- }
312323
324+ if (i == 3 )
325+ {
326+ startY -= 5 .5f ;
327+ startX = 0 .0f ;
328+ }
329+ }
313330
314- model.addBallJoint (0 , 1 , Eigen::Vector3f (0 .25f , 0 .75f , 1 .0f ));
315- model.addBallJoint (1 , 2 , Eigen::Vector3f (0 .25f , 0 .75f , 3 .0f ));
331+ float jointY = 0 .75f ;
332+ model.addBallJoint (0 , 1 , Eigen::Vector3f (0 .25f , jointY, 1 .0f ));
333+ model.addBallJoint (1 , 2 , Eigen::Vector3f (0 .25f , jointY, 3 .0f ));
316334
317- model.addBallOnLineJoint (3 , 4 , Eigen::Vector3f (4 .25f , 0 . 75f , 1 .0f ), Eigen::Vector3f (1 .0f , 0 .0f , 0 .0f ));
318- model.addBallJoint (4 , 5 , Eigen::Vector3f (4 .25f , 0 . 75f , 3 .0f ));
335+ model.addBallOnLineJoint (3 , 4 , Eigen::Vector3f (4 .25f , jointY , 1 .0f ), Eigen::Vector3f (1 .0f , 0 .0f , 0 .0f ));
336+ model.addBallJoint (4 , 5 , Eigen::Vector3f (4 .25f , jointY , 3 .0f ));
319337
320- model.addHingeJoint (6 , 7 , Eigen::Vector3f (8 .0f , 0 . 75f , 1 .0f ), Eigen::Vector3f (1 .0f , 0 .0f , 0 .0f ));
321- model.addBallJoint (7 , 8 , Eigen::Vector3f (8 .25f , 0 . 75f , 3 .0f ));
338+ model.addHingeJoint (6 , 7 , Eigen::Vector3f (8 .0f , jointY , 1 .0f ), Eigen::Vector3f (1 .0f , 0 .0f , 0 .0f ));
339+ model.addBallJoint (7 , 8 , Eigen::Vector3f (8 .25f , jointY , 3 .0f ));
322340
323- model.addUniversalJoint (9 , 10 , Eigen::Vector3f (12 .0f , 0 . 75f , 1 .0f ), Eigen::Vector3f (1 .0f , 0 .0f , 0 .0f ), Eigen::Vector3f (0 .0f , 1 .0f , 0 .0f ));
324- model.addBallJoint (10 , 11 , Eigen::Vector3f (12 .25f , 0 . 75f , 3 .0f ));
341+ model.addUniversalJoint (9 , 10 , Eigen::Vector3f (12 .0f , jointY , 1 .0f ), Eigen::Vector3f (1 .0f , 0 .0f , 0 .0f ), Eigen::Vector3f (0 .0f , 1 .0f , 0 .0f ));
342+ model.addBallJoint (10 , 11 , Eigen::Vector3f (12 .25f , jointY , 3 .0f ));
325343
326- model.addTargetAngleMotorHingeJoint (12 , 13 , Eigen::Vector3f (16 .0f , 0 .75f , 1 .0f ), Eigen::Vector3f (1 .0f , 0 .0f , 0 .0f ));
344+ jointY -= 5 .5f ;
345+ model.addTargetAngleMotorHingeJoint (12 , 13 , Eigen::Vector3f (0 .0f , jointY, 1 .0f ), Eigen::Vector3f (1 .0f , 0 .0f , 0 .0f ));
327346 ((TargetAngleMotorHingeJoint*)model.getConstraints ()[model.getConstraints ().size () - 1 ])->setMaxAngularMomentumPerStep (0 .5f );
328- model.addTargetVelocityMotorHingeJoint (13 , 14 , Eigen::Vector3f (16 .0f , 0 . 75f , 3 .0f ), Eigen::Vector3f (0 .0f , 1 .0f , 0 .0f ));
347+ model.addTargetVelocityMotorHingeJoint (13 , 14 , Eigen::Vector3f (0 .0f , jointY , 3 .0f ), Eigen::Vector3f (0 .0f , 1 .0f , 0 .0f ));
329348 ((TargetVelocityMotorHingeJoint*)model.getConstraints ()[model.getConstraints ().size () - 1 ])->setMaxAngularMomentumPerStep (25 .0f );
349+
350+ model.addSliderJoint (15 , 16 , Eigen::Vector3f (4 .0f , jointY, 1 .0f ), Eigen::Vector3f (1 .0f , 0 .0f , 0 .0f ));
351+ model.addBallJoint (16 , 17 , Eigen::Vector3f (4 .25f , jointY, 3 .0f ));
330352}
331353
332354void TW_CALL setTimeStep (const void *value, void *clientData)
0 commit comments