Skip to content

Commit

Permalink
- added TargetVelocityMotorHingeJoint
Browse files Browse the repository at this point in the history
- added TargetAngleMotorHingeJoint
- extended JointDemo
- made function names consistent
  • Loading branch information
janbender committed Nov 2, 2015
1 parent 9820790 commit 0e0ce6a
Show file tree
Hide file tree
Showing 19 changed files with 1,473 additions and 291 deletions.
5 changes: 5 additions & 0 deletions Changelog.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
1.4.0
- extended JointDemo
- added TargetVelocityMotorHingeJoint
- added TargetAngleMotorHingeJoint
- made function names consistent
- fixed initialization of hinge joint coordinate system
- parallelized unified solver using graph coloring
- implemented unified solver for rigid bodies and deformable solids
Expand Down
4 changes: 2 additions & 2 deletions Demos/GenericConstraintsDemos/GenericConstraints.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ bool GenericDistanceConstraint::initConstraint(SimulationModel &model, const uns
return true;
}

bool GenericDistanceConstraint::solveConstraint(SimulationModel &model)
bool GenericDistanceConstraint::solvePositionConstraint(SimulationModel &model)
{
ParticleData &pd = model.getParticles();

Expand Down Expand Up @@ -156,7 +156,7 @@ bool GenericIsometricBendingConstraint::initConstraint(SimulationModel &model, c
return true;
}

bool GenericIsometricBendingConstraint::solveConstraint(SimulationModel &model)
bool GenericIsometricBendingConstraint::solvePositionConstraint(SimulationModel &model)
{
ParticleData &pd = model.getParticles();

Expand Down
4 changes: 2 additions & 2 deletions Demos/GenericConstraintsDemos/GenericConstraints.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ namespace PBD
virtual int &getTypeId() const { return TYPE_ID; }

virtual bool initConstraint(SimulationModel &model, const unsigned int particle1, const unsigned int particle2);
virtual bool solveConstraint(SimulationModel &model);
virtual bool solvePositionConstraint(SimulationModel &model);
};

class GenericIsometricBendingConstraint : public Constraint
Expand All @@ -55,7 +55,7 @@ namespace PBD

virtual bool initConstraint(SimulationModel &model, const unsigned int particle1, const unsigned int particle2,
const unsigned int particle3, const unsigned int particle4);
virtual bool solveConstraint(SimulationModel &model);
virtual bool solvePositionConstraint(SimulationModel &model);
};
}

Expand Down
57 changes: 54 additions & 3 deletions Demos/RigidBodyDemos/JointDemo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ void TW_CALL setTimeStep(const void *value, void *clientData);
void TW_CALL getTimeStep(void *value, void *clientData);
void TW_CALL setVelocityUpdateMethod(const void *value, void *clientData);
void TW_CALL getVelocityUpdateMethod(void *value, void *clientData);
void TW_CALL setMaxIterations(const void *value, void *clientData);
void TW_CALL getMaxIterations(void *value, void *clientData);

SimulationModel model;
TimeStepController sim;
Expand Down Expand Up @@ -60,12 +62,13 @@ int main( int argc, char **argv )
buildModel ();

MiniGL::setClientSceneFunc(render);
MiniGL::setViewport (50.0f, 0.1f, 500.0f, Vector3f (6.0f, -2.5f, 15.0f), Vector3f (6.0f, 0.0f, 0.0f));
MiniGL::setViewport (50.0f, 0.1f, 500.0f, Vector3f (8.0f, -2.5f, 17.0f), Vector3f (8.0f, 0.0f, 0.0f));

TwAddVarRW(MiniGL::getTweakBar(), "Pause", TW_TYPE_BOOLCPP, &doPause, " label='Pause' group=Simulation key=SPACE ");
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 ");
TwType enumType = TwDefineEnum("VelocityUpdateMethodType", NULL, 0);
TwAddVarCB(MiniGL::getTweakBar(), "VelocityUpdateMethod", enumType, setVelocityUpdateMethod, getVelocityUpdateMethod, &sim, " label='Velocity update method' enum='0 {First Order Update}, 1 {Second Order Update}' group=Simulation");
TwAddVarCB(MiniGL::getTweakBar(), "MaxIter", TW_TYPE_UINT32, setMaxIterations, getMaxIterations, &sim, " label='Max. iterations' min=1 step=1 group=Simulation ");

glutMainLoop ();

Expand Down Expand Up @@ -132,7 +135,17 @@ void timeStep ()

// Simulation code
for (unsigned int i = 0; i < 8; i++)
{
sim.step(model);

// set target angle of motors for an animation
const float currentTargetAngle = (float)M_PI * 0.5f - (float)M_PI * 0.5f * cos(0.25f*TimeManager::getCurrent()->getTime());
SimulationModel::ConstraintVector &constraints = model.getConstraints();
TargetAngleMotorHingeJoint &joint1 = (*(TargetAngleMotorHingeJoint*)constraints[8]);
TargetVelocityMotorHingeJoint &joint2 = (*(TargetVelocityMotorHingeJoint*)constraints[9]);
joint1.setTargetAngle(currentTargetAngle);
joint2.setTargetAngularVelocity(3.5f);
}
}

void buildModel ()
Expand Down Expand Up @@ -170,6 +183,20 @@ void renderUniversalJoint(UniversalJoint &uj)
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);
}

void renderTargetAngleMotorHingeJoint(TargetAngleMotorHingeJoint &hj)
{
MiniGL::drawSphere(hj.m_jointInfo.col(6) - 0.5*hj.m_jointInfo.col(8), 0.1f, jointColor);
MiniGL::drawSphere(hj.m_jointInfo.col(6) + 0.5*hj.m_jointInfo.col(8), 0.1f, jointColor);
MiniGL::drawCylinder(hj.m_jointInfo.col(6) - 0.5*hj.m_jointInfo.col(8), hj.m_jointInfo.col(6) + 0.5*hj.m_jointInfo.col(8), jointColor, 0.05f);
}

void renderTargetVelocityMotorHingeJoint(TargetVelocityMotorHingeJoint &hj)
{
MiniGL::drawSphere(hj.m_jointInfo.col(6) - 0.5*hj.m_jointInfo.col(8), 0.1f, jointColor);
MiniGL::drawSphere(hj.m_jointInfo.col(6) + 0.5*hj.m_jointInfo.col(8), 0.1f, jointColor);
MiniGL::drawCylinder(hj.m_jointInfo.col(6) - 0.5*hj.m_jointInfo.col(8), hj.m_jointInfo.col(6) + 0.5*hj.m_jointInfo.col(8), jointColor, 0.05f);
}

void render ()
{
MiniGL::coordinateSystem();
Expand Down Expand Up @@ -219,13 +246,22 @@ void render ()
{
renderUniversalJoint(*(UniversalJoint*)constraints[i]);
}
else if (constraints[i]->getTypeId() == TargetAngleMotorHingeJoint::TYPE_ID)
{
renderTargetAngleMotorHingeJoint(*(TargetAngleMotorHingeJoint*)constraints[i]);
}
else if (constraints[i]->getTypeId() == TargetVelocityMotorHingeJoint::TYPE_ID)
{
renderTargetVelocityMotorHingeJoint(*(TargetVelocityMotorHingeJoint*)constraints[i]);
}
}

float textColor[4] = { 0.0f, .2f, .4f, 1 };
MiniGL::drawStrokeText(-0.5f, 1.5f, 1.0f, 0.002f, "ball joint", 11, textColor);
MiniGL::drawStrokeText(3.0f, 1.5f, 1.0f, 0.002f, "ball-on-line joint", 19, textColor);
MiniGL::drawStrokeText(7.3f, 1.5f, 1.0f, 0.002f, "hinge joint", 12, textColor);
MiniGL::drawStrokeText(11.2f, 1.5f, 1.0f, 0.002f, "universal joint", 15, textColor);
MiniGL::drawStrokeText(15.0f, 1.5f, 1.0f, 0.002f, "motor hinge joint", 17, textColor);

MiniGL::drawTime( TimeManager::getCurrent ()->getTime ());
}
Expand All @@ -247,9 +283,9 @@ void createBodyModel()
SimulationModel::RigidBodyVector &rb = model.getRigidBodies();

// static body
rb.resize(12);
rb.resize(15);
float startX = 0.0f;
for (unsigned int i = 0; i < 4; i++)
for (unsigned int i = 0; i < 5; i++)
{
rb[3*i] = new RigidBody();
rb[3*i]->initBody(0.0f,
Expand Down Expand Up @@ -286,6 +322,11 @@ void createBodyModel()

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));
model.addBallJoint(10, 11, Eigen::Vector3f(12.25f, 0.75f, 3.0f));

model.addTargetAngleMotorHingeJoint(12, 13, Eigen::Vector3f(16.0f, 0.75f, 1.0f), Eigen::Vector3f(1.0f, 0.0f, 0.0f));
((TargetAngleMotorHingeJoint*)model.getConstraints()[model.getConstraints().size() - 1])->setMaxAngularMomentumPerStep(0.5f);
model.addTargetVelocityMotorHingeJoint(13, 14, Eigen::Vector3f(16.0f, 0.75f, 3.0f), Eigen::Vector3f(0.0f, 1.0f, 0.0f));
((TargetVelocityMotorHingeJoint*)model.getConstraints()[model.getConstraints().size() - 1])->setMaxAngularMomentumPerStep(25.0f);
}

void TW_CALL setTimeStep(const void *value, void *clientData)
Expand All @@ -310,3 +351,13 @@ void TW_CALL getVelocityUpdateMethod(void *value, void *clientData)
*(short *)(value) = (short)((TimeStepController*)clientData)->getVelocityUpdateMethod();
}

void TW_CALL setMaxIterations(const void *value, void *clientData)
{
const unsigned int val = *(const unsigned int *)(value);
((TimeStepController*)clientData)->setMaxIterations(val);
}

void TW_CALL getMaxIterations(void *value, void *clientData)
{
*(unsigned int *)(value) = ((TimeStepController*)clientData)->getMaxIterations();
}
Loading

0 comments on commit 0e0ce6a

Please sign in to comment.