Bonjour,
Ce topic m'as donné une idée : http://www.frenchcinema4d.fr/forum/i...?topic=21150.0
Je me suis rendu compte que l'array (répartition) n'était pas très pratique.
Pour faire une rotation de l'objet dans l'array, il est indispensable de modifié ses axes, il serait plus facile que l'array prenne en compte la rotation en mode "Objet".
Le but de ce wip serait donc d'ajouter cette fonction sous forme d'un plugin en C++.
Je vais donc commencer par essayer de re-programmer l'array de base de c4d puis d'ajouter ma fonction.
Je vais, pour l'instant, omettre les paramètres Amplitude, Frequency et Array Frequency, car je ne m'en suis jamais servi (et de toutes façon je ne sais pas comment les utiliser :roll
Le début :
Voilà l'objet, avec les paramètres qui vont bien :
(l'icone n'est pas bon, c'est celui de mon dernier plug, je verrais ça à la fin...)
L'objet édité :
Le code :
Peut-être qu'il y a une raison pour que l'array fonctionne qu'en mode axe, peut-être que ce que je vais faire n'est pas très utile, mais au moins c'est un bon exercice. :roll:Code:// xsArray.cpp #include "c4d.h" #include "c4d_symbols.h" #include "oxsarray.h" class xsArray : public ObjectData { public: virtual Bool Init (GeListNode *node); virtual BaseObject* GetVirtualObjects(BaseObject* op, HierarchyHelp* hh); virtual Bool Message(GeListNode *node, LONG type, void *t_data); static NodeData *Alloc(void) { return gNew xsArray; } }; Bool xsArray::Message(GeListNode *node, LONG type, void *t_data) // On ne devrait pas en avoir besoin { return TRUE; } Bool xsArray::Init(GeListNode *node) // Les valeures par défaut des paramètres { return TRUE; } BaseObject* xsArray::GetVirtualObjects(PluginObject* op, HierarchyHelp* hh) // C'est le gros du plug, c'est là qu'on va afficher les copies { BaseObject *ret = BaseObject::Alloc(Onull); return ret; } // be sure to use a unique ID obtained from www.plugincafe.com #define ID_XSARRAY 1022108 Bool RegisterxsArray(void) { // decide by name if the plugin shall be registered - just for user convenience String name=GeLoadString(IDS_XSARRAY); if (!name.Content()) return TRUE; return RegisterObjectPlugin(ID_XSARRAY,name,OBJECT_GENERATOR,xsArray::Alloc,"Oxsarray","xsarray.tif",0); }
La suite bientôt :odile:
j'applaudis des deux main et te félicite de cette initiative. L'array C4d est pas très pratique et la contrainte d'orientation est pénible.
On peut passer commande plugin ? :mrgreen:
Win 10 - R17 - www.nicolasverdon.fr
Y en a qui re-programme C4D...D'autres comme moi qui essaye de texturer des objets... :cry2:
:prie: :prie: :prie: excess_yann
Merci nikolas
Si tu veux mais pour l'instant mes plugins ne fonctionnent que sur mac, qu'un seul à la fois (sinon il y a des collisions d'ID :?) :roll:Envoyé par nikolas
Oui, enfin on a pas tous ce niveau là... :Envoyé par refresher's
http://img99.imageshack.us/img99/7207/prev3wd2.jpg
http://img152.imageshack.us/img152/9471/prev1mn7.jpg
Merci à vous de suivre
La suite (petite avancée) :
Avec un cube enfant :
Une fois édité :
Le code :
Ici les cubes clonés sont affichés mais il sont superposés avec le cube enfant donc invisibles.Code:#include "c4d.h" #include "c4d_symbols.h" #include "oxsarray.h" class xsArray : public ObjectData { public: virtual Bool Init (GeListNode *node); virtual BaseObject* GetVirtualObjects(BaseObject* op, HierarchyHelp* hh); virtual Bool Message(GeListNode *node, LONG type, void *t_data); static NodeData *Alloc(void) { return gNew xsArray; } }; Bool xsArray::Message(GeListNode *node, LONG type, void *t_data) { return TRUE; } Bool xsArray::Init(GeListNode *node) { BaseObject *op = (BaseObject*)node; BaseContainer *data = op->GetDataInstance(); data->SetReal(XSARRAY_RADIUS,250); // Valeur par défaut du rayon = 250 data->SetReal(XSARRAY_COPIES,7); // Valeur par défaut du nombre de copies = 7 data->SetLong(XSARRAY_MODE,0); return TRUE; } BaseObject* xsArray::GetVirtualObjects(PluginObject* op, HierarchyHelp* hh) { BaseObject *ret = BaseObject::Alloc(Onull); BaseContainer *data = op->GetDataInstance(); Real copies = data->GetReal(XSARRAY_COPIES); if(copies<2) return FALSE; LONG i; for(i=0;i<copies;i++) { if(!op->GetDown()) return FALSE; BaseObject *child = op->GetDown(); BaseObject *clone = static_cast<BaseObject*>(child->GetClone(NULL,NULL)); // Les objets sont des clones de l'objet enfant clone->InsertUnder(ret); } return ret; } // be sure to use a unique ID obtained from www.plugincafe.com #define ID_XSARRAY 1022108 Bool RegisterxsArray(void) { // decide by name if the plugin shall be registered - just for user convenience String name=GeLoadString(IDS_XSARRAY); if (!name.Content()) return TRUE; return RegisterObjectPlugin(ID_XSARRAY,name,OBJECT_GENERATOR,xsArray::Alloc,"Oxsarray","xsarray.tif",0); }
Prochaine étape : positionner les objets sous forme d'hexagone, d'octogone, etc (suivant le nombre de copies)
Il va y avoir un peu de maths (j'ai déjà un bout du code vu que j'ai re-programmé en partie la primitive N-side).
:odile:
tiens c'est une idée ça. La possibilité de cloner l'outil cloner de mograph :bave:
toutes formes possible et orientation à dispo?
Win 10 - R17 - www.nicolasverdon.fr
cloner l'outil cloner de Mograph ? je crois que c'est déjà possible, tu clique glisse ton "cloner" dans un autre "cloner"...
j'ai peux être pas tout compris.. en tout cas bonne initiative xs-yann :poucehaut:
ou je me suis mal exprimé aussi. Je voulais dire faire du XS-Array un truc similaire au cloner de Mograph. Je suis clair là? je suis pas sur... :mrgreen:Envoyé par ethylen
Win 10 - R17 - www.nicolasverdon.fr
Très belle initiative. :poucehaut:
Je ne comprends pas bien. Tu as mis des ID identiques sur tous tes plug IN en attendant d'en demander une définitive à plugincafe ?Envoyé par xs_yann
Ou il y a un autre problème ?
Après avoir codé tout ça je ne pense pas que la division de 360° et l'utilisation de sin et cos te pose un problème. :wink:Envoyé par xs_yann
Pourrais-tu également nous préciser les avantages à coder en C++.
On accède à quelles fonctions en plus par rapport au coffee de base ?
SMC fan.
Non non, mes ID sont différents mais il y a collision quand même :coup:Envoyé par Jean-Laurent
Pour les avantages à codé en C++, il y en a plusieurs.
Le premier c'est qu'en coffee tu ne peux pas faire des plugins objet comme celui-là, pour un tag tu ne peux pas toucher au gestionnaire d'attributs...
Les outils de C4d ont été programmés en C++, le SDK est beaucoup plus riche.
Le C++ est plus intéressant que le coffee : tu dois typer tes variables, il y a des pointeurs, des références, tu peux surcharger tes fonctions...
Bon maintenant avec le C++ tu dois compiler à chaque fois et tu dois avoir plusieurs versions pour mac et pc (après ça dépend si tu développe pour toi ou pour distribuer).
Le plug gratuit Duplicate de l'excellent Michael Welter (http://www.welter-4d.de/fplugs/freeplugins_en.html) fait déjà ça :
Duplication par rapport à un axe ou duplication linéaire.
J'ai l'impression que tu vas perdre ton temps là-dessus. Pa contre, si tu pouvais refaire Align Assistant, nous serions plusieurs à te vouer une reconnaissance éternelle !
Tout ce que j'écris est à prendre au 15e degré. Car comme dit le proverbe chinois : Quand le dragon d'or, le ragondin ; voilà qui devrait faire taire les critiques et me mettre à l'abri d'attaques frontales.
En plus le plug ne fonctionne plus en R10.Envoyé par xs_yann
Je n'ai jamais utilisé Align Assistant mais je vais regarder. :wink:
edit : miam, align assistant à l'air cool.
Voilà la suite :
Le code :
Ici j'utilise la fonction Vector* GetNSidePointCoord(int radius, int subdiv) qui va me renvoyer un tableau de vecteur avec toutes les positions des points.Code:#include "c4d.h" #include "c4d_symbols.h" #include "oxsarray.h" class xsArray : public ObjectData { public: virtual Bool Init (GeListNode *node); virtual BaseObject* GetVirtualObjects(BaseObject* op, HierarchyHelp* hh); virtual Bool Message(GeListNode *node, LONG type, void *t_data); static NodeData *Alloc(void) { return gNew xsArray; } }; Bool xsArray::Message(GeListNode *node, LONG type, void *t_data) { return TRUE; } Bool xsArray::Init(GeListNode *node) { BaseObject *op = (BaseObject*)node; BaseContainer *data = op->GetDataInstance(); data->SetReal(XSARRAY_RADIUS,250); data->SetReal(XSARRAY_COPIES,7); data->SetLong(XSARRAY_MODE,0); return TRUE; } Vector* GetNSidePointCoord(int radius, int subdiv) { #define RAD pi/180 Vector *coord = NULL; coord = new Vector[subdiv]; float angle = ((subdiv-2)*180.0)/subdiv; // S=(n-2)*180 coord[0] = Vector(radius,0,0); // Coordonnées du premier point coord[1] = Vector(-cos(RAD*angle)*radius,0,sin(RAD*angle)*radius); // Coordonnées du deuxième point float a1 = Deg(acos((-cos(RAD*angle)*radius)/radius)); float a2 = -(90-a1); // Angles utiles pour la suite LONG i; float a = a2; for(i=2; i<subdiv;i++) { a = (180-angle)+a; coord[i] = Vector(-sin(RAD*a)*radius,0,cos(RAD*a)*radius); // Boucle for avec la formule pour tous les autres angles } return coord; } BaseObject* xsArray::GetVirtualObjects(PluginObject* op, HierarchyHelp* hh) { BaseObject *ret = BaseObject::Alloc(Onull); BaseContainer *data = op->GetDataInstance(); Real copies = data->GetReal(XSARRAY_COPIES)+1; Real radius = data->GetReal(XSARRAY_RADIUS); if(copies<2)return FALSE; Vector* coord = GetNSidePointCoord(radius,copies); // Appel de la fonction LONG i; for(i=0;i<copies;i++) { if(!op->GetDown()) return FALSE; BaseObject *child = op->GetDown(); BaseObject *clone = static_cast<BaseObject*>(child->GetClone(NULL,NULL)); clone->SetPos(coord[i]); clone->InsertUnder(ret); } return ret; } // be sure to use a unique ID obtained from www.plugincafe.com #define ID_XSARRAY 1022108 Bool RegisterxsArray(void) { // decide by name if the plugin shall be registered - just for user convenience String name=GeLoadString(IDS_XSARRAY); if (!name.Content()) return TRUE; return RegisterObjectPlugin(ID_XSARRAY,name,OBJECT_GENERATOR,xsArray::Alloc,"Oxsarray","xsarray.tif",0); }
La suite c'est la rotation des objets. :odile:
Merci beaucoup pour ta réponse xs_yann.
C'est bien ce que je craignais.Envoyé par xs_yann
[/quote]
:bave: Tu me donnes envie de m'y remettre.Envoyé par xs_yann
Une autre petite question au passage. Sais-tu si il est possible de compiler avec devC++ ou microsoft est incontournable ?
Tant que tu y es comme tu as l'air bien parti tu nous fais le clone objet de Mograph demandé par nikolas dans la foulée.
Apparemment le plug de Lenogre en est une variante simplifiée.
SMC fan.
Moi je compile avec Xcode. Tu peux compiler avec devC++, CodeBlocks, Xcode, le terminal...Envoyé par Jean-Laurent
Pour le cloner MoGraph je ne pense pas mais je vais voir pour le plug de Lenogre, je le ferais sûrement après ça.
C'est ça que tu veux lenogre ?
En revanche en cochant "scale" c'est la scale qui est prise en compte (logique), ce ne serait pas mieux que ce soit la "Size"?
La suite :
Code:#include "c4d.h" #include "c4d_symbols.h" #include "oxsarray.h" class xsArray : public ObjectData { public: virtual Bool Init (GeListNode *node); virtual BaseObject* GetVirtualObjects(BaseObject* op, HierarchyHelp* hh); virtual Bool Message(GeListNode *node, LONG type, void *t_data); static NodeData *Alloc(void) { return gNew xsArray; } }; Bool xsArray::Message(GeListNode *node, LONG type, void *t_data) { return TRUE; } Bool xsArray::Init(GeListNode *node) { BaseObject *op = (BaseObject*)node; BaseContainer *data = op->GetDataInstance(); data->SetReal(XSARRAY_RADIUS,250); data->SetReal(XSARRAY_COPIES,7); data->SetLong(XSARRAY_MODE,0); return TRUE; } Vector* GetNSidePointCoord(int radius, int subdiv) { #define RAD pi/180 Vector *coord = NULL; coord = new Vector[subdiv]; float angle = ((subdiv-2)*180.0)/subdiv; // S=(n-2)*180 coord[0] = Vector(radius,0,0); coord[1] = Vector(-cos(RAD*angle)*radius,0,sin(RAD*angle)*radius); float a1 = Deg(acos((-cos(RAD*angle)*radius)/radius)); float a2 = -(90-a1); LONG i; float a = a2; for(i=2; i<subdiv;i++) { a = (180-angle)+a; coord[i] = Vector(-sin(RAD*a)*radius,0,cos(RAD*a)*radius); } return coord; } BaseObject* xsArray::GetVirtualObjects(PluginObject* op, HierarchyHelp* hh) { BaseObject *ret = BaseObject::Alloc(Onull); BaseContainer *data = op->GetDataInstance(); int mode = data->GetLong(XSARRAY_MODE); Real copies = data->GetReal(XSARRAY_COPIES)+1; Real radius = data->GetReal(XSARRAY_RADIUS); if(copies<2)return FALSE; Vector* coord = GetNSidePointCoord(radius,copies); LONG i; for(i=0;i<copies;i++) { if(!op->GetDown()) return FALSE; BaseObject *child = op->GetDown(); BaseObject *clone = static_cast<BaseObject*>(child->GetClone(NULL,NULL)); clone->SetPos(coord[i]); // Ici la rotation suivant le Mode Objet ou Axe if(mode==0) { if(coord[i].z>=0)clone->SetRot(Vector(-atan(coord[i].x/coord[i].z)+child->GetRot().x,child->GetRot().y,+child->GetRot().z)); if(coord[i].z<0)clone->SetRot(Vector(-atan(coord[i].x/coord[i].z)-pi+child->GetRot().x,child->GetRot().y,+child->GetRot().z)); } else { if(coord[i].z>=0)clone->SetRot(Vector(-atan(coord[i].x/coord[i].z),0,0)); if(coord[i].z<0)clone->SetRot(Vector(-atan(coord[i].x/coord[i].z)-pi,0,0)); } clone->InsertUnder(ret); } // Pour rendre l'objet enfant invisible op->NewDependenceList(); op->AddDependence(hh, op->GetDown()); op->TouchDependenceList(); return ret; } // be sure to use a unique ID obtained from www.plugincafe.com #define ID_XSARRAY 1022108 Bool RegisterxsArray(void) { // decide by name if the plugin shall be registered - just for user convenience String name=GeLoadString(IDS_XSARRAY); if (!name.Content()) return TRUE; return RegisterObjectPlugin(ID_XSARRAY,name,OBJECT_GENERATOR,xsArray::Alloc,"Oxsarray","xsarray.tif",0); }
En tout cas ça y ressemble beaucoup. :efface:Envoyé par xs_yann
Tu fais un mix de ton xsArray avec le deuxième et tu as presque le cloneur de Mograph. :wink:
Avec possibilité de cloner en ligne, en cercle etc ...
En changeant la taille, la rotation des objets etc ...
C'est facile, y'a plus qu'à. :mrgreen:
SMC fan.
Cool, j'ai de quoi m'occuper... :art:
Il faudrait quand même que je résolve ce problème d'ID que je puisse mettre à dispo des fichiers. :roll:
ça prend forme :poucehaut:
Win 10 - R17 - www.nicolasverdon.fr
Bravo ! Tu nous enterreras tous !
Tout ce que j'écris est à prendre au 15e degré. Car comme dit le proverbe chinois : Quand le dragon d'or, le ragondin ; voilà qui devrait faire taire les critiques et me mettre à l'abri d'attaques frontales.
il est plus jeune ça lui laisse une chance de plus :mrgreen:Envoyé par lenogre
:arrow:
Oui, ça s'annonce énnorme, merci XS_Yann. :bounce:
Euh Lenogre, pourquoi refaire Align_Assistant, il marche très bien....?!?
2x6coreXéon2.66(24T);64Gram; GTX 1080; OSX10.13.6 ////
Mac Studio 128 Ram ; OSX 12.3.1 ; papiercrayoncerveau;S22Studio;Redshift;Zbrush2022; CS2022
///SHTL 2011 DEMO HERE : http://demo.shtl.org/ /// NEW! 2014 WIP
Align assistant ne marche plus en v10. En 9.6UB aussi si mes souvenirs sont exacts. Mais si tu en as un qui marche, tu peux me l'envoyer ?
Tout ce que j'écris est à prendre au 15e degré. Car comme dit le proverbe chinois : Quand le dragon d'or, le ragondin ; voilà qui devrait faire taire les critiques et me mettre à l'abri d'attaques frontales.
Voilà où j'en suis avec le cloner MoGraph :
SHTL : ta version de Align Assistant se présente comment?
Tag?
Paramètres dans le gestionnaire d'attribut?
Paramètres dans une fenêtre modale? non modale?
.cob? .dylib, .cdl, .xdl....?
version 9.6 PPC
[Fichier joint supprimé par l'administrateur]
Tout ce que j'écris est à prendre au 15e degré. Car comme dit le proverbe chinois : Quand le dragon d'or, le ragondin ; voilà qui devrait faire taire les critiques et me mettre à l'abri d'attaques frontales.
Oui celui-ci c'est le même que le mien (celui dont je me suis servi de base pour re-programmer), mais il ne fonctionne plus en R10, non?
lenogre a décidé de saper le moral. :mrgreen:
laisse dond xs yann bosser si tu ne trouves pas le thread intéressant
Win 10 - R17 - www.nicolasverdon.fr
Je sape le moral de personne !
AlignAssistant ne marche plus en v10, ni en 9.6UB.
Au contraire, je suis ça de très près car n'ayant pas Mograph, tous les plugs de duplication sont les bienvenus !
Tout ce que j'écris est à prendre au 15e degré. Car comme dit le proverbe chinois : Quand le dragon d'or, le ragondin ; voilà qui devrait faire taire les critiques et me mettre à l'abri d'attaques frontales.
au temps pour moi. j'avais mal compris. je croyais que tu officiais pour maintenir ta position de leader aux fc4d d'or. :mrgreen:Envoyé par lenogre
Win 10 - R17 - www.nicolasverdon.fr
Excellent! Si tu continues à cette vitesse tu vas nous le finir avant la fin de semaine. :wink:Envoyé par xs_yann
SMC fan.