Bézier, parfait antirouille

Répondre
Partager Rechercher
Bonjour, depuis longtemps je souhaiterais créer un type de courbe bien précis.

J'ai trouvé ceci (source):
Code:
vector getBezierPos( float s ) {
  list q = posList;
  integer nq;
  while ( (nq=llGetListLength(q)) > 1 ) {
        list q2 = [];
        integer k; for ( k=1; k < nq; k++ ) {
            vector p1 = llList2Vector(q,k-1);
            vector p2 = llList2Vector(q,k);
            q2 += (1-s)* p1 + s * p2;
        }
        q = q2;
    }
    return llList2Vector(q,0);
}
... permettant de créer une courbe de type linéaire (voir).
Pour une courbe de type Quadratique ou Cubique je n'ai rien trouvé ...
Parfaitement incapable de traduire ces formules mathématiques en LSL je suis bloqué ...
Cliquez ce bouton ou survolez le contenu pour afficher le spoiler
Welcome back le revenant

Dernière modification par djphil ; 14/09/2018 à 17h21.
Post
Bonjour,

oui ça m'intéresse mais sur SL mon crédit est de 0L$. Je suis sur OpenSim en fait ...

Dans un 1er temps j'aimerais quelque chose ressemblant à ceci:
Code:
vector getLinearBezierPos(float s) {
    ...
}

vector getQuadraBezierPos(float s) {
    ...
}

vector getCubicBezierPos(float s) {
    ...
}
... afin de comparer les résultats.

Dernière modification par djphil ; 15/09/2018 à 07h16.
C'est bien loin tout ça, j'avais bien creusé cette affaire mais c'était en... 2009...

Du coup j'ai tout oublié parce que d'autre choses multiples sont passées là dessus.

Si ça peut t'aider voilà la formule que j'avais écrite pour la spline hermite (cubique) :

vector hermite(float t, vector v1, vector v2, vector p1, vector p2)
{
return p1 * (2.0*t*t*t - 3.0*t*t + 1.0) + v1 * (t*t*t - 2.0* + p2 * (-2.0*t*t*t + 3.0*t*t) + v2 * (t*t*t - t*t);
}

Et comme j'avais aussi besoin de la tangente :

vector tangente(float t, vector v1, vector v2, vector p1, vector p2)
{
return p1 * (6.0*t*t - 6.0*t) + v1 * (3.0*t*t - 4.0*t + 1.0) + p2 * (-6.0*t*t + 6.0*t) + v2 * (3.0*t*t - 2.0*t);
}

Désolé de ne pas pouvoir t'aider d'avantage pour le moment...
Ouille ouille, bien compliqué tous ça ...
Merci pour les formules

Edit: j'ai modifié hermite comme ceci:
remplacer:
return p1 * (2.0*t*t*t - 3.0*t*t + 1.0) + v1 * (t*t*t - 2.0* + p2 * (-2.0*t*t*t + 3.0*t*t) + v2 * (t*t*t - t*t);
par:
return p1 * (2.0*t*t*t - 3.0*t*t + 1.0) + v1 * (t*t*t - 2.0*t*t) + p2 * (-2.0*t*t*t + 3.0*t*t) + v2 * (t*t*t - t*t);

Dernière modification par djphil ; 15/09/2018 à 16h33.
Citation :
Publié par djphil
Et bien et bien, hmmm hmmm, ça n'inspire pas grand monde ...
Cliquez ce bouton ou survolez le contenu pour afficher le spoiler
Ça t'étonne ?

Apparemment j'avais mal copié la formule, bizarre...

J'ai repris mon script et voilà la fonction :

vector hermite(float t, vector v1, vector v2, vector p1, vector p2)
{
return p1 * (2.0*t*t*t - 3.0*t*t + 1.0) + v1 * (t*t*t - 2.0*t*t + t) + p2 * (-2.0*t*t*t + 3.0*t*t) + v2 * (t*t*t - t*t);
}

J'ai vérifié la formule, c'est la bonne !
Oui ça m'étonne quand même un peu car il y a plus d'une personne compétente sur ce forum
Mais d'un autre côté je reconnais qu'il y a plus amusant que la trigonométrie dans la vie!

A quoi correspond la variable "t" dans ta fonction hermite ?
v1 et v2 pour les rotations et p1 et p2 pour les positions ... mais "t" ?
Est-ce ta fameuse tangente ?

PS: Si tu n'as pas trop le temps je peux patienter, je ne suis pas pressé.
Citation :
Publié par djphil
A quoi correspond la variable "t" dans ta fonction hermite ?
v1 et v2 pour les rotations et p1 et p2 pour les positions ... mais "t" ?
Est-ce ta fameuse tangente ?
Pas du tout...

rapport001.png

Pour définir la courbe il faut la position des deux extrémités (ici Po et P1) et les vecteurs tangents à ces deux points (ici Pu(0) et Pu(1)).

La variable u va de 0 à 1.

Dans ma formule les désignations sont différentes :

  • P1 => Po
  • P2 => P1
  • V1 => Pu(0)
  • V2 => Pu(1)
  • t => u
On a donc t qui peut varier dans l'intervalle [0,1].

C'est plus clair ?
Citation :
Publié par djphil
Oui c'est plus clair, mci
C'est particulier comme courbe ...
C'est surtout très pratique pour avoir une courbe vraiment adaptable. C'est pour ça que je m'en suis servi pour mon script de véhicule pour définir une trajectoire à partir de deux balises qui marquent les extrémités donc les deux positions et les vecteurs tangents (la direction des balises). On peut ainsi parfaitement s'adapter aux contraintes du parcours.
Je relisais ta doc hier et effectivement tous ces paramètres permettent de contrôler finement les courbes.
Dans mon cas, je ne penses pas avoir besoin d'autant de paramètres de réglage mais je peux me tromper.
Cliquez ce bouton ou survolez le contenu pour afficher le spoiler
Retour à la case départ, en mode reflexion
L'idée serait de tracer des graphs comme avec tweens, highcharts, google charts etc ...

tweens-splines.png

La fonction fournie au départ trace de très belles courbes mais !!! (il y a toujours un mais).
Si je place 3 points, 2 points seulement sont touchés par la courbe.
Le point entre les 2 autres ne l'est pas et j'aimerais juste qu'il le soit.
Il y a des similitudes effectivement, voir
return (2 * p1 - 2 * p2 + v0 + v1) * t3 + (- 3 * p1 + 3 * p2 - 2 * v0 - v1) * t2 + v0 * t + p1;

Dernière modification par djphil ; 13/10/2018 à 14h05.
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés