PDA

Voir la version complète : Fixation d'un objet sur un point, mais...



teg
17/12/2002, 12h03
J'ai une expression de fixation d'un objet sur un point, mais le soucis, c'est que j'aimerais que cet objet s'aligne sur les tangeantes du point en question... y a moyen de faire ca?

Voici l'expression que j'avais choppé dans les exemples des dynamics, il me semble :

main(doc,op)
{
var objectname = "Helix";
var objectpnt = 9;

var dest = doc->FindObject(objectname);
if (!op) return;
if (!instanceof(dest,PointObject)) return;

var p = dest->GetPoint(objectpnt);
var mg = dest->GetMg();

p = mg->GetMulP(p);

mg = op->GetMg();
mg->SetV0(p);
op->SetMg(mg);
}

Tengaal
17/12/2002, 20h34
Pour récupérer le vecteur tangent du point de la spline, il faut utiliser la fonction:

//on récupère les vecteurs des tangentes de tous les points de la spline :
var tableau_vecteurs=ma_spline->GetTangents();

var mon_point=0; // 1er point de la spline par exemple

// on récupère les 3 composantes de la tangente de mon_point
var tx=tableau_vecteurs[mon_point*3];
var ty=tableau_vecteurs[mon_point*3+1];
var tz=tableau_vecteurs[mon_point*3+2];

mon_objet->SetRotation(tx,ty,tz);


Sinon, il y a une autre fonction plus complexe à mettre en oeuvre car elle utilise la position décimale d'un point n'importe où sur la longueur de la spline (0.0 début à 1.0 fin), pour info c'est :
vecteur_tangente=ma_spline->GetSplineTangent(position (float), segment (int));

Par contre les plines primitives donnent souvent des tangentes très bizarres !
sans tenir compte des points de manipulation

teg
18/12/2002, 10h24
Tengaal, aurais-tu oublié que je ne comprends absolument pas grand chose aux lignes de code? je mets ca ou, ta fonction?

Tengaal
18/12/2002, 10h38
Excuse-moi Teg, j'ai donné une explication générale pour pouvoir l'adapter à des scripts persos.
Pour ton expression voilà ce que cela donnerait :

main(doc,op)
{
var objectname = "Helix";
var objectpnt = 9; //point d'attache de la spline

var dest = doc->FindObject(objectname);
if (!op) return;
if (!instanceof(dest,PointObject)) return;

//on récupère les vecteurs des tangentes de tous les points de la spline :
var tableau_vecteurs=dest->GetTangents();

// on récupère les 3 composantes de la tangente de objectpnt
var tx=tableau_vecteurs[objectpnt*3];
var ty=tableau_vecteurs[objectpnt*3+1];
var tz=tableau_vecteurs[objectpnt*3+2];

// on oriente l'objet accroché
op->SetRotation(tx,ty,tz);

var p = dest->GetPoint(objectpnt);
var mg = dest->GetMg();

p = mg->GetMulP(p);

mg = op->GetMg();
mg->SetV0(p);
op->SetMg(mg);
}

Je n'ai pas testé l'expression...

teg
18/12/2002, 10h52
Ca marche pas... enfin, pour etre plus precis, je n'y arrive pas...

j'peux pas t'envoyer ma scene, que tu jetes un oeil? C'est pas super urgent, mais ca me pose question...

Tengaal
18/12/2002, 14h05
Si bien sûr tu me l'envois sur mon mail tengaal@libertysurf.fr, je regarderais ça.

Tengaal
18/12/2002, 17h09
Je me suis planté grave sur ce problème de tangente et notamment sur la structure du tableau des tangentes, voici donc le script qui fonctionne ! :oops:

main(doc,op)
{
var objectname = "BG"; //ceci est le nom de la spline
var objectpnt = 1; //on veut s'accrocher au deuxième point de celle-ci

var dest = doc->FindObject(objectname);
if (!op) return;
if (!instanceof(dest,PointObject)) return;

//on prend les tangentes
var tangentes=dest->GetTangents();

//ce tableau contient 2 vecteurs tangente par point,
//la tangente droite et la tangente gauche
var left_tan=tangentes[objectpnt*2+0];//tangente droite du point
var right_tan=tangentes[objectpnt*2+1];//tangente gauche du point

//on convertit ce vecteur tangente en rotation avec VectorToHPB(vecteur)
// ainsi l'axe Z de op est dirigé sur la tangente du point concerné
op->SetRotation(VectorToHPB(left_tan)); //on utilise ici la tangente gauche

var p = dest->GetPoint(objectpnt);
var mg = dest->GetMg();

p = mg->GetMulP(p);

mg = op->GetMg();
mg->SetV0(p);
op->SetMg(mg);
}


Désolé pour cette erreur, merci TEG de m'avoir envoyé ta scène, ça m'a permis de voir où était l'erreur ! :oops:

lenogre
19/12/2002, 16h34
Avec le plug Chestnut, tu peux faire ça. Y a des exemples de scène pour expliquer ce plug qui n'est pas évident de prime abord.