You run into this type of issue when you want to rotate in a specific direction, and Unity doesn't realize this.
When you tell Unity to Lerp/Slerp between two angles, it takes the shortest path. You are running into problems is when the shortest path is no longer in the direction you want to go. In your video, the bottom gizmo is rotating clockwise. For the first 180 degrees of rotation, the double-helix is rotating in the same way - clockwise. However, once the difference in rotation between the top and bottom gizmos is more than 180 degrees, the double-helix suddenly rotates 180 degrees counter-clockwise because that's now the shortest direction to go.
For example, if you tell Unity to Lerp a quaternion from 0 degrees to 179 degrees, it will move in the positive direction (clockwise, if you're looking at the Y axis), because that's the shortest path from 0 to 179. However, if you tell it to Lerp a quaternion from 0 degrees to 181 degrees, it will move in the negative direction (counter-clockwise, if you're looking at the Y axis).
If you're only rotating one axis, the easiest thing to do is track the rotation of each end as a single float, so that it doesn't wrap at 180/-180, and use Mathf.Lerp().
A highly simplified example:
[SerializeField] private Transform start; [SerializeField] private Transform mid; [SerializeField] private Transform end; float speed = 90; float startRotation = 0; float endRotation = 0; void Start() { startRotation = start.transform.localEulerAngles.y; endRotation = end.transform.localEulerAngles.y; } void Update() { endRotation += speed * Time.deltaTime; float midRotation = Mathf.Lerp(startRotation, endRotation, .5f); Debug.Log(midRotation); mid.transform.localEulerAngles = new Vector3(0, midRotation, 0); end.transform.localEulerAngles = new Vector3(0, endRotation, 0); } In this example, the endRotation value is always increasing and never wraps. This means that when we Lerp from startRotation to endRotation, we're always moving in the positive (clockwise) direction.
You need to store your rotation values separately rather than reading them from the transform each frame, or Unity may wrap them:
transform.localEulerAngles = new Vector3(0, 370, 0); Debug.Log(transform.localEulerAngles); //"(0.00, 10.00, 0.00)"