iOS: arrastrando objects a lo largo de paths curvos

Me estoy arrancando el pelo tratando de descubrir qué parece ser un problema muy fácil. Sé que muchas de estas cosas se han hablado tangencialmente, por lo que me disculpo si esto sobrepasa un terreno bien cubierto, pero no puedo encontrar nada específico para mi solución (créanme, he mirado).

Básicamente, quiero arrastrar un object / sprite a lo largo de una ruta curva pnetworkingefinida (no solo moverla, sino ARRASTRARLA). Piense en la cosa del "Deslizar para desbloquear" del iPhone, pero en lugar de simplemente arrastrar el control deslizante de izquierda a derecha, haga que la ruta sea un arco o una línea ondulada.

Mi pensamiento básico fue:

  • defina una ruta de bezier, establezca el object en el punto de inicio.
  • si se toca el object, verifique la detección de golpes en la ruta de bezier en touchMoved (o alguna function similar). si los toques permanecen en la ruta, avance el sprite a lo largo de la ruta hasta que finalice la ruta (en cuyo caso, la tarea finaliza) o el dedo del usuario sale de la ruta (en cuyo caso, el object debería volver al principio).

Nada de esto es trivial (al less, así es como parece). Por ejemplo:

  • Hacer la detección de golpe en un path Bezier es un dolor real, ya que realmente necesitas hacerlo en la parte acariciada, no en la porción de relleno. E incluso entonces, no puedo encontrar la manera de hacerlo en un path de cualquier ancho, solo en el path de 1 punto del Bezier.
  • Mover un object parcialmente a lo largo de una ruta ni siquiera parece posible: todos los methods de animation mueven al sprite a lo largo de toda la ruta. Además, hacer esto requiere que encuentres el punto en el path más cercano al toque del usuario, lo cual, si alguna vez has mirado esto implica matemáticas asombrosamente complicadas.
  • He pensado en usar cuerpos rígidos para ocupar todo el espacio EXCEPTO a la ruta, por lo que el object solo puede moverse en la ruta. Sin embargo, esto requiere la definición de cuerpos rígidos curvos, algunos de los cuales deben ser cóncavos. Callejón sin salida.

¿Estoy haciendo esto demasiado duro? No parece tan complicado. No necesito una solución completa, solo una nueva forma de pensar sobre esto y comenzar en la dirección correcta. Cualquier ayuda sería muy apreciada.

¿Qué tal esto?

  • Considera el Eje X de tu ruta de bezier.
  • Cada vez que el usuario toca o interactúa con la pantalla, solo mire la porción x del tacto
  • Mapa que X Coordine con su ruta y mueva el object a la position correcta.

Sí, estás haciendo esto muy difícil.

Tome la simplificación sugerida anteriormente (o en un círculo, línea, etc.) si funciona, o si realmente desea hacerlo contra una curva bézier, considere lo siguiente:

  1. Mira la definición de la curva bézier
  2. Lo que está buscando es definir una nueva position de object P 'desde una position actual P y un cambio en la position táctil D.
  3. Si reformula el P (x, y) original en términos de t (las curvas bézier son paramétricas), el problema se convierte en la cantidad de desplazamiento t que se debe agregar en function de D.
  4. Algo que involucre el diferencial del bezier fn en P podría ser una buena manera de hacerlo. Es decir, cuánto se habría agregado si la curva hubiera sido una línea recta que venía del punto P a lo largo de la curva.

EDITAR: Transición entre segmentos: si cada segmento tiene t en [0,1], entonces puede detectar t> = 1 y pasar al siguiente segmento, establecer P al final del segmento anterior y evaluar nuevamente el movimiento en relación a ese punto Puede que tenga que haber alguna heurística involucrada si tienes muchos puntos pequeños, etc.