14 [Tooltip(
"Number of samples that you want to iterate on.")]
16 public int StoredStabilitySamples = 60;
18 private Vector3 stablePosition;
19 public override Vector3 StablePosition
21 get {
return stablePosition; }
24 private Quaternion stableRotation;
25 public override Quaternion StableRotation
27 get {
return stableRotation; }
30 private Ray stableRay;
31 public override Ray StableRay
33 get {
return stableRay; }
50 private const float PositionStandardDeviationReset = 0.2f;
56 private const float DirectionStandardDeviationReset = 0.1f;
61 private const int MinimumSamplesRequiredToStabalize = 30;
66 private const float UnstabalizedLerpFactor = 0.3f;
72 private const float StabalizedLerpBoost = 10.0f;
76 directionRollingStats.Init(StoredStabilitySamples);
77 positionRollingStats.Init(StoredStabilitySamples);
88 positionRollingStats.AddSample(gazePosition);
89 directionRollingStats.AddSample(gazeDirection);
91 float lerpPower = UnstabalizedLerpFactor;
92 if (positionRollingStats.ActualSampleCount > MinimumSamplesRequiredToStabalize &&
93 (positionRollingStats.CurrentStandardDeviation > PositionStandardDeviationReset ||
94 directionRollingStats.CurrentStandardDeviation > DirectionStandardDeviationReset))
98 positionRollingStats.Reset();
99 directionRollingStats.Reset();
101 else if (positionRollingStats.ActualSampleCount > MinimumSamplesRequiredToStabalize)
104 lerpPower = StabalizedLerpBoost * (positionRollingStats.CurrentStandardDeviation + directionRollingStats.CurrentStandardDeviation);
107 stablePosition = Vector3.Lerp(stablePosition, gazePosition, lerpPower);
108 stableRotation = Quaternion.LookRotation(Vector3.Lerp(stableRotation * Vector3.forward, gazeDirection, lerpPower));
109 stableRay =
new Ray(stablePosition, stableRotation * Vector3.forward);