1
0

MatchPlayerPositionAndCalibrate.cs 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. using System;
  2. using System.Collections;
  3. using Display;
  4. using UnityEngine;
  5. using UnityEngine.Serialization;
  6. using Valve.VR;
  7. namespace Tracking
  8. {
  9. public enum CalibrationMode
  10. {
  11. None,
  12. MatchOnly,
  13. AutoImmediate,
  14. AutoCountdown
  15. }
  16. public class MatchPlayerPositionAndCalibrate : MonoBehaviour
  17. {
  18. public Transform player;
  19. public CalibrationMode calibrationMode;
  20. public CountdownDisplay countdownHud;
  21. [Header("Front Wheel")] public Transform frontWheelDesiredPosition;
  22. public FrontWheelTracker frontWheelTracker;
  23. [Header("Trainer Leg")] public Transform legDesiredPosition;
  24. public KineticLegTracker legTracker;
  25. [Header("HMD")] public bool calibrateHmd = true;
  26. public LookStraightDisplay lookStraightHud;
  27. public CameraTracker hmdTracker;
  28. public Transform bikeTransform;
  29. private Transform fwtTransform;
  30. private Transform legTransform;
  31. private Transform playerTransform;
  32. private SteamVR_TrackedObject fwTrackedObject;
  33. private SteamVR_TrackedObject legTrackedObject;
  34. private int matching;
  35. private bool autoSet;
  36. private void Start()
  37. {
  38. fwtTransform = frontWheelTracker.transform;
  39. legTransform = legTracker.transform;
  40. playerTransform = player.transform;
  41. fwTrackedObject = legTracker.GetComponent<SteamVR_TrackedObject>();
  42. legTrackedObject = frontWheelTracker.GetComponent<SteamVR_TrackedObject>();
  43. }
  44. public void Match()
  45. {
  46. matching = 1;
  47. }
  48. public void setDesiredToReal()
  49. {
  50. //TODO
  51. }
  52. private void MatchFrontWheel()
  53. {
  54. var dif = frontWheelDesiredPosition.position - fwtTransform.position;
  55. playerTransform.position += dif;
  56. StartCoroutine(HideFrontWheelTracker());
  57. }
  58. private void MatchLeg()
  59. {
  60. //The only way to match it now is by rotating
  61. var fwtPosition = fwtTransform.position;
  62. var fwtToDesiredLeg = legDesiredPosition.position - fwtPosition;
  63. var fwtToRealLeg = legTransform.position - fwtPosition;
  64. var dl2d = new Vector2(fwtToDesiredLeg.x, fwtToDesiredLeg.z);
  65. var dr2d = new Vector2(fwtToRealLeg.x, fwtToRealLeg.z);
  66. var angle = Vector2.Angle(dl2d, dr2d);
  67. playerTransform.RotateAround(fwtPosition, playerTransform.up, -angle);
  68. StartCoroutine(HideLegTracker());
  69. }
  70. private IEnumerator HideFrontWheelTracker()
  71. {
  72. yield return new WaitForSeconds(1);
  73. frontWheelDesiredPosition.gameObject.SetActive(false);
  74. frontWheelTracker.gameObject.SetActive(false);
  75. }
  76. private IEnumerator HideLegTracker()
  77. {
  78. yield return new WaitForSeconds(1);
  79. legDesiredPosition.gameObject.SetActive(false);
  80. legTracker.gameObject.SetActive(false);
  81. }
  82. private void Update()
  83. {
  84. AutoCalibration();
  85. DoMatching();
  86. }
  87. private void AutoCalibration()
  88. {
  89. if (calibrationMode == CalibrationMode.None || autoSet || !fwTrackedObject.isValid ||
  90. !legTrackedObject.isValid) return;
  91. //TODO: show tracker status
  92. if (calibrationMode == CalibrationMode.AutoCountdown)
  93. {
  94. var display = Instantiate(countdownHud);
  95. display.OnCountdownDone = () =>
  96. {
  97. Match();
  98. return "Calibrated!";
  99. };
  100. autoSet = true;
  101. }
  102. else
  103. {
  104. Match();
  105. autoSet = true;
  106. }
  107. }
  108. private void DoMatching()
  109. {
  110. if (matching == 1)
  111. {
  112. MatchFrontWheel();
  113. matching++;
  114. }
  115. else if (matching == 2)
  116. {
  117. MatchLeg();
  118. if (calibrationMode == CalibrationMode.MatchOnly || calibrationMode == CalibrationMode.None)
  119. {
  120. matching = 0;
  121. }
  122. else
  123. {
  124. matching++;
  125. }
  126. }
  127. else if (matching == 3)
  128. {
  129. legTracker.Calibrate();
  130. frontWheelTracker.Calibrate();
  131. matching = 0;
  132. DoLookStraightIfWanted();
  133. }
  134. }
  135. private void DoLookStraightIfWanted()
  136. {
  137. if (!calibrateHmd) return;
  138. var lookStraightDisplay = Instantiate(lookStraightHud);
  139. lookStraightDisplay.OnDone += OnLookStraightDone;
  140. var lTransform = lookStraightDisplay.transform;
  141. var newPos = bikeTransform.position + bikeTransform.forward * 1.4f;
  142. newPos.y = hmdTracker.transform.position.y;
  143. lTransform.position = newPos;
  144. }
  145. private void OnLookStraightDone()
  146. {
  147. hmdTracker.Calibrate();
  148. }
  149. }
  150. }