PDA

Voir la version complète : première expression



parksto
23/09/2002, 09h01
bon, je vous fais aussi partager ma première expresssion qui permet de contraindre deux primitive sphère à rester en contact, même si elle sont changées de taille.


var grand, bigboulecontainer, littleboulecontainer, bigdiametre, littlediametre, posgrand, pospetit;
var finalx, finaly, finalz, finaltout, distance, distance1, coeff;

main(doc,op) {

var grand=doc->FindObject("grand");
var object=op->GetDown();
if (!grand) return;
if (!instanceof(grand,PrimitiveObject)) return;


var bigboulecontainer = grand->GetContainer();
var littleboulecontainer = op->GetContainer();


bigdiametre=bigboulecontainer->GetData(PRIM_SPHERE_RAD);
littlediametre=littleboulecontainer->GetData(PRIM_SPHERE_RAD);


posgrand=grand->GetPosition();
pospetit=op->GetPosition();

distance = bigdiametre+littlediametre;


distance1 = sqrt( floor(posgrand.x - pospetit.x)*floor(posgrand.x - pospetit.x) + floor(posgrand.z - pospetit.z)*floor(posgrand.z - pospetit.z) );

distance1 = sqrt( floor(posgrand.y - pospetit.y)*floor(posgrand.y - pospetit.y) + distance1*distance1);

coeff = distance / distance1;

finalx = (pospetit.x * coeff);
finaly = (pospetit.y * coeff);
finalz = (pospetit.z * coeff);
finaltout = vector(finalx,finaly,finalz);
finaltout += posgrand;

posgrand = vector(0,0,0);

op->SetPosition(finaltout);
grand->SetPosition(posgrand);

}


pour l'instant le problème est que ça ne fonctionne que si la grande boule est au centre.

pour l'essayer, il faut créer une scene avec deux boules, une petite avec l'expression et une grande au centre nomée "grand".

Tengaal
23/09/2002, 14h23
Bon aller, je vais encore mettre mon grain de sel !
Il y a plus simple, en utilisant les vecteurs...
Soit P1 le centre de la grande sphère de rayon R1
Soit P2 le centre de la petite sphère de rayon R2
v=P2-P1 représente donc le vecteur allant de P1 vers P2
on utilise cette direction en normalisant le vecteur: v=vnorm(P2-P1)
C'est à dire que v à une longueur de 1 et est dirigé de P1 vers P2.
Donc pour que les 2 sphères soient en contact permanent il faut:
distance (P1 à P2)=R1+R2 et le vecteur P1P2 dirigé selon v.
donc position P2=P1+v*(R1+R2).

On a donc le programme suivant:
var grand, bigboulecontainer, littleboulecontainer, bigdiametre, littlediametre, posgrand, pospetit;

main(doc,op)
{
var grand=doc->FindObject("grand");
var object=op->GetDown();
if (!grand) return;
if (!instanceof(grand,PrimitiveObject)) return;

var bigboulecontainer = grand->GetContainer();
var littleboulecontainer = op->GetContainer();

bigdiametre=bigboulecontainer->GetData(PRIM_SPHERE_RAD);
littlediametre=littleboulecontainer->GetData(PRIM_SPHERE_RAD);

posgrand=grand->GetPosition();
pospetit=op->GetPosition();

var v=vnorm(pospetit-posgrand); // direction grand vers petit (normalisé: longueur=1)
v=v*(bigdiametre+littlediametre); //direction*longueur

op->SetPosition(posgrand+v); // centre grande sphère+vecteur

}

Ainsi on peut déplacer les 2 sphères, elles restent toujours collées l'une à l'autre... :wink:

Designer
23/09/2002, 14h58
var grand, bigboulecontainer, littleboulecontainer, bigdiametre, littlediametre, posgrand, pospetit;

var bigboulecontainer = grand->GetContainer();
var littleboulecontainer = op->GetContainer();

Declaré les containers une fois suffit ;)

parksto
23/09/2002, 15h00
Bon aller, je vais encore mettre mon grain de sel !
ben c'est un peu pour ça que j'ai posté ça en fait :wink:

je ne comprend pas très bien "normaliser le vecteur" ni comment tu arrive à P2=P1+v*(R1+R2).

:oops:

Tengaal
23/09/2002, 17h04
Un vecteur définit une direction et une longueur, la norme d'un vecteur est sa longueur, en coffee par exemple vlen(v) renvoit la longueur d'un vecteur. Donc si on veut utiliser la direction du vecteur v et lui attribuer une longueur d:
v=vnorm(v); //la longueur du vecteur v vaut 1
vd=v*d; //le nouveau vecteur vd à dons la direction de v et la longueur de d.
Maintenant, une position dans c4d, c'est un vecteur qui part de l'origine du repère et qui va vers le point en question, donc si on a deux points P1 et P2, alors le vecteur qui va de P1 vers P2 est:
v=P2-P1; //ce qui signifie que P1+v donne la position de P2
Donc pour expliquer P2=P1+v*(R1+R2) :
P1 est la position du centre de la sphère "grande"
v est un vecteur dirigé de P1 vers P2 et d'une longeur de 1 unité
R1+R2 est la somme des rayons des 2 sphères (distance entre leurs centres)
Donc si on multiplie v*(R1+R2) on obtient un vecteur de longueur (R1+R2) et si on le fait partir du centre de la sphère "grande" alors on tombe forcément sur le centre de la deuxième sphère. :wink:

note: Samir à raison de le signaler, les valeurs de stockage des container sont déclarées 2 fois, et je ne l'avais pas remarqué :oops:

parksto
23/09/2002, 17h22
et ben merci beaucoup !
j'ai encore bien du chemin à faire en coffee, mais je suis motivé, c'est le principal ! :)

j'ai passé beaucoup de temps à mettre cette expression au point; je me suis acharné au debut avec une technique très lourde qui m'a fais beaucoup révisé de trigonometrie (y'a longemps que j'avais pas utilisé cos, sin tan et atan en si peu de temps !)
mais bon, quand on connais c'est si simple et rapide :D

Designer
23/09/2002, 18h50
note: Samir à raison de le signaler, les valeurs de stockage des container sont déclarées 2 fois, et je ne l'avais pas remarqué :oops:

*gg* C´est une honte! :lol:

parksto
05/11/2002, 15h57
j'ai essayé de refaire cette expression en Xpresso, mais je ne trouve pas d'équivalent à vnorm().

par contre, j'ai pu refaire la mienne facilement :

capture d'écran (http://www.chromo-zone.org/c4d/boules.gif)


le tout avec une expression vibration sur les boules, ça donne pas mal.

je ne peux pas enregistrer le fichier, je n'ai que la demo pour l'instant.

laurent tolito
05/11/2002, 16h04
aïe, aïe, aïe... j'ai mal au crâne... :shock:
heureusement que tout le monde n'a pas eu 2/20 comme moi au bac... :wink:

parksto
05/11/2002, 16h12
ça parait un peu compliqué, mais en fait ça fait peur pour pas grand chose. :)

laurent tolito
05/11/2002, 16h18
un peu comme avec les filles quoi... :roll:

parksto
05/11/2002, 16h21
ouais, sauf qu'avec les filles, c'est pas seulement au premier abord que c'est pas trop compéhensible, enfin, ça depend lesquelles :wink:

aïe, non pas sur la tête, chérie...

Colas
05/11/2002, 18h26
Ok mais s'il fallait taper des lignes de code pour simplifier les filles, ça se saurait


Aïe pas sur la tête non plus ma puce