Example #1
0
static void inspectJoints(void)
{
  const dReal forcelimit = 2000.0;
  int i;
  for (i=0; i<SEGMCNT-1; i++)
  {
    if (dJointGetBody(hinges[i], 0))
    {
      // This joint has not snapped already... inspect it.
      dReal l0 = dLENGTH(jfeedbacks[i].f1);
      dReal l1 = dLENGTH(jfeedbacks[i].f2);
      colours[i+0] = 0.95*colours[i+0] + 0.05 * l0/forcelimit;
      colours[i+1] = 0.95*colours[i+1] + 0.05 * l1/forcelimit;
      if (l0 > forcelimit || l1 > forcelimit)
        stress[i]++;
      else
        stress[i]=0;
      if (stress[i]>4)
      {
        // Low-pass filter the noisy feedback data.
        // Only after 4 consecutive timesteps with excessive load, snap.
        fprintf(stderr,"SNAP! (that was the sound of joint %d breaking)\n", i);
        dJointAttach (hinges[i], 0, 0);
      }
    }
  }
}
Example #2
0
//check for joint triggering
void Joint::Physics_Step (void)
{
	Joint *d = Joint::head;
	dReal delt1, delt2, delt;

	while (d)
	{
		if (d->buffer_event)
		{
			//TODO: check torque also?
			delt1 = dLENGTH(d->feedback->f1);
			delt2 = dLENGTH(d->feedback->f2);

			if (delt1>delt2)
				delt = delt1 - d->threshold;
			else
				delt = delt2 - d->threshold;

			if (delt > 0)
			{
				if (d->buffer < 0) //already depleted, just damage more
					d->buffer -= delt*internal.stepsize;
				else
				{
					d->buffer -= delt*internal.stepsize;
					if (d->buffer < 0)
					{
						printlog(2, "Joint buffer depleted, generating event");
						new Buffer_Event_List(d);
					}
				}
			}
		}

		d = d->next;
	}
}