// Token: 0x06003498 RID: 13464 RVA: 0x000E567C File Offset: 0x000E387C private static void Solve(Core.Chain chain, Transform endEffector, Vector3 LookAtAxis) { for (int i = 0; i < chain.joints.Count; i++) { Vector3 target = GenericMath.TransformVector(LookAtAxis, endEffector.rotation); Quaternion b = GenericMath.RotateFromTo(chain.GetIKtarget() - endEffector.position, target); Quaternion qA = Quaternion.Lerp(Quaternion.identity, b, chain.weight * chain.joints[i].weight); chain.joints[i].joint.rotation = GenericMath.ApplyQuaternion(qA, chain.joints[i].joint.rotation); chain.joints[i].ApplyRestrictions(); } }
// Token: 0x06002750 RID: 10064 RVA: 0x000B6344 File Offset: 0x000B4544 public static void SolveInward(Core.Chain chain) { int count = chain.joints.Count; chain.joints[count - 1].pos = Vector3.Lerp(chain.GetVirtualEE(), chain.GetIKtarget(), chain.weight); for (int i = count - 2; i >= 0; i--) { Vector3 pos = chain.joints[i + 1].pos; Vector3 vector = chain.joints[i].pos - pos; vector.Normalize(); vector *= Vector3.Distance(chain.joints[i + 1].joint.position, chain.joints[i].joint.position); chain.joints[i].pos = pos + vector; } }
// Token: 0x0600274B RID: 10059 RVA: 0x000B60A8 File Offset: 0x000B42A8 public static bool Process(Core.Chain chain) { if (chain.joints.Count <= 0) { return(false); } chain.MapVirtualJoints(); for (int i = 0; i < chain.iterations; i++) { for (int j = chain.joints.Count - 1; j >= 0; j--) { float t = chain.weight * chain.joints[j].weight; Vector3 source = chain.GetIKtarget() - chain.joints[j].joint.position; Vector3 target = chain.joints[chain.joints.Count - 1].joint.position - chain.joints[j].joint.position; Quaternion rotation = chain.joints[j].joint.rotation; Quaternion qA = Quaternion.Lerp(Quaternion.identity, GenericMath.RotateFromTo(source, target), t); chain.joints[j].rot = Quaternion.Lerp(rotation, GenericMath.ApplyQuaternion(qA, rotation), t); chain.joints[j].ApplyVirtualMap(false, true); chain.joints[j].ApplyRestrictions(); } } return(true); }