You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			97 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C#
		
	
			
		
		
	
	
			97 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C#
		
	
using UnityEngine;
 | 
						|
using System.Collections;
 | 
						|
using UnityEngine.Events;
 | 
						|
 | 
						|
namespace RootMotion.FinalIK {
 | 
						|
 | 
						|
	public partial class IKSolverVR: IKSolver {
 | 
						|
 | 
						|
		[System.Serializable]
 | 
						|
		public class Footstep {
 | 
						|
 | 
						|
			public float stepSpeed = 3f;
 | 
						|
			public Vector3 characterSpaceOffset;
 | 
						|
 | 
						|
			public Vector3 position;
 | 
						|
			public Quaternion rotation = Quaternion.identity;
 | 
						|
			public Quaternion stepToRootRot = Quaternion.identity;
 | 
						|
			public bool isStepping { get { return stepProgress < 1f; }}
 | 
						|
			public bool isSupportLeg;
 | 
						|
            public bool relaxFlag;
 | 
						|
 | 
						|
			public float stepProgress { get; private set; }
 | 
						|
			public Vector3 stepFrom;
 | 
						|
			public Vector3 stepTo;
 | 
						|
			public Quaternion stepFromRot = Quaternion.identity;
 | 
						|
			public Quaternion stepToRot = Quaternion.identity;
 | 
						|
			private Quaternion footRelativeToRoot = Quaternion.identity;
 | 
						|
			private float supportLegW;
 | 
						|
			private float supportLegWV;
 | 
						|
 | 
						|
			public Footstep (Quaternion rootRotation, Vector3 footPosition, Quaternion footRotation, Vector3 characterSpaceOffset) {
 | 
						|
				this.characterSpaceOffset = characterSpaceOffset;
 | 
						|
				Reset(rootRotation, footPosition, footRotation);
 | 
						|
                footRelativeToRoot = Quaternion.Inverse(rootRotation) * rotation;
 | 
						|
            }
 | 
						|
 | 
						|
			public void Reset(Quaternion rootRotation, Vector3 footPosition, Quaternion footRotation) {
 | 
						|
				position = footPosition;
 | 
						|
				rotation = footRotation;
 | 
						|
				stepFrom = position;
 | 
						|
				stepTo = position;
 | 
						|
				stepFromRot = rotation;
 | 
						|
				stepToRot = rotation;
 | 
						|
				stepToRootRot = rootRotation;
 | 
						|
				stepProgress = 1f;
 | 
						|
			}
 | 
						|
 | 
						|
			public void StepTo(Vector3 p, Quaternion rootRotation, float stepThreshold) {
 | 
						|
                if (relaxFlag)
 | 
						|
                {
 | 
						|
                    stepThreshold = 0f;
 | 
						|
                    relaxFlag = false;
 | 
						|
                }
 | 
						|
 | 
						|
                if (Vector3.Magnitude(p - stepTo) < stepThreshold && Quaternion.Angle(rootRotation, stepToRootRot) < 25f) return;
 | 
						|
                stepFrom = position;
 | 
						|
				stepTo = p;
 | 
						|
				stepFromRot = rotation;
 | 
						|
				stepToRootRot = rootRotation;
 | 
						|
				stepToRot = rootRotation * footRelativeToRoot;
 | 
						|
				stepProgress = 0f;
 | 
						|
			}
 | 
						|
 | 
						|
			public void UpdateStepping(Vector3 p, Quaternion rootRotation, float speed, float deltaTime) {
 | 
						|
				stepTo = Vector3.Lerp (stepTo, p, deltaTime * speed);
 | 
						|
				stepToRot = Quaternion.Lerp (stepToRot, rootRotation * footRelativeToRoot, deltaTime * speed);
 | 
						|
 | 
						|
				stepToRootRot = stepToRot * Quaternion.Inverse(footRelativeToRoot);
 | 
						|
			}
 | 
						|
 | 
						|
			public void UpdateStanding(Quaternion rootRotation, float minAngle, float speed, float deltaTime) {
 | 
						|
				if (speed <= 0f || minAngle >= 180f) return;
 | 
						|
 | 
						|
				Quaternion r = rootRotation * footRelativeToRoot;
 | 
						|
				float angle = Quaternion.Angle (rotation, r);
 | 
						|
				if (angle > minAngle) rotation = Quaternion.RotateTowards (rotation, r, Mathf.Min (deltaTime * speed * (1f - supportLegW), angle -minAngle));
 | 
						|
			}
 | 
						|
 | 
						|
			public void Update(InterpolationMode interpolation, UnityEvent onStep, float deltaTime) {
 | 
						|
				float supportLegWTarget = isSupportLeg ? 1f : 0f;
 | 
						|
				supportLegW = Mathf.SmoothDamp (supportLegW, supportLegWTarget, ref supportLegWV, 0.2f);
 | 
						|
 | 
						|
				if (!isStepping) return;
 | 
						|
 | 
						|
				stepProgress = Mathf.MoveTowards(stepProgress, 1f, deltaTime * stepSpeed);
 | 
						|
 | 
						|
				if (stepProgress >= 1f) onStep.Invoke ();
 | 
						|
 | 
						|
				float stepProgressSmooth = RootMotion.Interp.Float(stepProgress, interpolation);
 | 
						|
 | 
						|
				position = Vector3.Lerp(stepFrom, stepTo, stepProgressSmooth);
 | 
						|
				rotation = Quaternion.Lerp(stepFromRot, stepToRot, stepProgressSmooth);
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 |