override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { FootPlacementData lF1 = animator.GetComponents <FootPlacementData>()[0]; FootPlacementData lF2 = animator.GetComponents <FootPlacementData>()[1]; //setting up first foot transition time and extra ray dist check if (lF1 != null) { if (stateInfo.normalizedTime > 0.25f) { lF1.mExtraRayDistanceCheck = mIdleRayCast; } else { lF1.mExtraRayDistanceCheck = 0; } } //setting up second foot transition time and extra ray dist check if (lF2 != null) { if (stateInfo.normalizedTime > 0.25f) { lF2.mExtraRayDistanceCheck = mIdleRayCast; } else { lF2.mExtraRayDistanceCheck = 0; } } }
/***********/ void Start() { mAnim = GetComponent <Animator>(); bool lLeftFootSet = false; bool lRightFootSet = false; FootPlacementData[] lFeet = GetComponents <FootPlacementData>(); for (byte i = 0; i < lFeet.Length; i++) { if (lFeet[i].IsLeftFoot) { if (!lLeftFootSet) { mLeftFoot = lFeet[i]; lLeftFootSet = true; } } else { if (!lRightFootSet) { mRightFoot = lFeet[i]; lRightFootSet = true; } } if (lLeftFootSet && lRightFootSet) { break; } } }
/***********/ void Start() { mAnim = GetComponent <Animator>(); if (mAnim == null) { Debug.LogWarning("Mec Foot Placer will not work without Animator component. Please add one"); } else if (!mAnim.isHuman) { Debug.LogWarning("Mec Foot Placer only works with Mecanim humanoid rigs."); } bool lLeftFootSet = false; bool lRightFootSet = false; bool lLeftHandSet = false; bool lRightHandSet = false; FootPlacementData[] lFeet = GetComponents <FootPlacementData>(); for (byte i = 0; i < lFeet.Length; i++) { switch (lFeet[i].mFootID) { case FootPlacementData.LimbID.LEFT_FOOT: lLeftFootSet = true; mLeftFoot = lFeet[i]; break; case FootPlacementData.LimbID.RIGHT_FOOT: lRightFootSet = true; mRightFoot = lFeet[i]; break; case FootPlacementData.LimbID.RIGHT_HAND: lRightHandSet = true; mLeftHand = lFeet[i]; break; case FootPlacementData.LimbID.LEFT_HAND: lLeftHandSet = true; mRightHand = lFeet[i]; break; } if (lLeftFootSet && lRightFootSet && lLeftHandSet && lRightHandSet) { break; } } }
void SetupFootIK() { FootPlacementData leftFootData = _anim.gameObject.AddComponent <FootPlacementData>(); FootPlacementData rightFootData = _anim.gameObject.AddComponent <FootPlacementData>(); MecFootPlacer footIKController = _anim.gameObject.AddComponent <MecFootPlacer>(); //set values Vector3 leftForward = _leftFoot.forward; Vector3 rightForward = _rightFoot.forward; float footOffsetDist = _leftCalf.position.y; float footLength = (_leftFoot.position - _leftToe.position).magnitude; float footHalfWidth = (Vector3.Dot(_anim.transform.right, _leftFoot.lossyScale)) / 2f; //assign values leftFootData.mFootID = FootPlacementData.LimbID.LEFT_FOOT; rightFootData.mFootID = FootPlacementData.LimbID.RIGHT_FOOT; leftFootData.mForwardVector = Vector3.forward; //leftForward; rightFootData.mForwardVector = Vector3.forward; //rightForward; leftFootData.mFootOffsetDist = footOffsetDist; rightFootData.mFootOffsetDist = footOffsetDist; leftFootData.mFootLength = footLength; rightFootData.mFootLength = footLength; leftFootData.mFootHalfWidth = footHalfWidth; rightFootData.mFootHalfWidth = footHalfWidth; leftFootData.mFootHeight = 0.05f; rightFootData.mFootHeight = 0.05f; leftFootData.mExtraRayDistanceCheck = 0.0f; rightFootData.mExtraRayDistanceCheck = 0.0f; //only for right foot //rightFootData.mIKHintOffset = new Vector3(0f,-0.25f,0f); footIKController.mAdjustPelvisVertically = true; footIKController.mDampPelvis = true; footIKController.mLayersToIgnore = new[] { "Member" }; }
/***********/ void Start () { mAnim = GetComponent<Animator>(); bool lLeftFootSet = false; bool lRightFootSet = false; FootPlacementData[] lFeet = GetComponents<FootPlacementData>(); for(byte i = 0; i < lFeet.Length; i++) { if(lFeet[i].IsLeftFoot) { if(!lLeftFootSet) { mLeftFoot = lFeet[i]; lLeftFootSet = true; } } else { if(!lRightFootSet) { mRightFoot = lFeet[i]; lRightFootSet = true; } } if(lLeftFootSet && lRightFootSet) { break; } } }
/*********************************************/ public void FootPlacement(AvatarIKGoal foot_id) { FootPlacementData lFoot = null; switch (foot_id) { case AvatarIKGoal.LeftFoot: if (!mLeftFootActive) { return; } lFoot = mLeftFoot; break; case AvatarIKGoal.RightFoot: if (!mRightFootActive) { return; } lFoot = mRightFoot; break; default: return; } lFoot.mUpVector.Normalize(); lFoot.mForwardVector.Normalize(); //Update forward vec and IKHintoffset based on cahracter foot and body rotation lFoot.CalculateRotatedIKHint(); lFoot.CalculateRotatedFwdVec(); //Updating Plant Foot Blend Transitions UpdateFootPlantBlendWeights(foot_id); //Find exact contact points FindContactPoints(foot_id); //Check for feet limits CheckForLimits(foot_id); //Update IK goal weights CalculateIKGoalWeights(foot_id); /*Setup Final IK Rotaiton*/ mAnim.SetIKRotationWeight(foot_id, lFoot.GetCurrentFootWeight()); //converting the foot yaw rotation to degree float lAngle = Vector3.Angle(lFoot.GetRotatedFwdVec(), lFoot.mForwardVector); Quaternion lQuat90 = new Quaternion(0, 0.7071f, 0, 0.7071f); Vector3 lEulerRot = Quaternion.FromToRotation(lFoot.mForwardVector, lFoot.GetTargetPos(FootPlacementData.Target.TOE)).eulerAngles; lEulerRot.z = 0; Quaternion lRot = Quaternion.Euler(lEulerRot); if ((lAngle > 90 && lAngle < 180) || (lAngle > 270 && lAngle < 90)) { lEulerRot = Quaternion.FromToRotation(lFoot.GetTargetPos(FootPlacementData.Target.HEEL), lQuat90 * lFoot.GetRotatedFwdVec()).eulerAngles; } else { lEulerRot = Quaternion.FromToRotation(lQuat90 * lFoot.GetRotatedFwdVec(), lFoot.GetTargetPos(FootPlacementData.Target.HEEL)).eulerAngles; } lEulerRot.x = 0; lEulerRot.y = 0; lRot = lRot * Quaternion.Euler(lEulerRot); mAnim.SetIKRotation(foot_id, lRot); /*Setup Final IK Swivel Angle*/ Vector3 lIKHintDir = Vector3.zero; if (foot_id == AvatarIKGoal.LeftFoot) { lIKHintDir = mAnim.GetBoneTransform(HumanBodyBones.LeftLowerLeg).position - mAnim.GetIKPosition(AvatarIKGoal.LeftFoot); //mAnim.GetBoneTransform(HumanBodyBones.LeftFoot).position; mAnim.SetIKHintPositionWeight(AvatarIKHint.LeftKnee, lFoot.GetCurrentFootWeight()); mAnim.SetIKHintPosition(AvatarIKHint.LeftKnee, lFoot.GetTargetPos(FootPlacementData.Target.TOE) + lFoot.GetTargetPos(FootPlacementData.Target.FOOT) + lFoot.GetRotatedIKHint() + lIKHintDir); } if (foot_id == AvatarIKGoal.RightFoot) { lIKHintDir = mAnim.GetBoneTransform(HumanBodyBones.RightLowerLeg).position - mAnim.GetBoneTransform(HumanBodyBones.RightFoot).position; mAnim.SetIKHintPositionWeight(AvatarIKHint.RightKnee, lFoot.GetCurrentFootWeight()); mAnim.SetIKHintPosition(AvatarIKHint.RightKnee, lFoot.GetTargetPos(FootPlacementData.Target.TOE) + lFoot.GetTargetPos(FootPlacementData.Target.FOOT) + lFoot.GetRotatedIKHint() + lIKHintDir); } /*Setup Final IK Position*/ mAnim.SetIKPositionWeight(foot_id, lFoot.GetCurrentFootWeight()); mAnim.SetIKPosition(foot_id, lFoot.GetTargetPos(FootPlacementData.Target.FOOT) + (lFoot.mUpVector * lFoot.mFootHeight)); /*Update planted foot position and rotation*/ if (lFoot.GetCurrentFootWeight() <= 0) { lFoot.SetFootPlanted(false); } else { if (lFoot.mPlantFoot && !lFoot.GetFootPlanted()) { if (Mathf.Abs(lFoot.GetTargetFootWeight() - lFoot.GetCurrentFootWeight()) < mEpsilon) { lFoot.SetPlantedPos(mAnim.GetIKPosition(foot_id)); // lFoot.SetPlantedRot(mAnim.GetIKRotation(foot_id)); lFoot.SetFootPlanted(true); } } } }
/************************************/ protected void RootPositioningCheck() { AnimateRootVertError(); if (mAdjustPelvisVertically) { float lLegLength = (mAnim.GetBoneTransform(HumanBodyBones.RightUpperLeg).position - mAnim.GetIKPosition(AvatarIKGoal.RightFoot)).magnitude; FootPlacementData lFoot = mRightFoot; mRootPosLeftRightFoot = true; if ((mAnim.GetBoneTransform(HumanBodyBones.LeftUpperLeg).position - mAnim.GetIKPosition(AvatarIKGoal.LeftFoot)).sqrMagnitude > (mAnim.GetBoneTransform(HumanBodyBones.RightUpperLeg).position - mAnim.GetIKPosition(AvatarIKGoal.RightFoot)).sqrMagnitude) { lLegLength = (mAnim.GetBoneTransform(HumanBodyBones.LeftUpperLeg).position - mAnim.GetIKPosition(AvatarIKGoal.LeftFoot)).magnitude; lFoot = mLeftFoot; mRootPosLeftRightFoot = false; } if (lLegLength > mMaxLegLength) { mTargetRootVertError = lLegLength - mMaxLegLength; float lLeftLegError = 0; float lRightLegError = 0; float lBuff = (mAnim.GetBoneTransform(HumanBodyBones.LeftUpperLeg).position - (mAnim.GetIKPosition(AvatarIKGoal.LeftFoot) + mLeftFoot.mUpVector * mTargetRootVertError)).magnitude; if (lBuff < mMinLegLength) { lLeftLegError = mMinLegLength - lBuff; } lBuff = (mAnim.GetBoneTransform(HumanBodyBones.RightUpperLeg).position - (mAnim.GetIKPosition(AvatarIKGoal.RightFoot) + mLeftFoot.mUpVector * mTargetRootVertError)).magnitude; if (lBuff < mMinLegLength) { lRightLegError = mMinLegLength - lBuff; } if (lRightLegError != 0 || lLeftLegError != 0) { if (lRightLegError > lLeftLegError) { mTargetRootVertError -= lRightLegError; } else { mTargetRootVertError -= lLeftLegError; } } } else { mTargetRootVertError = 0; mCurrentPelvisSpeed = 0; } mAnim.SetIKPosition(AvatarIKGoal.LeftFoot, mAnim.GetIKPosition(AvatarIKGoal.LeftFoot) + lFoot.mUpVector * mCurrentRootVertError); mAnim.SetIKPosition(AvatarIKGoal.RightFoot, mAnim.GetIKPosition(AvatarIKGoal.RightFoot) + lFoot.mUpVector * mCurrentRootVertError); mAnim.SetIKPosition(AvatarIKGoal.LeftHand, mAnim.GetIKPosition(AvatarIKGoal.LeftHand) + lFoot.mUpVector * mCurrentRootVertError); mAnim.SetIKPosition(AvatarIKGoal.RightHand, mAnim.GetIKPosition(AvatarIKGoal.RightHand) + lFoot.mUpVector * mCurrentRootVertError); } else { mTargetRootVertError = 0; mCurrentPelvisSpeed = 0; if (Mathf.Abs(mCurrentRootVertError) >= mEpsilon) { if (mRootPosLeftRightFoot) { mAnim.SetIKPosition(AvatarIKGoal.LeftFoot, mAnim.GetIKPosition(AvatarIKGoal.LeftFoot) + mRightFoot.mUpVector * mCurrentRootVertError); mAnim.SetIKPosition(AvatarIKGoal.RightFoot, mAnim.GetIKPosition(AvatarIKGoal.RightFoot) + mRightFoot.mUpVector * mCurrentRootVertError); mAnim.SetIKPosition(AvatarIKGoal.LeftHand, mAnim.GetIKPosition(AvatarIKGoal.LeftHand) + mRightFoot.mUpVector * mCurrentRootVertError); mAnim.SetIKPosition(AvatarIKGoal.RightHand, mAnim.GetIKPosition(AvatarIKGoal.RightHand) + mRightFoot.mUpVector * mCurrentRootVertError); } else { mAnim.SetIKPosition(AvatarIKGoal.LeftFoot, mAnim.GetIKPosition(AvatarIKGoal.LeftFoot) + mRightFoot.mUpVector * mCurrentRootVertError); mAnim.SetIKPosition(AvatarIKGoal.RightFoot, mAnim.GetIKPosition(AvatarIKGoal.RightFoot) + mRightFoot.mUpVector * mCurrentRootVertError); mAnim.SetIKPosition(AvatarIKGoal.LeftHand, mAnim.GetIKPosition(AvatarIKGoal.LeftHand) + mRightFoot.mUpVector * mCurrentRootVertError); mAnim.SetIKPosition(AvatarIKGoal.RightHand, mAnim.GetIKPosition(AvatarIKGoal.RightHand) + mRightFoot.mUpVector * mCurrentRootVertError); } } } }