PhysX supports joints that 'drive' to a given velocity or a given position/orientation. I am adding the required commands and will document them as best as I can but I will not have time to do much testing or create an example.
Although at some point after the update I could provide an example of how to use it, once I figure it out
I think these commands may help you too Fallout, instead of adding force to your crusher you may be able to 'drive' it to one position and then back again.
Here they are:
void dynJointDescSetSwingDrive(int jointDescID, int driveType, float forceLimit, float damping, float spring);
void dynJointDescSetTwistDrive(int jointDescID, int driveType, float forceLimit, float damping, float spring);
void dynJointDescSetXDrive(int jointDescID, int driveType, float forceLimit, float damping, float spring);
void dynJointDescSetYDrive(int jointDescID, int driveType, float forceLimit, float damping, float spring);
void dynJointDescSetZDrive(int jointDescID, int driveType, float forceLimit, float damping, float spring);
void dynJointDescSetSlerpDrive(int jointDescID, int driveType, float forceLimit, float damping, float spring);
void dynJointDescSetGearRatio(int jointDescID, float ratio);
void dynJointSetDriveAngularVelocity(int jointID, float x, float y, float z);
void dynJointSetDriveLinearVelocity(int jointID, float x, float y, float z);
void dynJointSetDriveOrientation(int jointID, float w, float x, float y, float z);
void dynJointSetDrivePosition(int jointID, float x, float y, float z);
The drive orientation takes a quaternion there, I will probably change that to take euler angles.