Bonjour,
J'essaie de faire cligner des yeux de mon personnage de façon répétitive, c'est à dire toute les 4 secondes par exemple.
J'aimerais savoir s'il existe un moyen de le faire en python en appelant le morphing de pose...
Est-ce que quelqu'un pourrait m'aiguiller sur la façon de faire ?
Merci d'avance !
Depuis un état de morphing "yeux fermés" j'ai ce bout de code :
import c4d
def main():
def tool():
return plugins.FindPlugin(doc.GetAction(), c4d.PLUGINTYPE_TOOL)
def object(i=0):
return doc.GetActiveObjects(c4d.GETACTIVEOBJECTFLAGS_CHIL DREN | c4d.GETACTIVEOBJECTFLAGS_SELECTIONORDER)
def tag():
return doc.GetActiveTag()
def renderdata():
return doc.GetActiveRenderData()
def prefs(id):
return plugins.FindPlugin(id, c4d.PLUGINTYPE_PREFS)
for i in xrange(len(tag())):
doc.AddUndo(c4d.UNDOTYPE_CHANGE_SMALL, tag()[i])
tag()[0][4000,1501] = 0
tag()[i].Message(c4d.MSG_UPDATE);
if __name__ == '__main__':
main()
c4d.EventAdd()
salut darsanha,
tu peux utiliser la balise code ou PHP pour coller ton code c'est plus facile pour prendre la suite
j'ai essayé de faire un truc, ça marche mais c'est parfois bizarre.
j'ai utilisé un tag python pour ça
scène créer avec la R21.115
morph_eyes.zip
et voici le code commenté :
voilà.Code PHP:
import c4d
#Welcome to the world of Python
import random
anim = 2
def main():
# on stock anim sur une variable globale pour garder les valeurs de frame en frame
global anim
# vitesse d'animation du morph
speedAnim =.5
# on récupère l'objet sur lequel est le tag python
obj = op.GetObject()
# on recherche un tag morph
mt = obj.GetTag(c4d.Tposemorph)
if mt is None:
raise TypeError("couldn't find any morph tag")
# on récupère la frame actuelle
actualFrame = doc.GetTime().GetFrame(doc.GetFps())
# on génère un random pour déclancher l'animation
random.seed(actualFrame)
stepFrame = int(random.random() * 30 + 1) #+1 pour éviter les divitions par 0
# on test le déclanchement avec un modulo % et on clamp la sortir entre 0 et 1
declanchement =int(1-c4d.utils.ClampValue( actualFrame % stepFrame,0 ,1))
# si il y a déclanchement et que l'anim n'est pas en route on déclanche l'anim'
if declanchement and anim <=0:
anim = 2
sn, cs = c4d.utils.SinCos(actualFrame * speedAnim)
weight = 1.0 - c4d.utils.ClampValue(cs,0,1)
# on rechercher sur tous les morph si certain on le nom "eye" présent
for i in xrange(mt.GetMorphCount()):
morph = mt.GetMorph(i)
if "eye" in morph.GetName():
# on calcul l'id du morph '
morphID = morph.GetID()* c4d.ID_CA_POSE_ANIMATE_CNT + c4d.ID_CA_POSE_ANIMATE_OFFSET + c4d.ID_CA_POSE_ANIMATE_STRENGTH
# s'il y a animation,
if anim > 0:
# on change la valeur du morph
mt[c4d.ID_CA_POSE_ANIMATE_DATA, morphID] = weight
# et on réduit la valeur d'anim ce qui l'arrêtera à la fin
anim = anim - weight
if __name__ == '__main__':
main()
c4d.EventAdd()
Ton pseudo serait pas Pexel sur plugincafé ?
Dernière modification par valkaari ; 21/02/2020 à 14h38.
Question bête mais pourquoi pas en Xpresso ?
Salut Valkaari,
Je n'ai pas de pseudo et de compte sur plugincafé.
Génial ton bout de code, c'est très intéressant et super tes commentaires pour comprendre les actions.
J'aimerais trouver le temps de me mettre au Python mais j'y arrive pas... peu être un de ces quatre...
Par contre c'est effectivement un peu hasardeux, n'y aurait il pas une solution pour rendre le mouvement plus limpide, juste aller/retour avec possibilité de choisir une vitesse ? Mais bon je ne veux pas t'embêter avec ça... peut être qu'en Xpresso c'est plus simple en effet ?
Pour répondre à Iolofato, pas en Xpresso... simplement par ce que je n'y suis pas arrivé et puis que Python m'intéresse pas mal en fait.
Je suis arrivé à faire cligner l'oeil mais je n'arrive pas à boucler un aller / retour, c'est sans doute tout con mais je suis pas un pro de Xpresso...
Peut être que c'est mieux de faire ça en Xpresso ? peux être pourrais tu me dire comment boucler le retour ?
Un grand merci pour avoir pris le temps de me répondre !
Une petite capture vidéo en mp4 (j'ai filmé l'écran avec mon téléphone).
C'est juste pour montrer ce que j'aimerais faire : https://www.dropbox.com/s/azhyt5yrae...rso3d.mp4?dl=0
Une capture pour mon petit Xpresso (qui ne boucle pas) :
pfff non désolé même pas je suis une vraie tanche en Xpresso, il me faut un temps fou pour parvenir à mes fins à chaque fois, mais c'est certain que c'est possible. Tu pourrais utiliser par exemple du bruit pour rendre le clignotement aléatoire ou un random. Sinon en cherchant "Xpresso looping animation" tu trouves des trucs… (pas le temps de chercher par contre :p)
Salut,
Ça y est, j'ai réussi avec Xpresso !
J'avais déjà vue cette vidéo mais je l'ai re-regardé et cette fois j'y suis arrivé.
Donc pour ceux que ça intéresse voici une capture d'écran.
Il Faut utiliser un "Mappage d'intervale", cocher "Modulo" et "Utiliser la spline", pour répéter le mouvement et jouer avec un type de spline en bas pour peauffiner le mouvement.
Merci pour votre aide !
C'est bien dommage que l'on ne puisse envoyer que de si petite image sur le site... ça fais une capture d'écran un peu ridicule...
Dernière modification par darsanha ; 22/02/2020 à 13h07.
normalement tu devrais pouvoir envoyer des images plus grandes y a pas de raison, là en effet c'est rikiki
yop,
j'avais fait des tuto sur xpresso sinon. Mais je me souviens plus si j'utilisais le modulo et la spline. (9 ans déjà)