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); } } } }
//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; } }