/// <summary> /// Solve the IK for a chain /// </summary> /// <param name="chain"></param> public static bool Process(Core.Chain chain) { if (chain.Joints.Count <= 0) { return(false); } chain.MapVirtualJoints(); for (int j = 0; j < chain.Iterations; j++) { for (int i = chain.Joints.Count - 1; i >= 0; i--) { float _weight = chain.Weight * chain.Joints[i].weight; //relative weight //direction vectors Vector3 _v0 = chain.GetIKTarget() - chain.Joints[i].joint.position; Vector3 _v1 = chain.Joints[chain.Joints.Count - 1].joint.position - chain.Joints[i].joint.position; //Weight Quaternion _sourceRotation = chain.Joints[i].joint.rotation; Quaternion _targetRotation = Quaternion.Lerp(Quaternion.identity, GenericMath.RotateFromTo(_v0, _v1), _weight); //Rotation Math chain.Joints[i].rot = Quaternion.Lerp(_sourceRotation, GenericMath.ApplyQuaternion(_targetRotation, _sourceRotation), _weight); chain.Joints[i].ApplyVirtualMap(false, true); chain.Joints[i].ApplyRestrictions(); } } return(true); }
// Token: 0x0600274F RID: 10063 RVA: 0x000B62EC File Offset: 0x000B44EC public static bool Process(Core.Chain chain) { if (chain.joints.Count <= 0) { return(false); } if (!chain.initiated) { chain.InitiateJoints(); } chain.MapVirtualJoints(); for (int i = 0; i < chain.iterations; i++) { FastReachSolver.SolveInward(chain); FastReachSolver.SolveOutward(chain); } FastReachSolver.MapSolverOutput(chain); return(true); }
// 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); }