PDA

Voir la version complète : Duplication d'objet à chaque point d'un autre objet



proparjak
20/04/2006, 02h30
Bonjour à tous,

J'ai un petit souci après avoir bien cherché.
N'étant pas une bête en coffee, j'ai pioché de ci, de là, sur les cours de Tengaal ;) , les posts qui se trouvaient sur FC4D (j'ai même gardé les commentaires que j'ai modifié) pour arriver à un code qui fonctionne bien sauf pour une ligne.

Je le livre ici en brut. C'est lors de la duplication d'instance qu'il y a problème.
Les instances créées ont leur champ "objet de référence" désespérément vide et je ne comprends pas pourquoi.


var str, ObjetEnfant, ObjetSuivant, nbPoints, tableau, i, pos, copie, container, ObjetCible;
const var NomCible="final";

main(doc,op)
{
ObjetCible=doc->FindObject(NomCible) ; // on cherche l’objet qui s’appelle final
if (!ObjetCible) return ; //si ObjetCible n’est pas trouvé on sort du programme
//
str="Instance";
ObjetEnfant=op->GetDown(); // on pointe sur le sous-objet de op
ObjetSuivant=ObjetEnfant->GetNext(); // le deuxième sous-objet
if (!ObjetEnfant) return ; // si ObjetEnfant n’existe pas on quitte le programme
if (!ObjetSuivant) return ; // si ObjetEnfant n’existe pas on quitte le programme
//
nbPoints=ObjetEnfant->GetPointCount(); // nombre de points total dans le premier objet enfant
tableau=new(array,nbPoints); // crée un tableau vide de nbPoints valeurs
tableau=ObjetEnfant->GetPoints(); // GetPoints avec un S !
ObjetEnfant->SetPoints(tableau); // fixe la liste de point
//
for (i=0 ;i<nbPoints ;i++) // compteur de 0 à nombre total de points du premier objet par 1 unité
{
pos=tableau[i]; // donne la position du point n° indice
copie=new(InstanceObject); //on crée une instance pour notre 2ème objet
copie->SetName(stradd(str,tostring(i)));
container=copie->GetContainer(); //on accède aux paramètre de cet objet Instance
container->SetData(INSTANCEOBJECT_SOURCE,ObjetSuivant->GetName()); //l'instance pointe sur le nom du deuxième objet
copie->InsertUnder(ObjetCible);
copie->SetContainer(container);
copie->SetPosition(pos);
}
}

A vot'bon coeur pour un peu d'aide, s'il vous plaît, Dieux du Coffee :)

Merci !

NiKo
20/04/2006, 03h56
Sans rien y connaitre au Coffee, tu ne serai pas en train de vouloir faire ce que fait le plug Replika (copie d'objets sur les points ou ploygones d'un autre objet)?

proparjak
20/04/2006, 08h56
Tout à fait NiKo ;)

Je me suis posé comme défi de pouvoir faire ça sans être obligé d'installer un plug par simple gageure.

kiteman
20/04/2006, 10h10
hey faut pas rester ici messieur ! :mrgreen: , là vous êtes chez les Xpressonophiles ! , les bons de la programmation ils vont dans la rubrique Coffée :boss:

tabou
20/04/2006, 10h59
Désolé proparjak je n'ai pas la solution de ton problème, par contre je peux déplacer ton sujet dans la section Coffee si tu veux.

proparjak
20/04/2006, 12h51
Ah oui ! désolé.
Pas de problème. Je n'ai pas vu le thème "Programmation", encore habitué à "Coffee" de l'ancienne version du site :oops:

Merci !

proparjak
21/04/2006, 12h01
Code modifié qui fonctionne + fichier. Je n'utilise plus les instances mais le clonage d'objet qui a l'avantage de garder les propriétés de l'objet à dupliquer (conserve textures, xpresso)

Dans le fichier joint, il y a justement l'objet à dupliquer qui a l'Xpresso qui le tourne toujours face à la caméra (ref rubrique matière)

C'est donc un petit coffee qui clone à l'identique un objet sur les points d'un autre objet.
Contraintes :
- Garder l'objet "final" (j'aimerai que l'on ne soit pas obligé de générer les objets, juste de les voir comme le plug Replika mais là dur, dur)
- Le premier objet de référence pour les points doit être un objet polygonal et non une primitive (point que j'aimerais résoudre d'ailleurs)

Lien vers le fichier (http://www.licorneproductions.com/_partage/coffee_dupliqueauxpoints.c4d)

et voici le code pour la fonction "recherche" du forum


var str, ObjetEnfant, ObjetSuivant, ObjetResultat, nbPoints, tableau, i, pos, copie, container, ObjetCible, NewObject;
const var NomCible="final";

main(doc,op) // Merci aux sources délivrées par Tengaal, Majoul
{
ObjetCible=doc->FindObject(NomCible) ; // on cherche l’objet qui s’appelle final
if (!ObjetCible) return ; // si ObjetCible n’est pas trouvé on sort du programme
//
str="Instance";
ObjetEnfant=op->GetDown(); // on pointe sur le sous-objet de op
ObjetSuivant=ObjetEnfant->GetNext(); // le deuxième sous-objet
ObjetResultat=ObjetCible->GetDown(); // On regarde s'il y a déjà des objets sous l'objet final
if (!ObjetEnfant) return ; // si ObjetEnfant n’existe pas on quitte le programme
if (!ObjetSuivant) return ; // si ObjetSuivant n’existe pas on quitte le programme
if (ObjetResultat) return ; // s'il y a déjà des objets sous l'objet final on quitte le programme
//
nbPoints=ObjetEnfant->GetPointCount(); // nombre de points total dans le premier objet enfant
tableau=new(array,nbPoints); // crée un tableau vide de nbPoints valeurs
tableau=ObjetEnfant->GetPoints(); // GetPoints avec un S !
ObjetEnfant->SetPoints(tableau); // fixe la liste de point
//
for (i=0 ;i<nbPoints ;i++) // compteur de 0 à nombre total de points du premier objet par 1 unité
{
pos=tableau[i]; // donne la position du point n° indice
NewObject=ObjetSuivant->GetClone(0); // crée une copie intégrale du deuxième objet
NewObject->SetName(stradd(str,tostring(i)));// donne le nom "Instance"+numéro id du point
NewObject->InsertUnder(ObjetCible); // place le nouvel objet en-dessous de l'objet final dans la hiérarchie
NewObject->SetPosition(pos); // place le nouvel objet à l'endroit de chaque point de l'objet référence
}
doc->Message(MSG_UPDATE); // actualisation des modifications du document
}

glop glop Coffee !