PDA

Voir la version complète : ID des points ..



clemz
19/06/2013, 14h38
Hello boyz n'girlz

j'ai une petie question au sujet des ID des points :

Lorsque je fais du morphing sur un perso, j'aime bien travailler les cibles de morphing sur une/des copie(s) externe(s) de mon perso , afin d'en supprimer une moitié de points pour ensuite mettre cette 1/2 dans un objet symétrie .. le problême est qu'après, même si j'édite ma symétrie et que donc je me retrouve avec un objet de même nombre de points que mon objet initial, je ne peux pas utiliser directement ce maillage symétrisé comme cible de morph car les IDs des points ont complètement changé.

ma question arrive donc ici : je voudrais me faire une petite moulinette ( coffee si possible ^^ ) pour venir modifier les IDs de ma cible en fonction de mon objet de ref ... comment qu'est-ce qu'on fait-on peut faire donc ? (j'ai deja une petite moulinette coffee pour venir snapper des points selectionnés d'un objet A vers B ( mais cela se base sur les IDs des points donc ça ne marche bien que si les objets ont la même structure à la base )
dans le tag morphing de c4d , on a cette petite moulinette 'selected to base' mais qui donc est limité car ne peut snapper que sur l'état de base et non n'importe quelle pose ..d'où l'utilité de ma moulinette (j'aime bien le mot moulinette hein :) )

donc tout ceci pour complémenter ma moulinette de snap , mais avec cette option d'abord de reconstruction des IDs de la cible.

Je me disais que l'utilisateur pourrait préciser quel(s) point(s)/ID de l'objet A se trouve sur l'objet B .. et de ce lien entre certains points , la moulinette en déduirait tous les vrais IDs des points en se basant sur la ref ... mais bon ^^ est-ce faisable ?
est-ce qu'on peut savoir quels points bordent un polygone par ex ?

donc concrêtement , sur notre objet A on selectionnerait 1 point ( ID n°32 par ex ) puis on selectionnerait son équivalent sur l'objet B ( mais dont l'ID serait différent : par ex ID n°47 ) .. le code enregistrerait donc que le point 32 deviendrait 47 .
Mais après comment aller chercher les points adjacents et être sûr qu'il prend bien les équivalents ?

merki

clemz
19/06/2013, 15h03
ha j'ai retrouvé ça dans mes archives Coffee .. peut-être une(la) piste à suivre :

var opNpol = op->GetPolygonCount();
var opNpt = op->GetPointCount();

var opNorPol = new(array, opNpol); // Tableau des normales des polys
var opNorPt = new(array, opNpt); // Tableau des normales des sommets
var opPosPol = new(array, opNpol); // Tableau de la position des polys

var i;
for (i = 0 ; i < opNpol ; i++) {
var ptnA = op->GetPolygon(i)->a; // Indice du sommet
var ptnB = op->GetPolygon(i)->b;
var ptnC = op->GetPolygon(i)->c;
var ptnD = op->GetPolygon(i)->d;

var ptnAp = ptGlob(op, ptnA); // Position globale du sommet
var ptnBp = ptGlob(op, ptnB);
var ptnCp = ptGlob(op, ptnC);
var ptnDp = ptGlob(op, ptnD);

donc on viendrait chercher à quel indice/point du polygone, correspondrait le point selectionné sur l'objet A .. et sur l'objet B on essaierait de retrouver le polygone dont l'indice serait le même etc ?

clemz
19/06/2013, 15h59
autre question , je fais quelques tests là et je remarque que la lecture des 4 points (id) d'un polygones ( a, b, c et d ) se lit dans le sens horaire si la normal du polygone est bien dirigée vers l'extérieure .. est-ce toujours vrai ? si ça l'est , je peux peut-être me baser sur ce sens horaire pour aller cherche le bon point suivant :) ?

diego1968
19/06/2013, 17h39
Bon je ne te serai d'aucun secours…mais je vois que tu tiens bien la conversation :icon_mrgreen:

Bon courage pour tous ces points en suspens !:sweatdrop:

Ruben_S
19/06/2013, 17h58
Bof suffira de les remettre sur les i par la suite...
Aller viens Diego, on va se faire une pétanque...


:afro:

clemz
19/06/2013, 21h07
bon je crois que je vais faire comme ceci :
on définit 3 selections d'un seul point sur l'objet A et la même chose sur l'objet B . ( donc ces 3 selections définissent les 3 mêmes points biensur ).
Ces 3 points doivent être sur un même polygone . ceci définit la zone de départ du calcul : on cherche quel polygone contient ces 3 points au moins ce qui nous donne le polygone de départ , et donc (si c'est un quadrangle ) le 4ème point .. ces 4 points , d'un certain ID redéfinissent les ID des 4 points équivalents sur la cible (on ne modifie pas les IDs en fait mais on crée un 2ème tableau d'IDs en associant les IDs de A à celles de B ) .. après on répète cette manip au polygone adjacent qui contient point 1 et 2 exactement ..on trouve alors les 4 points de ce nouveau polygone .. on remplit le tableau des IDs .. on recherche le polygone contenant les nouveaux points 3 et4 ( donc l'autre coté de ce dernier polygone ) ..etc on avance en ligne droite jusqu'à qu'il n'y ait plus de polygones/points ou que l'on retombe sur notre 1er polygone de départ ( on aura fait un loop ) .. on passe alors au polygone adjacent du 1er polygone , mais contenant point 2 et 3 ..etc ..

enfin si vous avez des idées pour être sur d'aller chercher tous les polygones sans en oublier , je suis preneur .. ma bidouille là devrait fonctionner sur des formes avec que des quadrangles mais bon peut être que j'oublie un truc super important :P

valkaari
20/06/2013, 01h08
j'aurais tendance à penser que plutôt que de sélectionner un point et cherche le/les poly qui possèdent ce point (sachant qu'un point peut appartenir à plusieurs polygones voir ne devrait jamais appartenir à un seul poly dans ton cas), pourquoi ne pas directement sélectionner un poly dans tes deux formes.

Du coup avec ce poly tu as 3 ou 4 points. Tu as des fonctions qui en donnant un poly et deux points te donne le poly de l'autre coté.

Du coup tu progresses de cette manière en passant de poly en poly en utilisant les arrêtes (deux points). Faut juste faire un test pour savoir si le point c et d sont confondu (ce qui est le cas dans les triangles) pour ne pas chercher le poly qui est de l'autre coté de l'arrête cd (qui n'existe pas)

bon après, ces fonctions ne sont peut être pas présentes en coffee (cette grosse bouze)


Sinon oui, l'ordre des points a,b,c,d déterminent le sens de la normale.

edit :
pour faire plus simple, tu veux créer un objet C avec les ID des points de l'objet A mais les coordonnées des points de l'objet B (qui n'ont pas le même ID)

clemz
20/06/2013, 10h00
merci Val :)

oué Coffee est surement tres nul mais je ne connais que lui en prog ( et encore connaitre est un bien grand mot ^^ ) .. si j'ai les outils de base pour y arriver je vais tenter en coffee d'abord , mais un jour... je passerai au python :)

merci pour idées et confirmation du sens horaire pour définir la normale . Par contre je ne comprends pas bien ta méthode en sélectionnant des polys au lieu de points (comment être sur après de partir dans le bon sens dans le calcul ? qu'est ce me dit que le point 'a' du polygone selectionné sur l'objet A sera le "même" que sur l'objet B ? peut-être qu'il va lire sur le poly de A : a->b->c->d mais sur B il va lire b->c->d->a ? enfin un truc déclallé dans le sens horaire ?

oui ton résumé est exact :) . je trouve ça abérrant qu'il n'existe pas d'outil pour normaliser des IDs comme ça .. à moins que j'ai loupé une commande bien planquée dans c4d ..c'est possible aussi ^^

valkaari
20/06/2013, 17h33
ha vi effectivement à moins de faire en sorte que le poly et les 4 premiers points soient correct et dans le bon ordre.

Mais puisque tu n'as pas les mêmes IDs et ni les mêmes positions, c'est un peu hard de savoir qui est où.

A moins que tes UVs soient elle correct dans les deux cas. Du coup tu pourrais pour chaque point, récupérer les coordonnées uvs et chercher dans l'ancien objet à quel point elle correspond.

Ce qui représente beaucoup de "test" et de calculs si tu ne fait rien pour optimiser. (bsdtree par exemple)

clemz
20/06/2013, 17h55
en fait deja pour les Uvs comme dans mon utlisation c'est pour utiliser des objets qui ont été coupés en 2 puis symétrisés , ça veut dire que j'ai les uvs qui se superposent :S ..
mais en fait après réflexion je voudrais pousser le truc de la sorte que l'on puisse même utiliser un objet avec nombre de points différents ça serait chouette . je m'explique :

mon objet de ref A , j'en crée une copie B . Je supprime des points/polygones sur B pour alléger le maillage et dégager juste la zone à travailler en morphing . Et donc après je veux venir snapper une cible vide dans mon tag morph de A , sur mon objet B (ou une selection de points de B ) . Donc il me faut "seulement" lier dans un tableau les points restants de B avec les équivalents de A . on est un peu obligé de définir des points de départ sur A et B (ça c'est bon ça fonctionne pour l'instant ) et on vient tourner en sens horaire autour de ce polygone de départ pour chercher tous les points de B et les équivalent ID sur A . Après ma routine de snap est assez simple :

var ps = op->GetPointSelection();
var cnt = ps->GetCount();
var i = 0;
var found = 0;
for (i = 0; i < op->GetPointCount(); i++)
{
if (found >= ps->GetCount()) break;
if (ps->IsSelected(i))
{
op->SetPoint(i,target->GetPoint(i));
found++;
}
}

il me faudra juste remplacer le GetPoint(i) par un autre indice j qui fera le lien entre les IDs A et B

César Vonc
20/06/2013, 18h26
Je ne sais pas si j'ai bien compris, mais ça ne marcherait pas en faisant un dictionnaire du genre : dico[coordonnées du point] = indice du point ?

C'est néanmoins un peu lourd et demande un traitement pour convertir chaque coordonnée en un texte sans trop de chiffres derrière la virgule comme clef du dico, mais on aurait à priori une correspondance des points entre deux modèles.


Bon, si deux points ont la même position ça ne marche pas, certes !

valkaari
20/06/2013, 20h17
ha ben dans ton dernier exemple, ça serait un "copier/coller (en remplaçant)" de polys d'un objet à un autre.

mais en conservant l'indice des points pour que les morph fonctionnent -)


*cherche son fusil*


c'est quoi ton adresse déjà ?

César Vonc
20/06/2013, 21h31
Ah je crois que j'ai compris.

Enfin, sauf cette histoire de tourner autour du poly...


Si tu détaches des polys sélectionnés de ton maillage A qui deviennent ton maillage B, la correspondance des points est assez simple car l'ordre des indices des points sélectionnés reste le même, il y a juste les points non sélectionnés en moins.

Mais je suis peut-être hors sujet ?

clemz
21/06/2013, 11h03
hmm là c'est moi qui ne comprends pas :D . je veux bien une traduction pour les nuls stp !

sinon voila un résumé du principe :

diego1968
21/06/2013, 17h19
Si j'ai bien compris les morph dans C4D…on ne peut faire un morph qu'avec le même nombre de points…hors là tu supprimes une grosse partie de ton perso et de sa structure…du coup le morph par en sucette.:P

Quand j'étais sous Carrara (y a très longtemps) on pouvait faire des morph de partie d'un perso ou objet un peu comme sous Maya…mais C4D je pense pas qu'il sache faire cela :sweatdrop:

Mais peut-être que je suis passé à côté de quelque chose d'important durant tout ces années !:icon_mrgreen:

clemz
22/06/2013, 10h14
ouep c'est cela Didier :) . dès lors que tu surrpimes des points ou rajoutes aussi il me semble , ça chamboulle l'ordre des IDs des points .

bon je n'arrive pas à utiliser les tags selection de points .. il me donne accès à un objet mais pas au 'point' (enfin impossible d'en sortir un ID ou une position ) alors je passe par 3 nuls objets à snapper sur les 3 points que l'on choisit comme ref . Je cherche quel point est donc le plus proche après de chaque nul et j'ai donc mon trio de points (ID ) .

César Vonc
22/06/2013, 10h21
D'accord, je comprends mieux le soucis.


Je pense néanmoins qu'on peut ruser car il me semble que la symétrie ajoute les nouveaux points créés en fin de liste. Je n'ai pas C4D sous la main, peux-tu essayer ceci :

Supprimer la moitié de ton modèle initial, appliquer une symétrie, éditer (ça ne change rien visuellement mais devrait réorganiser l'ordre des points de ton modèle initial).

Ensuite reprendre comme tu fais d'habitude mais en cachant au lieu de supprimer, à l'étape 3.

clemz
22/06/2013, 10h30
salut César :) . oui oui en fait c'est deja ce que je fais : je supprime juste une moitié et masque éventuellement des zones sur la moitié restante .. mais après avoir édité la symétrie (même avant ) , les IDs ont changés .. si je fais glisser ça dans le morph tag , ça part en sucette .

je refais un test vite fait en images là

clemz
22/06/2013, 10h46
voila : donc dans les 2 cas on perd les IDs . enfin même si on voit apparaitre le morph sur le perso , ça bug sur pas mal de points du coté où l'on a supprimé les points pendant la créa du morph shape.

César Vonc
22/06/2013, 11h24
En fait je parlais de modifier ta base avant tout, en supprimant sa moitié puis symétrie, éditer, recréation de sa propriété Morph. Histoire d'avoir une nouvelle base avec un ordre de points différent.


Version schéma. : P

[Base] -> Supprimer moitié -> Symétrie -> Éditer -> Ajout propriété Morph

[Copie de base] -> Supprimer moitié -> Modifs de la bouche -> Symétrie -> Éditer -> Glisser dans la propriété Morph de [Base]

diego1968
22/06/2013, 11h40
Alors la methode marche (plus de cafouillage du maillage)…mais ne produit pas l'effet symétrie.

Il suffit alors de duppliquer le morph et d'inverser sur l'axe de symétrie (souhaité) et en suite de selectionner les 2 morph créés et de faire > clic droit >fusionner…et voilà cela fait un morph complet tout propre.

J'ai utiliser la méthode relative pour la création du morph …pas absolu :sweatdrop: (quand je glisse le maillage nouveau dans le gestionnaire de morph, il pose la question sur le choix que l'on veut)

J'espère que je suis clair :sweatdrop:

EDIT : Merci Vonc…tu es un maitre !:icon_boss::icon_love:

diego1968
22/06/2013, 11h53
Bon finalement Ca marche sans faire tout mon bordel.

En fait il faut conserver le tag morph sur l'objet copié (moi je l'avais supprimé :icon_mrgreen:) et là c'est parfait !

clemz
22/06/2013, 11h56
hmm ok je capte la méthode :) mais cela veut dire qu'on devrait faire tout son morphing sur un demi personnage ( donc avant de faire le skinning du squelette )
et par ex si mon client me demande des morphs additionnels après que le perso soit fini , on revient sur ces contraintes initiales là .

diego1968
22/06/2013, 12h03
Non pas besoin…une fois que tu as fait la phase 1 sur ton perso de base tu peu le skinner (enfin je suppose j'ai pas fait le test)
Car tu n'y touche plus après…

C'est seulement sur ta copie que tu dois refaire la manip de la symétrie, c'est pour cela que je pense que la méthode en relatif doit mieux fonctionner …mais bon faut faire un test avec un truc rigger :sweatdrop:

César Vonc
24/06/2013, 11h25
Oui, une fois que tu as fait la manip symétrie sur l'objet de base, il est bon pour de bon tant que tu ne créés pas de nouveaux polys dessus.

clemz
24/06/2013, 20h23
hmm ok :) . mais j'imagine que c'est pour du python ce genre de manip UVs ? :D ( j'y connais rien )

sinon bon j'avance tout doucement dans mon code coffee :
normalisation IDs test (http://kiteclem35.free.fr/3D/C4D/Normalize%20ID.mov) 8mo

donc dans la vid : j'ai 2 cubes un peu découpés , de même nombre de points mais dont 1 qui a eu un coté supprimé puis reconstruit via un objet symétrie donc . Au final on a donc 2 ordres de points différents, sur les objets ref et target. Donc si je snap directement ma sélection de points sur les équivalents de ma target , ça part en sucette comme on peut le voir car chaque ID de point de mon objet Ref recherche son ID correspondant sur l'objet Target... c'est pas bieeeeennnnnn !
Pour corriger ça, j'associe donc les anciens ID ( objet Ref ) avec les 'bons' de l'objet target , en me servant des 3 nuls objets 'helpers' qui doivent impérativement définir 3 points du même polygone sur la ref et la target . le script se base sur leur lien avec les IDs des points de chaque objet en les associants dans un tableau .
Il me reste à venir étendre cette recherche maintenant aux polygones voisins ..
(biensur ça marche avec un pose morph tag sur l'objet Ref .. c'est le but ! pouvoir snapper les points sur une cible de morph externe directement sur une pose dans le tag )

clemz
29/08/2013, 14h52
bon faut pas se prendre la tête ! Keith Young avait déja fait un plugin pour ça il y a longtemps ^^ :

http://skinprops.com/morphmill/index.htm
http://skinprops.com/download.php?view.68

25$ seulement ! ça va me sauver la vie ça .. Démo testée et approuvée ! vendu !



" ..merde .. quand même ! .. "