void IK_QSwingSegment::SetLimit(int axis, MT_Scalar lmin, MT_Scalar lmax) { if (lmin >= lmax) return; // clamp and convert to axis angle parameters lmin = MT_clamp(lmin, -MT_PI, MT_PI); lmax = MT_clamp(lmax, -MT_PI, MT_PI); lmin = sin(lmin*0.5); lmax = sin(lmax*0.5); // put center of ellispe in the middle between min and max MT_Scalar offset = 0.5*(lmin + lmax); //lmax = lmax - offset; if (axis == 0) { m_min[0] = -lmax; m_max[0] = -lmin; m_limit_x = true; m_offset_x = offset; m_max_x = lmax; } else if (axis == 2) { m_min[1] = -lmax; m_max[1] = -lmin; m_limit_z = true; m_offset_z = offset; m_max_z = lmax; } }
void IK_QSphericalSegment::SetLimit(int axis, MT_Scalar lmin, MT_Scalar lmax) { if (lmin >= lmax) return; if (axis == 1) { lmin = MT_clamp(lmin, -MT_PI, MT_PI); lmax = MT_clamp(lmax, -MT_PI, MT_PI); m_min_y = lmin; m_max_y = lmax; m_limit_y = true; } else { // clamp and convert to axis angle parameters lmin = MT_clamp(lmin, -MT_PI, MT_PI); lmax = MT_clamp(lmax, -MT_PI, MT_PI); lmin = sin(lmin*0.5); lmax = sin(lmax*0.5); if (axis == 0) { m_min[0] = -lmax; m_max[0] = -lmin; m_limit_x = true; } else if (axis == 2) { m_min[1] = -lmax; m_max[1] = -lmin; m_limit_z = true; } } }
void IK_QRevoluteSegment::SetLimit(int axis, MT_Scalar lmin, MT_Scalar lmax) { if (lmin >= lmax || m_axis != axis) return; // clamp and convert to axis angle parameters lmin = MT_clamp(lmin, -MT_PI, MT_PI); lmax = MT_clamp(lmax, -MT_PI, MT_PI); m_min = lmin; m_max = lmax; m_limit = true; }
void IK_QElbowSegment::SetLimit(int axis, MT_Scalar lmin, MT_Scalar lmax) { if (lmin > lmax) return; // clamp and convert to axis angle parameters lmin = MT_clamp(lmin, -MT_PI, MT_PI); lmax = MT_clamp(lmax, -MT_PI, MT_PI); if (axis == 1) { m_min_twist = lmin; m_max_twist = lmax; m_limit_twist = true; } else if (axis == m_axis) { m_min = lmin; m_max = lmax; m_limit = true; } }