private static void CalibrateLeg(Settings settings, Transform tracker, IKSolverVR.Leg leg, Transform lastBone, Vector3 rootForward, bool isLeft) { string name = isLeft ? "Left" : "Right"; Transform target = leg.target == null ? (new GameObject(name + " Foot Target")).transform : leg.target; // Space of the tracker heading Quaternion trackerSpace = tracker.rotation * Quaternion.LookRotation(settings.footTrackerForward, settings.footTrackerUp); Vector3 f = trackerSpace * Vector3.forward; f.y = 0f; trackerSpace = Quaternion.LookRotation(f); // Target position float inwardOffset = isLeft ? settings.footInwardOffset : -settings.footInwardOffset; target.position = tracker.position + trackerSpace * new Vector3(inwardOffset, 0f, settings.footForwardOffset); target.position = new Vector3(target.position.x, lastBone.position.y, target.position.z); // Target rotation target.rotation = lastBone.rotation; // Rotate target forward towards tracker forward Vector3 footForward = AxisTools.GetAxisVectorToDirection(lastBone, rootForward); if (Vector3.Dot(lastBone.rotation * footForward, rootForward) < 0f) { footForward = -footForward; } Vector3 fLocal = Quaternion.Inverse(Quaternion.LookRotation(target.rotation * footForward)) * f; float angle = Mathf.Atan2(fLocal.x, fLocal.z) * Mathf.Rad2Deg; float headingOffset = isLeft ? settings.footHeadingOffset : -settings.footHeadingOffset; target.rotation = Quaternion.AngleAxis(angle + headingOffset, Vector3.up) * target.rotation; target.parent = tracker; leg.target = target; leg.positionWeight = 1f; leg.rotationWeight = 1f; // Bend goal Transform bendGoal = leg.bendGoal == null ? (new GameObject(name + " Leg Bend Goal")).transform : leg.bendGoal; bendGoal.position = lastBone.position + trackerSpace * Vector3.forward + trackerSpace * Vector3.up;// * 0.5f; bendGoal.parent = tracker; leg.bendGoal = bendGoal; leg.bendGoalWeight = 1f; }
private static void CalibrateLeg(CalibrationData data, Transform tracker, IKSolverVR.Leg leg, Transform lastBone, Vector3 rootForward, bool isLeft) { if (isLeft && data.leftFoot == null) { return; } if (!isLeft && data.rightFoot == null) { return; } string name = isLeft ? "Left" : "Right"; Transform target = leg.target == null ? (new GameObject(name + " Foot Target")).transform : leg.target; target.parent = tracker; if (isLeft) { data.leftFoot.SetTo(target); } else { data.rightFoot.SetTo(target); } leg.target = target; leg.positionWeight = 1f; leg.rotationWeight = 1f; // Bend goal Transform bendGoal = leg.bendGoal == null ? (new GameObject(name + " Leg Bend Goal")).transform : leg.bendGoal; bendGoal.parent = tracker; if (isLeft) { data.leftLegGoal.SetTo(bendGoal); } else { data.rightLegGoal.SetTo(bendGoal); } leg.bendGoal = bendGoal; leg.bendGoalWeight = 1f; }
} // 0x00000001807D6FA0-0x00000001807D8960 private static void CalibrateLeg(Settings settings, Transform tracker, IKSolverVR.Leg leg, Transform lastBone, Vector3 rootForward, bool isLeft) { } // 0x00000001807D65D0-0x00000001807D6FA0