Quieres que el ángulo β por el que la serpiente cambia su rumbo para quedar en un ángulo fijo βmax . Yo separaría la detección de la fijación de la nueva rúbrica.
Dejemos que u sea un vector unitario que apunta en la dirección actual y ucursor=rcursor−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.