Bonsoir,
Comme on dit, on est jamais mieux servi que par soi-même ; après avoir cherché sans succès un simple gestionnaire de coordonnées UV, je me suis lancé dans sa création et vous propose une première bêta publique !
Les outils pour BodyPaint sont visiblement très demandés, je pense donc agrémenter ce module avec toute suggestion ou idée concernant l'édition d'UV.
Le code sera très probablement ouvert étant donné que la modification d'UV se fait en C++, et n'étant pas très à l'aise avec, j'ai quelques doutes sur la propreté de mon code. Je le posterai d'ici peu pour solliciter l'aide des spécialistes.
Concernant le module, il est compatible pour Windows 7 32 et 64 bits, R13+. N'hésitez pas à me signaler les éventuels problèmes rencontrés, les améliorations souhaitées ou vos idées d'outils UV.
Màj : Compatible pour Mac 32 et 64 bits.
Dernière modification par César Vonc ; 27/03/2014 à 12h06.
Ok, testes en approche
Merci César
My Blog □ Accepter une possibilité, c'est lui permettre de se réaliser ...
BanMa vitrine
Haha yes ! . je sents que UVlayout n'a qu'à bien se tenir !
Hop, le module est maintenant dispo pour Mac, merci à xs_yann qui a pu me le compiler ! ^^
Je travaille sur un outil permettant d'appliquer un lissage sur une sélection de points/polygones UV.
En revanche, je ne vois pas comment faire d'outil pinceau ni même quoi que ce soit que l'on puisse cliquer en temps réel pour modifier les UV. Je me demande si c'est d'ailleurs possible de récupérer ne serait-ce que la position du curseur sur la vue UV.
Oui, une brosse aurait vraiment été chouette, malheureusement je n'ai pu faire qu'une commande qui adoucit les points sélectionnés.
En revanche, je n'arrive pas à faire un simple tableau avec une taille fixe en C++, je fais pourtant :
Mais il me dit que _nbPols n'est pas une constante. Peut-on donc la convertir en constante ? Je ne trouve que des exemples avec des chiffres, sur la toile et :Code PHP:
LONG _nbPols = tempUV->GetPolyCount();
Vector _tab[_nbPols];
Ne marche pas plus.Code PHP:
const LONG _nbPols = tempUV->GetPolyCount();
salut
je pense que tu doit te diriger vers les " dynamic array "
Vas voir la il parle des dynamic Array
le post date un peu mais je pense que c 'est une bonne piste
paspas
Salut,
En C++ il existe différents types de tableaux :
Tableau statique :
Ici l'espace mémoire sera alloué sur la pile ou stack (avec les fonctions et variables de ton programme) au lancement de ton programme. La taille de l'espace à allouer doit donc être connu à la compilation (d'où le fait que la taille doit être une constante).Code PHP:
int tabPile[10];
Tableau dynamique :
Ici l'espace mémoire sera alloué sur le tas ou heap. En gros tu demandes, à l'execution, un espace mémoire de la taille de ton choix et dont tu as le contrôle (il ne faut pas oublier de désallouer cet espace mémoire quand tu n'en a plus besoin).Code PHP:
int* tabTas = new int[10];
delete [] tabTas;
De manière générale, en C++, on conseille d'utiliser la STL. Le conteneur le plus utilisé est le vector :
Exemple de vector : http://www.cplusplus.com/reference/vector/vector/begin/Code PHP:
std::vector<int> tabVector(10);
Tu as aussi à ta disposition liste, file, pile, tableau associatif, etc : http://www.cplusplus.com/reference/stl/
Pour finir, les GeDynamicArray du SDK dont paspas parles ; ne les ayant jamais utilisés je te laisse te référer au lien de paspas et au SDK.
Bon courage.
Dernière modification par xs_yann ; 05/05/2013 à 12h17.
Eh bien, ça c'est de la réponse !
Donc si je comprends bien, pour créer un tableau dont la taille est connue au dernier moment, le plus simple est d'utiliser std::vector puis la fonction push_back() pour ajouter une case à chaque fois.
Merci à vous !
Oui voilà. Et pour le parcourir tu as plusieurs méthodes. Il est recommandé d'utiliser les itérateurs autant que possible pour parcourir un container.
Tu peux aussi utiliser l'opérateur [] comme pour un tableau normal. Tu peux aussi utiliser vector::at, la différence étant que at lance une exception si la position passée en paramètre sort des bornes.
Tu as ici la liste des fonctions membre de la classe std::vector : http://www.cplusplus.com/reference/vector/vector/Code PHP:
#include <iostream>
#include <vector>
#include <stdexcept>
int main()
{
// On créé un tableau d'int
std::vector<int> tab;
// On le rempli
for (int i = 0; i < 10; ++i)
tab.push_back(i);
// Parcours avec iterateur
for (std::vector<int>::iterator it = tab.begin(); it != tab.end(); ++it)
std::cout << ' ' << *it;
std::cout << std::endl;
size_t size = tab.size();
// Parcours avec operateur []
for (int i = 0; i < size; ++i)
std::cout << ' ' << tab[i];
std::cout << std::endl;
// Parcours avec vector::at
try
{
for (int i = 0; i < size + 1; ++i)
std::cout << ' ' << tab.at(i);
std::cout << std::endl;
}
catch (const std::out_of_range& oor)
{
std::cerr << "Index out of range: " << oor.what() << std::endl;
}
return 0;
}
Autre chose de très puissant couplé aux conteneurs, ce sont les algorithmes de la STL : http://www.cplusplus.com/reference/algorithm/
Un exemple :
N'hésites pas à cliquer sur le nom des fonctions, il y a des exemple à chaque fois.Code PHP:
#include <iostream>
#include <vector>
// Retourne true is i est impair et false si i est pair
bool isOdd(int i)
{
return (i & 1);
}
int main()
{
std::vector<int> tab;
for (int i = 0; i < 11; ++i)
tab.push_back(i);
// Compte le nombre d'éléments impair dans le tableau
int result = count_if(tab.begin(), tab.end(), isOdd);
std::cout << "tab contains " << result << " odd values" << std::endl;
return 0;
}
Super, merci Yann pour toutes ces précisions, faut que ça rentre, maintenant. ^^
Et avec un petit using namespace std; en en-tête pour éviter d'écrire std:: à chaque fois, c'est le pied !
A utiliser en connaissance de cause : http://cpp.developpez.com/faq/cpp/?p...PACE_using_std
Je reprends ce projet après quelques temps afin d'y ajouter de nouvelles fonctions.
Outre le gestionnaire de coordonnées, le module sera doté de plusieurs commandes UV, pour lisser le maillage, adapter la taille de ses polys, ou bien les rendre égaux.
Étant donné qu'on ne peut pas créer d'outils pour cliquables directement dans la zone d'édition d'UV, j'ai commencé à voir comment créer ma propre zone d'éditions UV, qui servira à faire marcher des outils en temps réels, comme des pinceaux d'atténuation.
Je garantis rien, mais j'ai déjà pu dessiner quelques polys grâce à la classe GeUserArea, ce qui est plutôt encourageant !
Voici quelques images de l'avancement actuel et du fonctionnement des nouvelles commandes UV.
La commande Adapter ajuste la taille des polys UV pour qu'ils aient la même superficie que ceux du modèle 3D, le dépliage obtenu est ainsi plus uniforme.
La commande Égaliser est en quelque sorte l'inverse, elle rend les polys UV plus uniformes.
La commande Lisser et Poncer agissent comme les fonctions du même nom dans C4D. Elles permettent donc d'avoir un maillage UV moins anguleux.
Dernière modification par César Vonc ; 30/03/2014 à 14h46.
pfiou?? l'interface est magnifique!
kenavo !! // Pinterest KAMIGAZ®
J'achète !!!
J'en ai marre des restrictions de Bodypaint et du fait de devoir faire mes UV plus propre sous Blender puis ré-importer dans C4D.
D'ailleurs, ce qui serait pas mal c'est la partie interactive du dépliage UV de Blender (le côté "Live")…en tout cas Chapeau à vous et merci pour votre apport si précieux à la communauté
http://dr-graphix.blogspot.com/-DRG Design / Portfolio
Je suis de très près
My Blog □ Accepter une possibilité, c'est lui permettre de se réaliser ...
Cela donne vraiment envie .
A fait d'énormes progrès pour se rapprocher du radiateur
ha oué ton interface est chouette . Donc en fait comme on en discutait en mp , l'intérêt principal (pour moi ) est d'avoir un effet dégradé et non sur tous les polygones ( même si c'est déja super ) car c4d le fait déja en mode LSCM et ABF ( certes pas tous tes modes là ).
Par ex , j'ai un perso déplié comme tu as là , mais je modifie un peu sa topologie sur le visage en rajoutant/supprimant/bougeant des points etc , donc ça me met le boxon dans mon dépliage et je veux juste réajuster cette zone mais sans toucher le reste qui est normalement bon .. C'est là qu'une petite brosse ou autre truc de relax/smooth en dégradé à partir d'un point par ex pourrait être super utile
bon curage !!
Merci !
Oui, c'est bien ce que j'avais en tête, Clemz. ; )
J'ai pu créer une petite brosse pour peindre une sorte d'influence dans la zone d'édition, ce qui permettra d'affecter l'intensité des commandes de façon progressive.
Manque plus que d'affecter l'ID des points aux pixels de la zone pour récupérer cette valeur, et ça devrait le faire.
Côté programmation, j'ai juste un peu peur que ce ne soit pas très précis, j'ai l'impression qu'on est limité à du 8 bits par composante avec BaseBitmap et GeClipMap, ce qui ne donnera que 256 niveaux d'influence.
Un vrai petit bijou ton module cesar, je bavais déjà un en regardant les tutos de 3Ds avec leur smoothUV.
C'est vraiment génial
Très impressionnant .
Lâche pas le morceau !
÷ R19 Studio ÷ cacahuètes ÷
ha oué nickel ! ça prend bonne tournure
bien joué chef !
Je suis attentivement et avec beaucoup d'intérêt car je suis pour l'instant fâché avec les UV map.
"Less is more" comme disait Ludwig Mies van der Rohe. Et il a fichtrement raison !
salut salut,
je viens de regarder les screenshots de la poitrine de ta femme ( le mapping, hein ! )
et je crois que ça peut résoudre mon problème
comment faire pour participer à ta beta?
Expert en l'art de ne jamais finir mes WIPs persos
Ça avance ! Le pinceau d'atténuation est désormais opérationnel.
Il reste cependant un millier de choses à faire et bogues à résoudre, mais ça fait quand même plaisir de voir que ça fonctionne déjà un peu.
Je récapitule les fonctions souhaitées :
- Brosse progressive pour les outils (en cours).
- Redresser les polys en une grille bien droite pour les maillages réguliers (si j'ai bien compris, Aurety).
- Grille déformante interactive (rien que ça. : P)
- Brosses applicables également sur l'objet 3D (possible, mais long).
- Rotation quantifiée et aimantée sur d'autres points (si j'ai bien compris, Clemz).
- Redresser les routes courbées.
Si vous en avez d'autres, n'hésitez pas.
Miroof : Pour l'instant, le module n'est pas présentable à cause des nouvelles fonctions encore instables, je t'enverrai un MP en temps voulu en fin de semaine, si tout se passe bien.
Une fois finalisé si tu vends ton plugin il aura du succès.
Je suis avec grand intérêt.
A fait d'énormes progrès pour se rapprocher du radiateur
Magnifique César !
- N'oublie pas le mode symétrie sur les outils, on définit un axe, une sélection d'arête et on active le mode symétrie
kenavo !! // Pinterest KAMIGAZ®
Il y a des grosses bêtes sur le fofo
Yaya. °) Je suis de près aussi
Les détails font la perfection, et la perfection n'est pas un détail.http://yayaprodtm.cgsociety.org/
LdV.
En tout cas moi je suis client direct, car depuis que je suis passé à C4D l'édition d'UV c'est vraiment le gros point noir.
Dans certains cas comme Diego avec blender il m'arrive encore de rouvrir ma vieille version de Max juste à cause de ça.
Et j'aimerai ne plus avoir à remettre le nez dans ce soft .
Et au chapitre des doléances
, est ce qu'il serai envisageable d'avoir un placement de l'axe de transformation à la souris, ou au moins un retour visuel dans la zone d'édition ?