public PredictionResult PredictCollision(SaberStateDto saber1, SaberStateDto saber2) { Vector3 intersectionPoint = Vector3.zero; Quaternion initialRotation1 = saber1.Pivot.rotation; Quaternion initialRotation2 = saber2.Pivot.rotation; Quaternion finalRotation1 = saber1.PivotFinalPositionAnchor.rotation; Quaternion finalRotation2 = saber2.PivotFinalPositionAnchor.rotation; bool collide = false; for (int i = 0; i < _settings.InterpolationSteps; ++i) { saber1.Pivot.rotation = Quaternion.Slerp(initialRotation1, saber1.PivotFinalPositionAnchor.rotation, (float)i / _settings.InterpolationSteps); saber2.Pivot.rotation = Quaternion.Slerp(initialRotation2, saber2.PivotFinalPositionAnchor.rotation, (float)i / _settings.InterpolationSteps); if (DoesSabersIntersects(new LineSegment(saber1), new LineSegment(saber2), out Vector3 newIntersectionPoint)) { intersectionPoint = newIntersectionPoint; collide = true; finalRotation1 = saber1.Pivot.rotation; finalRotation2 = saber2.Pivot.rotation; } } saber1.Pivot.rotation = initialRotation1; saber2.Pivot.rotation = initialRotation2; return(new PredictionResult(collide, intersectionPoint, finalRotation1, finalRotation2)); }
public LineSegment(SaberStateDto playerState) { StartPoint = playerState.BladeStart.position; EndPoint = playerState.BladeEnd.position; Vector = EndPoint - StartPoint; }