samedi 22 mars 2014

Le tag Python

Cette semaine un tutoriel sur la programmation Python dans Cinema 4D, quelque chose d'assez simple, on va en effet voir comment créer un tag personnalisé qui à juste pour effet de faire tourner l'objet sur lequel on l'applique, si vous voulez plus souvent des tutoriel de programmation Python dans Cinema 4D faite le savoir, place à la vidéo...

le code Python :
import c4d
# Welcome to the world of Python


def main():
    # on définit l'objet qui contient le tag
    monObjet = op.GetObject()

    rot = monObjet.GetRelRot()
    
    # on définit la frame actuelle
    frame = doc.GetTime().GetFrame(doc.GetFps())

    onoff = op[c4d.ID_USERDATA,2]
    vitesse = op[c4d.ID_USERDATA,3]

    if onoff == 1:

        if frame == 0:
            rot.y = 0    
        
        # sinon
        else:                
            rot.y += vitesse
            
    monObjet.SetRelRot(rot)


25 commentaires:

Unknown a dit…

bonjour,c'est quand meme pas mal python.existe il des cours pour apprendre a programmer python ou juste en suivant quelques exemples le langage est assez simple?
-pour les plugin cela doit etre pas mal?

KamiGeek a dit…

il y a pleins de tutoriel sur le net ce que je conseil c'est la série de tuto vidéo sur Youtube sur cette chaine : http://www.youtube.com/user/Pythonneries/videos

par contre pour l'utiliser dans Cinema 4D je ne connais pas de série de tuto mais il y a beaucoup d'info sur les forum C4D et sur quelques site sur C4D

Unknown a dit…

Je vois que meme la nuit vous repondez alors petite question?
peut on imbriquer des boucles dans des boucles car cela me rapelle une epoque il y a longtemps avec des conditions imbriquer dans des conditions etc etc etc.Prenez au moin le temps de dormir.Merci pour la repose demain.Je retourne a mon anim.Mr gerard

KamiGeek a dit…

oui on peux imbriquer des boucles dans des boucles mais si on peux faire plus proprement la même chose c'est mieux forcément

PS. j'ai déjà dormi l'année dernière >_<

Unknown a dit…

trop fort,merci pour la chaine;python

Nicolas a dit…

Salut Rorschach, peut-tu me renseigner s'il te plait, je voudrais faire des données utilisateurs et changer de splines paramétriques comme j'en est envie que je glisserais dans un champs splines, pour changer bien entendu ma forme de base extrudées ou mon chemin si celle-ci me sert de guide,comment je peux procéder ?

KamiGeek a dit…

la solution la plus simple et rapide qui me vient à l'esprit est de faire ton extrusion contrôlée nurbs et de mettre dedans deux objet instance, puis tu peux gérer le champ objet de référence des instance via xpresso et donc via des donnée utilisateur, te sspline ne seront donc pas enfant de ton extrusion controlée mais indiqué dans les paramètres des instances qui elle sont enfant de l'extrusion ^_^
dit moi si tu as compris ou si il te faut une capture de la manipulation ^_^

Lazarus a dit…

Bonjour.J'aimerai savoir si il est plus facile de gerer des extrusions sur des objets polygonaux avec python ou coffee?

KamiGeek a dit…

Python est plus simple et plus puissant que COFFEE mais je ne peux pas trop juger vu que je n'ai que de légère base sur COFFEE

Anonyme a dit…

Bonsoir,
Encore un tuto très intéressant.
J'ai une question qui concerne la transmission de mouvement (ex: engrenage). Je sais que pour ce genre d'animation, tu privilégies les solutions simples (style Expresso, ou autres). Je souhaiterais faire ce genre d'animation avec une solution purement "mécanique" avec 2 roues dentées dont l'une est entrainées par l'autre. J'ai essayé quelques trucs, mais je n'arrive pas à entrainer la 2ème roue. Peut-tu me conseiller ??
Merci

Lazarus a dit…

Merci.Je vais donc me lancer sur python.En tout cas grâce a toi j'ai pu apprendre xpresso et je me suis lancer dans une interface pour contrôler entièrement thinking particle comme avec le système de particule standard, et ca avance plutôt bien.Encore merci

Nicolas a dit…

objet instance ! ben oui! c'est bon j'ai tous compris Merçi a toi Rorschach, super sympa !

KamiGeek a dit…

Pour répondre à la question sur les roues, en effet je privilégie les solution simple et donc au lieu de chercher les bons réglage de friction par exemple je préfère faire tourner les deux roues et ne pas me reposer sur la mécanique, il ne faut pas hésiter à tricher sur ce genre d'animation ^_^

mais sinon si tu souhaite vraiment faire un setup purement mécanique, il va te falloir trouver les bon réglages de friction, de marge de collision, de bruit de collision etc. si tes deux roue sont directement en contact il faudra le faire pour les deux roues si elles sont relier avec une 3eme élément, ce 3eme élément devra lui aussi avoir des réglages de dynamique

dans les outils de simulation regarde le connecteur qui devrai t'aider à organiser la mécanique de tes éléments

Nicolas a dit…

Salut Rorschach c'est encore moi, je sais rendre une Instance avec un objet pour ça pas de probléme, mais l'attribuer a plusieurs objets comme l'indique la doc de C4D alors je butte. (Imaginez que vous avez créé une scène de rue avec plus de 40 lampadaires tous ces lampadaires étant des instances du même objet).je comprend pas,Comment faire pour controler tous les objets en même temps avec une seule instance ?

KamiGeek a dit…

on attribue un seul objet à une instance, dans l'exemple ce n'est pas une instance qui prend plusieurs lampadaire... c'est un lampadaire dont ont fait plusieurs instance donc pleins d'instance ayant toute la même référence le lampadaire la scène à donc un véritable lampadaire et tout les autre sont des instance de ce seul lampadaire et donc C4D à moins de travail à faire ^_^

Nicolas a dit…

Toutes mes excuses de t'avoir déranger c'est d'une logique implacable, par moment j'ai du mal a percuter, encore merci.

Anonyme a dit…

Merci, un bon début,on aurais vite fait de se prendre au jeu, moi j'en redemande.

Une petite question, une fois que l'on a enregistrer son script python par : "enregistrer le préréglage de propriété" et donné un nom.

Si on veut faire évoluer ce code, comment le ré-enregistrer sous son nom d'origine sans se tromper, car une fois recharger, le nom du script n'apparais plus et quand, après modif, on enregistre le "préréglage de propriété", il propose de l'enregistrer sous le nom "Python", et la , on se dit "mais comment je l'avais écrit son nom, avec une majuscule un underscore ?"
Y a t-il une fonction pour enregistrer les modifications du script sous son nom ?

encore merci.

KamiGeek a dit…

Alors même si tu l'enregistre sous le même nom Cinema 4D va ajouter un numéro par exemple si tu as un script "monscript" si tu réenregistre sous le même nom C4D va ajouter .1 et ça donnera monscript.1 et donc il n'efface pas la première version, cela dit tu ouvre la médiathèque de C4D (Maj + F8) tu y trouvera un dossier "User" et dans ce dossier un dossier "Propriétés" dans le quel sont listé tout tes préréglages de propriété et donc on peux également en effacer au besoin
C4D ne réécrit pas par dessus un tag python car cela poserai des problème avec les scène qui utilise déjà ce code imagine tu fait un tag qui fait une action tu l'utilise dans une 10aine de scène et un jour tu change le code du tag, cela aura donc une incidence sur toutes les scènes où tu as utilisé ce tag, il faut donc plutôt dans ce cas faire une version 2 si tu souhaite faire évoluer le code du tag, et enregistrer le préréglages c'est ce que l'on fait une fois que l'on est sur que tout est ok ^_^

Anonyme a dit…

Évidemment, ils pensent à tout chez MAXXON, c'est tout simplement logique.

Merci à toi.

Anonyme a dit…

Bonjour j'ai un petit soucis sur cinéma 4D r13,
Donc je fais mon code python tout bien voila, et puis lorsque je fais compiler j'ai l'erreur suivante qui apparait :

If onoff == 1:
Syntax error

Je n'arrive absolument pas à voir ou j'ai fais une erreur par rapport au code que vous proposez dans votre tutoriel et je ne m'en sors pas :(

KamiGeek a dit…

regarde dans la fenetre de la console le message d'erreur que python indique, c'est peut être une mauvaise indentation python est très strict sur les espaces, c'est peut etre plus haut dans le code la variable onoff doit être la même partout si tu as une majuscule par exemple il faut la conserver du début à la fin, le code de ta données utilisateur n'est peut etre pas le même moi j'ai :
onoff = op[c4d.ID_USERDATA,2]
mais dans ton cas c'est peut être pas la valeur 2, ça dépend de tes données utilisateur

Anonyme a dit…

monObjet = op.GetObject()

rot = monObjet.GetRelPos()

frame = doc.GetTime().GetFrame(doc.GetFps())

onoff = op[c4d.ID_USERDATA,2]
vitesse = op[c4d.ID_USERDATA,3]

If onoff == 1

Voila dans la console il m'indique une erreur entre le n et le second "o" du onoff de la dernière ligne. (pour les retour a la ligne s'il y en a dans le commentaire ils n'y sont pas dans le code) que faire ?

KamiGeek a dit…

le caractère ^ n'indique pas forcement là où est l'erreur, je pense que tu devrai vérifier que l'ID de ta donnée utilisateur est bien 2
vérifie également le nombre de caractère espace que tu as devant le if onoff == 1:

aussi n'oublie pas le caractère ":" si les deux points n'y sont pas tu aura une erreur

si tu peux passer ton fichier .c4d j'y jetterai un œil ^_^

Anonyme a dit…

Et bien en fait lorsque je copie colle le bout de code que tu nous as mis gentiment sur le site, ca marche, je vais étudier la question et si jamais je trouve pas ce que je fais de travers je te recontacte :)

J'en profite pour te remercier des vidéos, ca fais quelques années que je te suis, maintenant exclusivement sur le blog, et vraiment un seul mot : merci, tu m'as renseigné sur tellement de situation différentes à travers tes tutoriels que.... voila merci beaucoup :D

KamiGeek a dit…

l'erreur peut être une fautes de frappe ou juste un espace en trop ou en moins qui fausse l'indentation ^_^"

merci pour les compliments, les tutoriels sont fait pour aider justement ^_^