Domanda

Ho 2 punti in X, Y + rotazione e devo calcolare una spline bezier (una raccolta di beziers quadratiche) che collega questi 2 punti uniformemente. (Vedi foto) Il punto rappresenta un'unità in un gioco che può ruotare lentamente. Quindi, per andare dal punto A al punto B, deve prendere un lungo percorso. La foto allegata mostra piuttosto un percorso sinuoso esageratamente, ma si ottiene l'idea.

alt text

Quali formule posso utilizzare per calcolare tale spline bezier?

È stato utile?

Soluzione

appena visto che ho frainteso la tua domanda. Non potresti usare un singolo spline Hermite cubi invece da quando si dispone di un punto di inizio e di fine e due indicazioni (tangenti)? Ci sono vincoli aggiuntivi?

Per calcolare le tangenti iniziale e finale basta usare la direzione di inizio e fine e li bilancia con la distanza tra i punti di inizio e di fine (e in aggiunta qualche altro fattore costante come 0,5 a seconda di come curve si desidera che il percorso sia). :

p0 = startpoint;
p1 = endpoint;
float scale = distance(p0, p1);
m0 = Vec2(cos(startangle), sin(startangle)) * scale;
m1 = Vec2(cos(endangle), sin(endangle)) * scale;

Io uso questo sistema di interpolare i percorsi macchina fotografica in un gioco su cui sto lavorando e funziona benissimo.

Altri suggerimenti

Come probabilmente sapete, ci sono infinite soluzioni, anche se si assume 2 punti di controllo.

Smoothing algoritmo utilizzando curve di Bézier , che risponde alle vostre trattasi (v equazioni di Bx(t) e By(t) in principio):

B x (t) = (1-t) 3 P 1x + 3 (1-t) 2 t P 2 + 3 (1-t) t 2 P 3 + t 3 P < sub> 4x

B y (t) = (1-t) 3 P 1A + 3 (1-t) 2 t P 2A + 3 (1-t) t 2 P 3y + t 3 P < sub> 4y

P 1 e P 4 sono endpoint, e P 2 e P 3 sono i punti di controllo , che si è liberi di scegliere lungo gli angoli desiderati. Se il punto di controllo è ad una distanza r lungo un angolo θ dal punto (x, y), le coordinate del punto sono:

x'= x - r sin (θ)

y'= y - r cos (θ)

(secondo il sistema di coordinate che hai usato-I pensare ho ottenuto le indicazioni a destra). L'unico parametro libero è r, che è possibile scegliere come si desidera. Probabilmente si desidera utilizzare

r = α dist (P 1 , P 4 )

con α <1.

Non mi ricordo dove l'ho preso, ma ho utilizzato in questo modo:

Vector2 CalculateBezierPoint(float t, Vector2 p0, Vector2 p1, Vector2 p2, Vector2 p3)
{
      float u = 1 - t; 
      float tt = t*t;
      float uu = u*u;
      float uuu = uu * u;
      float ttt = tt * t;

      Vector2 p = uuu * p0; //first term
      p += 3 * uu * t * p1; //second term
      p += 3 * u * tt * p2; //third term
      p += ttt * p3; //fourth term

      return p;
}

dove t è rapporto lungo percorso tra punti iniziale e finale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top