PDA

Voir la version complète : Aligner des objets sur une spline



padawa
06/12/2004, 21h26
Coucou me revoilou. :odile:

Bon j'avance dans mon petit projet de premier plug et j'arrive a un probleme (oui encore).
Je voudrais aligner des objets sur une spline (genre la fonction "Disposer")
Je pense que ce doit etre soit le fonction AlignToPathKey ou AlignToSplineKey.
Le probleme est que c'est deux fonction sont des classes et il n'y a pas d'exemple d'utilisation. J'ai réussi a créé un dossier avec mes objets, mais la je sais pas comment faire :oops:

Un petit peu d'aide serait bienvenue :prie:

Tengaal
06/12/2004, 22h11
Il te suffit d'examiner le code COFFEE de l'expression ChainSpline, dans la rubrique Xpresso -> Modélisation ... :wink:

padawa
06/12/2004, 22h45
Merci Tengaal :poucehaut:
J'aurais jamais pensé que tu laissais certain code accessible.
Apparemment j'y étais pas du tout. :mrgreen:
Je vais décortiquer ca.

padawa
07/12/2004, 00h57
Ok, j'ai réussi!
Mais je n'ai fais que copier une ligne.


position=courbe->GetSplinePoint(courbe->UniformToNatural(i*inter/longueur),1);

Aurait tu l'amabilité de la détaillé que je la comprenne mieux. :grin:

Merci :odile:

Tengaal
07/12/2004, 18h10
En cherchant chaque fonction dans la doc du SDK Coffee c'est très facile de comprendre. C'est facile avec la doc en version WinHelp puis qu'il y a un index avec une recherche auto par mot-clé.

GetSplinePoint(x,segment) :
"x" est une valeur entre 0 et 1 (0% et 100%) qui représente le placement sur la spline
"segment" est le numéro du morceau de la spline à utiliser, dans le cas où la spline est constituée de plusieurs tracés séparés.

Dans ma ligne de code x c'est "courbe->UniformToNatural(i*inter/longueur)"
UniformeToNatural(xx) retourne la position en mode de spline "naturelle", donc une valeur entre 0 et 1 (0% et 100%)

(i*inter) : "i" est une valeur variable, "inter" est un espacement.
si i=0 alors (i*inter)=0, donc on est en position 0% de la spline.
Si i est à son maximum tel que (i*inter)=longueur, alors on est à la position 1 (100%), à la fin de la spline.

Donc pour conclure, on calcul d'abord la longueur de la spline, ensuite quand on sait combien d'éléments on veut placer sur celle-ci, on en déduit "inter" (longueur/nombre_éléments).
"i" va donc varier de 0 à (nombre_éléments-1)
Ainsi chaque élément sera réparti sur la spline en utilisant l'algorithme "naturel", donc en ayant la même distance entre eux. :wink:

padawa
07/12/2004, 19h05
Merci,

Ce qui me troublait c'est l'imbrication de fonction, surtout le UniformToNatural. A ca se rajputé le fait que pour moi un segment était un bout de spline (du point 0 au point 1 par exemple), ce qui m'embrouille un peu la tete. Maintenant je comprend mieux. :prie:

Mais en fait j'ai besoin de faire une répartition selon la longueur de chaque "morceau" de spline. Donc en fait il me faut aussi l'inverse, c'est a dire connaitre la position du point sur la spline.
donc je fais un truc comme ca


var long_tmp=abs(vlen(lespoints[1]-lespoints[0]));//on calcul la longueur entre le point 0 et le point 1
var pos_tmp=long_tmp/longueur;//on divise le résultat par la longueur totale ce qui donne la position relative du point sur la spline

Je ferais ca en boucle pour connaitre chaque longueur de "morceau" de spline et positionnerai les objets en fonctions.
Il est evident que ce résultat serait faux s'il s'agit d'une spline avec des tangeantes, mais dans un premier temps je pars du principe que j'en aurait pas. On verra pour la version 2 :mrgreen:

Qu'en pense tu ? :?

A moins qu'il y est une fonction inverse a GetSplinePoint, je vois pas d'autre solution.

PS: je te prie de croire que je m'efforce de fouiller un maximum dans le SDK avant de poster. Mais il est vraiment pas évident :arg:

Majoul
07/12/2004, 23h11
Je comprends pas ce que tu cherche à faire, les explications de Tengaal sont très bien énoncés et claires, si tu cherche à récupérer les coordonnés des points réels de la spline, c’est la même chose que les polygones



Mon_point = Spline->GetPoint(indice du point) ;

padawa
07/12/2004, 23h56
Je comprends pas ce que tu cherche à faire,
Je vous le dit pas, vous allez me le faire en 2 temps 3 mouvements et je vais etre ecoeuré. :mrgreen: Je vous le dirai a la fin.
J'avais trouvé le GetPoint, mais cela donne les coordonnées, moi je veux savoir a quel valeur du GetSplinePoint tel point correspond.
Sachant que le premier point est a 0 de la spline et le dernier a 1, le sixieme par exemple a combien il est? 0,32 0,87? Comment le savoir?

En fait j'ai une spline avec x point. je veux pouvoir mettre sur le premier troncon de la spline 5 objets et sur un autre 10 objets.

Est ce que je suis plus claire :?

De toute facon quand j'aurai fini je vous montrerai tout mon code pour savoir si c'est bon. Vous allez pouvoir me casser en 8 :mrgreen: