PDA

Voir la version complète : Projection UVW



César Vonc
30/12/2011, 19h03
Bonjour,

Suite à ce sujet (http://frenchcinema4d.fr/showthread.php?73703-Projection-personnalis%E9e) je tente depuis quelques jours de mettre au point un script COFFEE permettant de projeter le dépliage UVW d'un objet sur un autre, quelque soit leur maillage.

Après pas mal de remue-méninge et de ratés, voici une image du premier essai réussi :


http://img202.imageshack.us/img202/8074/projecperso.png


L'objet de base est le seul à être texturé, la texture des deux autres objets s'applique automatiquement via le script avec l'objet de base comme référence.


Il y a encore pas mal de contraintes et ne marche pour l'instant qu'en 2D. À terme, le script devrait fonctionner avec n'importe quel objet 3d !

clemz
31/12/2011, 14h21
César you rock ! :P

César Vonc
01/01/2012, 12h43
Petit soucis en Coffee : pour récupérer mes deux objets sélectionnés, je pensais à une boucle dans ce style :


main(doc, op)
{
var objets = new(array, 2);
var n = 0;

while (op) {
op = op->SearchNext(BIT_ACTIVE);
objets[n] = op;
n++;
if (n == 2) break;
}
}Mais lorsqu'on sélectionne plusieurs objets, op renvoie une valeur nulle et par conséquent la boucle while (op) ne se déclenche pas et quand bien même, il y aurait une erreur avec op->SearchNext(BIT_ACTIVE) si op est nul.
Y a-t-il une astuce pour éviter cela ?

clemz
01/01/2012, 13h06
salut César :)

j'avais fais un petit bout de code il y a 2 ans pour mon script de stéréocaméra , où justement on pouvait définir l'écart entre les cams en sélectionant 2 objets :

je copie colle direct la partie du code (donc tout n'est pas à prendre là pour toi :)



if(pick==1)
{

if(doc->GetFirstObject())
{
var ob0 = doc->GetFirstObject();
if(ob0->SearchNext(BIT_AOBJ))
{
var ob1 = ob0->SearchNext(BIT_AOBJ);
//println(ob1->GetName());
if(ob1->SearchNext(BIT_AOBJ))
{
var ob2 = ob1->SearchNext(BIT_AOBJ );
//println(ob2->GetName());
var d1m=ob1->GetMg();
var d1=d1m->GetV0();
var d2m=ob2->GetMg();
var d2=d2m->GetV0();
var Odist = vlen(d2-d1);
dist=Odist/2;
tag#ID_USERDATA:6=Odist/2;
}
}
}
tag#ID_USERDATA:23=0; // ma DU " pick " que je remets à 0
}

valkaari
01/01/2012, 16h40
peut être par là
http://frenchcinema4d.fr/showthread.php?71355-Boutons-Tags&p=943786&viewfull=1#post943786

César Vonc
01/01/2012, 16h57
Ah oui, clemz, tu initialises op avec GetFirstObject() de sorte à ce qu'il ne soit pas nul.


Dis donc, on s'embêtait un peu pour rien, j'ai l'impression !
Donc d'après xs_yann, c'est tout simplement :


var op0 = object(0); // Premier objet sélectionné
var op1 = object(1); // Second objet sélectionné
// Et ainsi de suite...Merci à vous !

clemz
02/01/2012, 09h12
Ah oui, clemz, tu initialises op avec GetFirstObject() de sorte à ce qu'il ne soit pas nul.


Dis donc, on s'embêtait un peu pour rien, j'ai l'impression !
Donc d'après xs_yann, c'est tout simplement :


var op0 = object(0); // Premier objet sélectionné
var op1 = object(1); // Second objet sélectionné
// Et ainsi de suite...Merci à vous !

haha :D oui effectivement !
merci pour le Val et Xs-yann

César Vonc
02/01/2012, 23h07
Je cherche maintenant à modifier les coordonnées d'un point en fonction de la rotation des l'axes XYZ de référence. Une image l'explique mieux :

http://img543.imageshack.us/img543/5541/coornorm.png

La fonction GetMulP() me paraît être l'idéal, sauf qu'il faut créer une matrice, et c'est là que je bloque.
Je n'ai pas trouvé comment créer une matrice à partir de rien, le SDK ne propose que objet->GetMg() pour récupérer celle d'un objet déjà existant.

Voici le code qui calcule A' en fonction A et du vecteur correcteur N. Tout a l'air de marcher correctement, sauf que je copie la matrice de l'objet op à défaut de pouvoir en créer une vierge, ce qui ne me paraît pas très propre ; peut-on y remédier ?


main(doc,op)
{
var mg = op->GetMg();
var m = mg;
var v1 = vector(10, 20, 20);
var nor = vector(0, 1, -1);
println("Entrée : ", v1);
println("Correction : ", nor);
nor = VectorToHPB(nor);
m->SetRotHPB(nor);
var v2 = m->GetMulP(v1);
println("Sortie : ", v2);
println("--");
}

oli_d
03/01/2012, 07h29
Tout a l'air de marcher correctement, sauf que je copie la matrice de l'objet op à défaut de pouvoir en créer une vierge, ce qui ne me paraît pas très propre ; peut-on y remédier ?Le COFFEE est un lointain souvenir pour moi, mais il me semble que tu peux créer une matrice vierge avec un new genre :


var m = new(Matrix);


En tous cas bravo pour le travail.

Aurety
03/01/2012, 08h42
Super pratique :icon_eek:

César Vonc
03/01/2012, 11h16
Ah ben oui, oli_d, tout simplement ! (Ça ne me réussit pas de bosser le soir...).


À présent je pense avoir tous les ingrédients pour passer ce script en 3D !



Pour ceux qui voudraient le script précédent en plus propre :


corrCoor(v1, nor) {
var m = new(Matrix);
nor = VectorToHPB(nor);
m->SetRotHPB(nor);
var v2 = m->GetMulP(v1);
return v2;
}

main(doc,op)
{
var v1 = vector(10, 20, 20);
var nor = vector(0, 1, -1);
var v2 = corrCoor(v1, nor);
}