コード例 #1
0
 public VRIKSolverDataLeg(IKSolverVR.Leg leg)
 {
     positionWeight     = leg.positionWeight;
     rotationWeight     = leg.rotationWeight;
     bendGoalWeight     = leg.bendGoalWeight;
     swivelOffset       = leg.swivelOffset;
     bendToTargetWeight = leg.bendToTargetWeight;
     legLengthMlp       = leg.legLengthMlp;
 }
コード例 #2
0
 public void ApplyTo(IKSolverVR.Leg leg)
 {
     leg.positionWeight     = positionWeight;
     leg.rotationWeight     = rotationWeight;
     leg.bendGoalWeight     = bendGoalWeight;
     leg.swivelOffset       = swivelOffset;
     leg.bendToTargetWeight = bendToTargetWeight;
     leg.legLengthMlp       = legLengthMlp;
 }
コード例 #3
0
ファイル: CachedSolver.cs プロジェクト: knah/VRCMods
        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;
        }
コード例 #4
0
    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;
    }