private void ComputeTargets(int keyInd, float lt, float t) { //update both arms for (int arm = 0; arm < 2; arm++) { //Actual target Vector3 target = _animInfo.ComputeInterpolatedTarget(lt, keyInd, arm); if (t < 0) { //globalTf // project target to a position before position at keyInd Vector3 pivot = _animInfo.ComputeInterpolatedTarget(0, 0, arm); //TCB interpolation for position target = 2*pivot - target; } else if (t > 1) { //globalT // project target to a position beyond keyInd Vector3 pivot = _animInfo.ComputeInterpolatedTarget(0, _animInfo.Keys.Length - 1, arm); //TCB interpolation for position target = 2*pivot - target; } if (arm == 0) _targetL = target; else _targetR = target; } //update other body parts _bodyTargetPos = _animInfo.ComputeInterpolatedBodyPos(_fbIk.solver.bodyEffector.bone.transform, keyInd, lt); _footLTargetPos = _animInfo.ComputeInterpolatedBodyPos(_fbIk.solver.leftFootEffector.bone.transform, keyInd, lt); _footRTargetPos = _animInfo.ComputeInterpolatedBodyPos(_fbIk.solver.rightFootEffector.bone.transform, keyInd, lt); _shoulderLTargetPos = _animInfo.ComputeInterpolatedBodyPos(_fbIk.solver.leftShoulderEffector.bone.transform, keyInd, lt); _shoulderRTargetPos = _animInfo.ComputeInterpolatedBodyPos(_fbIk.solver.rightShoulderEffector.bone.transform, keyInd, lt); _elbowLTargetPos = _animInfo.ComputeInterpolatedBodyPos(_torso.Elbow[0], keyInd, lt); _elbowRTargetPos = _animInfo.ComputeInterpolatedBodyPos(_torso.Elbow[1], keyInd, lt); _kneeLTargetPos = _animInfo.ComputeInterpolatedBodyPos(_torso.Knee[0], keyInd, lt); _kneeRTargetPos = _animInfo.ComputeInterpolatedBodyPos(_torso.Knee[1], keyInd, lt); _thighLTargetPos = _animInfo.ComputeInterpolatedBodyPos(_torso.Pelvis[0], keyInd, lt); _thighRTargetPos = _animInfo.ComputeInterpolatedBodyPos(_torso.Pelvis[1], keyInd, lt); //Update positions considering anticipation if (t < 0) { Vector3 pivot = _animInfo.ComputeInterpolatedBodyPos(_fbIk.solver.bodyEffector.bone.transform, 0, 0); //if(_animInfo.CharacterName.Contains("CUSTOMER")) // _bodyTargetPos = 2*pivot - _bodyTargetPos; pivot = _animInfo.ComputeInterpolatedBodyPos(_fbIk.solver.leftFootEffector.bone.transform, 0, 0); _footLTargetPos = 2*pivot - _footLTargetPos; pivot = _animInfo.ComputeInterpolatedBodyPos(_fbIk.solver.rightFootEffector.bone.transform, 0, 0); _footRTargetPos = 2*pivot - _footRTargetPos; pivot = _animInfo.ComputeInterpolatedBodyPos(_fbIk.solver.leftShoulderEffector.bone.transform, 0, 0); _shoulderLTargetPos = 2*pivot - _shoulderLTargetPos; pivot = _animInfo.ComputeInterpolatedBodyPos(_fbIk.solver.rightShoulderEffector.bone.transform, 0, 0); _shoulderRTargetPos = 2*pivot - _shoulderRTargetPos; pivot = _animInfo.ComputeInterpolatedBodyPos(_torso.Elbow[0], 0, 0); _elbowLTargetPos = 2*pivot - _elbowLTargetPos; pivot = _animInfo.ComputeInterpolatedBodyPos(_torso.Elbow[1], 0, 0); _elbowRTargetPos = 2*pivot - _elbowRTargetPos; pivot = _animInfo.ComputeInterpolatedBodyPos(_torso.Knee[0], 0, 0); _kneeLTargetPos = 2*pivot - _kneeLTargetPos; pivot = _animInfo.ComputeInterpolatedBodyPos(_torso.Knee[1], 0, 0); _kneeRTargetPos = 2*pivot - _kneeRTargetPos; pivot = _animInfo.ComputeInterpolatedBodyPos(_torso.Pelvis[0], 0, 0); _thighLTargetPos = 2*pivot - _thighLTargetPos; pivot = _animInfo.ComputeInterpolatedBodyPos(_torso.Pelvis[1], 0, 0); _thighRTargetPos = 2*pivot - _thighRTargetPos; } //Update positions considering overshoot else if (t > 1) { Vector3 pivot = _animInfo.ComputeInterpolatedBodyPos(_fbIk.solver.bodyEffector.bone.transform, _animInfo.Keys.Length - 1, 0); pivot = _animInfo.ComputeInterpolatedBodyPos(_fbIk.solver.leftFootEffector.bone.transform, _animInfo.Keys.Length - 1, 0); _footLTargetPos = 2*pivot - _footLTargetPos; pivot = _animInfo.ComputeInterpolatedBodyPos(_fbIk.solver.rightFootEffector.bone.transform, _animInfo.Keys.Length - 1, 0); _footRTargetPos = 2*pivot - _footRTargetPos; pivot = _animInfo.ComputeInterpolatedBodyPos(_fbIk.solver.leftShoulderEffector.bone.transform, _animInfo.Keys.Length - 1, 0); _shoulderLTargetPos = 2*pivot - _shoulderLTargetPos; pivot = _animInfo.ComputeInterpolatedBodyPos(_fbIk.solver.rightShoulderEffector.bone.transform, _animInfo.Keys.Length - 1, 0); _shoulderRTargetPos = 2*pivot - _shoulderRTargetPos; pivot = _animInfo.ComputeInterpolatedBodyPos(_torso.Elbow[0], _animInfo.Keys.Length - 1, 0); _elbowLTargetPos = 2*pivot - _elbowLTargetPos; pivot = _animInfo.ComputeInterpolatedBodyPos(_torso.Elbow[1], _animInfo.Keys.Length - 1, 0); _elbowRTargetPos = 2*pivot - _elbowRTargetPos; pivot = _animInfo.ComputeInterpolatedBodyPos(_torso.Knee[0], _animInfo.Keys.Length - 1, 0); _kneeLTargetPos = 2*pivot - _kneeLTargetPos; pivot = _animInfo.ComputeInterpolatedBodyPos(_torso.Knee[1], _animInfo.Keys.Length - 1, 0); _kneeRTargetPos = 2*pivot - _kneeRTargetPos; pivot = _animInfo.ComputeInterpolatedBodyPos(_torso.Pelvis[0], _animInfo.Keys.Length - 1, 0); _thighLTargetPos = 2*pivot - _thighLTargetPos; pivot = _animInfo.ComputeInterpolatedBodyPos(_torso.Pelvis[1], _animInfo.Keys.Length - 1, 0); _thighRTargetPos = 2*pivot - _thighRTargetPos; } }