예제 #1
0
    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;
            }
        }
    }
예제 #2
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;
            }
        }
    }
예제 #3
0
    /***********/
    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" };
    }
예제 #5
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;
			}
		}
	}
예제 #6
0
    /*********************************************/
    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);
                }
            }
        }
    }
예제 #7
0
    /************************************/
    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);
                }
            }
        }
    }