public VRIKSolverDataLeg(IKSolverVR.Leg leg) { positionWeight = leg.positionWeight; rotationWeight = leg.rotationWeight; bendGoalWeight = leg.bendGoalWeight; swivelOffset = leg.swivelOffset; bendToTargetWeight = leg.bendToTargetWeight; legLengthMlp = leg.legLengthMlp; }
public void ApplyTo(IKSolverVR.Leg leg) { leg.positionWeight = positionWeight; leg.rotationWeight = rotationWeight; leg.bendGoalWeight = bendGoalWeight; leg.swivelOffset = swivelOffset; leg.bendToTargetWeight = bendToTargetWeight; leg.legLengthMlp = legLengthMlp; }
public CachedSolver(IKSolverVR solver) { Solver = solver; Spine = solver.spine; LeftArm = solver.leftArm; LeftLeg = solver.leftLeg; RightArm = solver.rightArm; RightLeg = solver.rightLeg; Locomotion = solver.locomotion; LeftLegBones = LeftLeg.bones; RightLegBones = RightLeg.bones; }
private static void CalibrateLeg(Settings settings, Transform FootTransform, IKSolverVR.Leg leg, Transform lastBone, Vector3 rootForward, bool isLeft) { Transform footAdjusterTransform = leg.target == null ? new GameObject(isLeft ? "leftFootAdjuster" : "rightFootAdjuster").transform : leg.target; footAdjusterTransform.parent = FootTransform; // Space of the tracker heading Quaternion frontQuaternion = FootTransform.rotation * Quaternion.LookRotation(settings.footTrackerForward, settings.footTrackerUp); Vector3 frontVector = frontQuaternion * Vector3.forward; frontVector.y = 0f; frontQuaternion = Quaternion.LookRotation(frontVector); // Target position float inwardOffset = isLeft ? settings.footInwardOffset : -settings.footInwardOffset; footAdjusterTransform.position = FootTransform.position + frontQuaternion * new Vector3(inwardOffset, 0f, settings.footForwardOffset); footAdjusterTransform.position = new Vector3(footAdjusterTransform.position.x, lastBone.position.y, footAdjusterTransform.position.z); // Target rotation footAdjusterTransform.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(footAdjusterTransform.rotation * footForward)) * frontVector; float angle = Mathf.Atan2(fLocal.x, fLocal.z) * Mathf.Rad2Deg; float headingOffset = isLeft ? settings.footHeadingOffset : -settings.footHeadingOffset; footAdjusterTransform.rotation = Quaternion.AngleAxis(angle + headingOffset, Vector3.up) * footAdjusterTransform.rotation; leg.target = footAdjusterTransform; 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 + frontQuaternion * Vector3.forward + frontQuaternion * Vector3.up;// * 0.5f; * bendGoal.parent = FootTransform; * leg.bendGoal = bendGoal; * leg.bendGoalWeight = 1f; */ leg.bendGoal = null; leg.bendGoalWeight = 0f; }