Quieres que el ángulo $\beta$ por el que la serpiente cambia su rumbo para quedar en un ángulo fijo $\beta_\text{max}$ . Yo separaría la detección de la fijación de la nueva rúbrica.
Dejemos que $\mathbf u$ sea un vector unitario que apunta en la dirección actual y $\mathbf u_\text{cursor}={\mathbf r_\text{cursor}-\mathbf r\over\|\mathbf r_\text{cursor}-\mathbf r\|}$ un vector unitario en la dirección del cursor en relación con la última ubicación del bloque. Entonces el cambio de dirección es demasiado grande si $\mathbf u\cdot\mathbf u_\text{cursor}=\cos\beta\lt\cos{\beta_\text{max}}$ .
Si el cambio de ángulo es lo suficientemente pequeño, proceda como antes. Si no, hay que girar $\mathbf u$ por $\beta_\text{max}$ hacia el cursor. Hay varias formas de hacerlo, pero creo que la siguiente es una de las más eficientes. Calcular el rechazo ortogonal $\mathbf v_\perp=\mathbf u_\text{cursor}-(\mathbf u\cdot\mathbf u_\text{cursor})\mathbf u$ . Ya tienes este producto punto del paso anterior. Entonces, la nueva dirección fijada vendrá dada por el vector unitario $$\mathbf u_\text{clamped}=\cos\beta_\text{max}\mathbf u+\sin\beta_\text{max}{\mathbf v_\perp\over\|\mathbf v_\perp\|}.$$ El seno y el coseno de $\beta_\text{max}$ puede, por supuesto, calcularse previamente.
El caso $\mathbf u_\text{cursor}=-\mathbf u$ es decir, el cursor está directamente detrás de la serpiente, necesitará un manejo especial. Tendrás que elegir una dirección -en el sentido de las agujas del reloj o en sentido contrario- y un plano para el cambio de rumbo. [ Adición Una posibilidad es guardar la rúbrica anterior más reciente $\mathbf u_\text{prev}\ne\mathbf u$ y utilizar $-\mathbf u_\text{prev}$ en lugar de $\mathbf u_\text{cursor}$ para calcular el cambio de dirección de la abrazadera en este caso. Eso hará que la serpiente gire de manera consistente con su cambio de dirección más reciente.