Esempio n. 1
0
bool ConstraintSet::setControlParameter(int id, ConstraintAction action, double data, double timestep)
{
	ConstraintValues values;
	ConstraintSingleValue value;
	values.values = &value;
	values.number = 0;
	values.action = action;
	values.id = id;
	value.action = action;
	value.id = id;
	switch (action) {
	case ACT_NONE:
		return true;
	case ACT_VALUE:
		value.yd = data;
		values.number = 1;
		break;
	case ACT_VELOCITY:
		value.yddot = data;
		values.number = 1;
		break;
	case ACT_TOLERANCE:
		values.tolerance = data;
		break;
	case ACT_FEEDBACK:
		values.feedback = data;
		break;
	case ACT_ALPHA:
		values.alpha = data;
		break;
	default:
		assert(action==ACT_NONE);
	}
	return setControlParameters(&values, 1, timestep);
}
Esempio n. 2
0
void CopyPose::updateControlOutput(const Timestamp& timestamp)
{
    //IMO this should be done, no idea if it is enough (wrt Distance impl)
	Twist y = diff(F_identity, m_internalPose);
	bool found = true;
	if (!timestamp.substep) {
		if (!timestamp.reiterate) {
			found = popPose(timestamp.cacheTimestamp);
		}
	}
	if (m_constraintCallback && (m_substep || (!timestamp.reiterate && !timestamp.substep))) {
		// initialize first callback the application to get the current values
		int i=0;
		if (m_outputControl & CTL_POSITION) {
			updateValues(y.vel, &m_values[i++], &m_pos, CTL_POSITIONX);
		}
		if (m_outputControl & CTL_ROTATION) {
			updateValues(y.rot, &m_values[i++], &m_rot, CTL_ROTATIONX);
		}
		if ((*m_constraintCallback)(timestamp, m_values, m_nvalues, m_constraintParam)) {
			setControlParameters(m_values, m_nvalues, (found && timestamp.interpolate)?timestamp.realTimestep:0.0);
		}
	}
	if (m_outputControl & CTL_POSITION) {
		updateOutput(y.vel, &m_pos, CTL_POSITIONX);
	}
	if (m_outputControl & CTL_ROTATION) {
		updateOutput(y.rot, &m_rot, CTL_ROTATIONX);
	}
}