Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using RootMotion.FinalIK;
- using UnityEngine;
- public class IkScaler : MonoBehaviour {
- public enum SizeModifiertype { Strech, Scale}
- [Header("General Fields")]
- [SerializeField] VRIK ik;
- [SerializeField] SizeModifiertype sizemodifier;
- [SerializeField] float scaleDelayTimer;
- [Header("Apply Changes?")]
- [SerializeField] bool changeArmLength;
- [SerializeField] bool changeChestHeigth;
- [Header("ChestFields")]
- [SerializeField] float minimumHeightDifference = 0.2f;
- [SerializeField] float heightModifier;
- [Header("StrechOnly")]
- [SerializeField] Vector3 originalChestPosition;
- [SerializeField] Vector3 heightDirection;
- [Header("Arms Fields Scale")]
- [SerializeField] float _mlpModifier;
- [Header("Arms Fields Strech")]
- [SerializeField] bool changeUpperArm;
- [SerializeField] bool changeForeArm;
- [SerializeField] float scaleDistanceTreshHoldscaleDistanceTreshHold = 1.05f;
- [SerializeField] float handModifier = 0.5f;
- float distanceModifier;
- float heightDifference;
- float playerHeight;
- bool isRunningUserCheck;
- private void Awake()
- {
- if (ik == null)
- ik = GetComponent<VRIK>();
- //Wear Headset
- OVRManager.HMDMounted += DelayModifyBody;
- //Take off
- OVRManager.HMDUnmounted += HeadsetOff;
- InvokeRepeating("DelayModifyBody", 10f, 10f);
- }
- private void LateUpdate()
- {
- if(sizemodifier == SizeModifiertype.Strech) ModifyHandPositions();
- }
- void HeadsetOff()
- {
- Debug.Log("se saco el casco");
- }
- void DelayModifyBody()
- {
- CancelInvoke("ModifyBody");
- Invoke("ModifyBody", scaleDelayTimer);
- }
- void ModifyBody()
- {
- if (OVRPlugin.userPresent)
- {
- switch (sizemodifier)
- {
- case SizeModifiertype.Strech:
- if (changeChestHeigth) ChangeChestPosition();
- if (changeArmLength) ModifyHandDistance();
- break;
- case SizeModifiertype.Scale:
- if (changeChestHeigth) ScaleBody();
- if (changeArmLength) ModifyHandDistance();
- break;
- default:
- break;
- }
- }
- else Debug.Log("user not present");
- }
- void ChangeChestPosition()
- {
- //Debug.Log("ChestPosition");
- heightDifference = (ik.solver.spine.headTarget.position.y - ik.references.root.position.y) / (ik.references.head.position.y - ik.references.root.position.y);
- heightDifference -= 1;
- if (Mathf.Abs(heightDifference) > minimumHeightDifference)
- {
- var newPos = originalChestPosition + heightDirection * heightDifference * heightModifier;
- ik.references.chest.localPosition = newPos;
- Debug.Log(newPos);
- }
- }
- void ScaleBody()
- {
- Debug.Log("BodyScale");
- //Actual Scale / Model Scale
- heightDifference = (ik.solver.spine.headTarget.position.y - ik.references.root.position.y) / (ik.references.head.position.y - ik.references.root.position.y);
- ik.references.root.localScale = Vector3.one * heightDifference * heightModifier;
- }
- void ModifyHandDistance()
- {
- switch (sizemodifier)
- {
- case SizeModifiertype.Strech:
- float sizeF = Vector3.Distance(ik.solver.rightArm.target.position, ik.references.root.position) / Vector3.Distance(ik.references.rightHand.position, ik.references.root.position);
- sizeF *= handModifier;
- if (sizeF > distanceModifier) distanceModifier = sizeF;
- break;
- //This should happen after the object got scaled
- case SizeModifiertype.Scale:
- ik.solver.leftArm.armLengthMlp = 1 + transform.localScale.magnitude/2 * _mlpModifier;
- ik.solver.rightArm.armLengthMlp = 1 + transform.localScale.magnitude/2 * _mlpModifier;
- Debug.Log(1 + transform.localScale.magnitude / 2 * _mlpModifier);
- break;
- default:
- break;
- }
- }
- void ModifyHandPositions()
- {
- var rigthUpperdistance = ik.references.rightForearm.position - ik.references.rightUpperArm.position;
- var rigthLowerDistance = ik.references.rightHand.position - ik.references.rightForearm.position;
- if (changeUpperArm) ik.references.rightUpperArm.position += rigthUpperdistance * distanceModifier;
- if (changeForeArm) ik.references.rightForearm.position += rigthLowerDistance * distanceModifier;
- var leftUpperdistance = ik.references.leftForearm.position - ik.references.leftUpperArm.position;
- var leftLowerDistance = ik.references.leftHand.position - ik.references.leftForearm.position;
- if (changeUpperArm) ik.references.leftUpperArm.position += leftUpperdistance * distanceModifier;
- if (changeForeArm) ik.references.leftForearm.position += leftLowerDistance * distanceModifier;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement