public override void tick(float dt) { if (SimpleIK.intersection(0, 0, this.radius1, (this.targetAbs.v - this.basisAbs.v).length(), 0, this.radius2)) { if ((SimpleIK.yi > 0)) { this.resultAbs.v = this.calc(new Vector2(SimpleIK.xi, SimpleIK.yi)); } else { this.resultAbs.v = this.calc(new Vector2(SimpleIK.xi_prime, SimpleIK.yi_prime)); } } }
public override void tick(float dt) { isInError = false; float len = (targetAbs.v - basisAbs.v).length(); // len = Math.Max(len, Math.Abs(radius1 - radius2)*1.01f); // len = Math.Min(len, Math.Abs(radius1 + radius2)*0.99f); - must not happen if (SimpleIK.intersection(radius1, len, radius2)) { // if (SimpleIK.intersection(0, 0, radius1, len, 0, radius2)) { if (SimpleIK.yi > 0) { resultAbs.v = calc(new Vector2(SimpleIK.xi, SimpleIK.yi)); } else { resultAbs.v = calc(new Vector2(SimpleIK.xi_prime, SimpleIK.yi_prime)); } } else { isInError = true; float ratio = radius1 / (radius1 + radius2); if (!float.IsInfinity(ratio)) { resultAbs.v = basisAbs.v.mix(targetAbs.v, ratio); } } if (float.IsNaN(resultAbs.v.x) || float.IsNaN(resultAbs.v.y) || float.IsNaN(resultAbs.v.z)) { isInError = true; Debug.Log("!" + resultAbs.v + " " + radius1 + " " + radius2); Debug.Log("!!" + targetAbs.v); } }