Boutique Cinema 4D
Affichage des résultats 1 à 7 sur 7

Discussion: Duplication d'objet à chaque point d'un autre objet

  1. #1

    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 !

  2. #2
    Big Boss Avatar de NiKo
    Date d'inscription
    novembre 2002
    C4D version
    R12 Studio
    OS
    OSX
    Messages
    6 469

    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)?

  3. #3

    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.

  4. #4
    kiteman
    Invité

    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:

  5. #5
    Gourou Avatar de tabou
    Date d'inscription
    juin 2002
    C4D version
    R21 Perpétuelle
    OS
    OS X 10.13.6
    Messages
    2 272

    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.

  6. #6

    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 !

  7. #7

    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
  •  
Mediaworks - Logiciels 3D | Design Internet - Creation site internet