-
Membre Reconnu
Pilier
Duplication d'objet à chaque point d'un autre objet
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 !
-
Super modérateur
Big Boss
Re: Duplication d'objet à chaque point d'un autre objet
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)?
-
Membre Reconnu
Pilier
Re: Duplication d'objet à chaque point d'un autre objet
Tout à fait NiKo
Je me suis posé comme défi de pouvoir faire ça sans être obligé d'installer un plug par simple gageure.
-
Re: Duplication d'objet à chaque point d'un autre objet
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:
-
Super modérateur
Gourou
Re: Duplication d'objet à chaque point d'un autre objet
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.
-
Membre Reconnu
Pilier
Re: Duplication d'objet à chaque point d'un autre objet
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 !
-
Membre Reconnu
Pilier
Re: Duplication d'objet à chaque point d'un autre objet
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
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 !
Règles de messages
- Vous ne pouvez pas créer de nouvelles discussions
- Vous ne pouvez pas envoyer des réponses
- Vous ne pouvez pas envoyer des pièces jointes
- Vous ne pouvez pas modifier vos messages
-
Règles du forum