tabou
21/09/2011, 23h23
Bonjour à tous,
Je commence à apprendre à programmer en Python, et j'ai donc préféré attaquer par un sujet pas trop compliqué, à savoir le cube :icon_mrgreen:
L'idée est de me simplifier la vie, en effet l'axe du cube standard est obligatoirement situé au centre. Cela n'est pas gênant quand il faut que l'objet soit centré mais c'est rarement le cas, le plus souvent on a besoin de l'aligner par rapport au sol ou un autre objet et du coup, chaque fois qu'on change la taille du cube il faut le repositionner :sweatdrop:
http://vimeo.com/29378448
J'ai utilisé un générateur Python mais je pense le transformer en plugin, accessible d'un clic sur une icône. Pour l'instant le plus simple c'est de le glisser dans la médiathèque pour l'avoir à portée de souris.
Il faudra que j'optimise le code, là c'est brut de fonderie :icon_redface: je suis d'ailleurs ouvert à toute suggestion pouvant l'améliorer.
Il me reste aussi à implémenter les poignées de contrôle, pour le moment il faut passer par les attributs pour changer la taille, mais comme il fonctionne déjà bien comme ça, je le mets à disposition.
Le fichier (http://tabou.free.fr/tabou/2011/Py_Cube.c4d.zip)
import c4d
from c4d import *
def biseauClamp(rayon,x,y,z): # évite que le rayon du biseau soit supérieur à la moitié de la plus
if rayon> x/2 : # petite dimension de l'objet sinon l'objet disparait
rayon = x/2
elif rayon> y/2 :
rayon = y/2
elif rayon> z/2 :
rayon = z/2
else :
rayon = rayon
return rayon
def creaCube():
ancreX = op [ID_USERDATA, 3] # DU point d'ancrage sur les axes X, Y et Z
ancreY = op [ID_USERDATA, 4]
ancreZ = op [ID_USERDATA, 6]
tailleX = op [ID_USERDATA, 7] # DU dimensions du cube en X, Y, Z
tailleY = op [ID_USERDATA, 8]
tailleZ = op [ID_USERDATA, 9]
segX = op [ID_USERDATA, 10] # DU nombre de segments en X, Y, Z
segY = op [ID_USERDATA, 11]
segZ = op [ID_USERDATA, 12]
biseau = op [ID_USERDATA, 14] # DU biseau
rayonBiseau = op [ID_USERDATA, 15] # DU rayon du biseau
biseauSubd = op [ID_USERDATA, 16] # DU subdivisions du biseau
phongMax = op [ID_USERDATA, 18] # DU tag lissage
phongAngle = op [ID_USERDATA, 19]
phongAretes = op [ID_USERDATA, 20]
neutre = BaseObject(Onull) # création d'un neutre
cube = BaseObject(Ocube) # création d'un cube
cube.InsertUnder(neutre) # insertion du cube en tant qu'enfant du neutre
tagphong = BaseTag(Tphong) # création d'un tag de lissage
cube.InsertTag(tagphong)
cube.SetPhong(phongMax,phongAretes,phongAngle) # envoie la valeur de la DU dans le tag
biseauRayon = biseauClamp(rayonBiseau,tailleX,tailleY,tailleZ) # appel fonction pour clamper le rayon du biseau
op [ID_USERDATA, 15] = biseauRayon # affiche dans la DU la valeur réelle du rayon après un éventuel clampage
cube[1100] = Vector(tailleX,tailleY,tailleZ) # modif taille x,y,z du cube
cube[1102] = segX # modif segments X
cube[1103] = segY # modif segments Y
cube[1104] = segZ # modif segments Z
cube[1107] = biseau # activation biseau
cube[1105] = biseauRayon # modif rayon du biseau
cube[1106] = biseauSubd # modif subdivisions du biseau
posX= (tailleX/2)*ancreX # calcule le décalage du cube par rapport au null parent
posY= (tailleY/2)*ancreY
posZ= (tailleZ/2)*ancreZ
cube[903] = Vector(posX,posY,posZ) # déplace le cube selon l'ancrage choisi
return neutre
def main():
cube = creaCube()
return cube
Je commence à apprendre à programmer en Python, et j'ai donc préféré attaquer par un sujet pas trop compliqué, à savoir le cube :icon_mrgreen:
L'idée est de me simplifier la vie, en effet l'axe du cube standard est obligatoirement situé au centre. Cela n'est pas gênant quand il faut que l'objet soit centré mais c'est rarement le cas, le plus souvent on a besoin de l'aligner par rapport au sol ou un autre objet et du coup, chaque fois qu'on change la taille du cube il faut le repositionner :sweatdrop:
http://vimeo.com/29378448
J'ai utilisé un générateur Python mais je pense le transformer en plugin, accessible d'un clic sur une icône. Pour l'instant le plus simple c'est de le glisser dans la médiathèque pour l'avoir à portée de souris.
Il faudra que j'optimise le code, là c'est brut de fonderie :icon_redface: je suis d'ailleurs ouvert à toute suggestion pouvant l'améliorer.
Il me reste aussi à implémenter les poignées de contrôle, pour le moment il faut passer par les attributs pour changer la taille, mais comme il fonctionne déjà bien comme ça, je le mets à disposition.
Le fichier (http://tabou.free.fr/tabou/2011/Py_Cube.c4d.zip)
import c4d
from c4d import *
def biseauClamp(rayon,x,y,z): # évite que le rayon du biseau soit supérieur à la moitié de la plus
if rayon> x/2 : # petite dimension de l'objet sinon l'objet disparait
rayon = x/2
elif rayon> y/2 :
rayon = y/2
elif rayon> z/2 :
rayon = z/2
else :
rayon = rayon
return rayon
def creaCube():
ancreX = op [ID_USERDATA, 3] # DU point d'ancrage sur les axes X, Y et Z
ancreY = op [ID_USERDATA, 4]
ancreZ = op [ID_USERDATA, 6]
tailleX = op [ID_USERDATA, 7] # DU dimensions du cube en X, Y, Z
tailleY = op [ID_USERDATA, 8]
tailleZ = op [ID_USERDATA, 9]
segX = op [ID_USERDATA, 10] # DU nombre de segments en X, Y, Z
segY = op [ID_USERDATA, 11]
segZ = op [ID_USERDATA, 12]
biseau = op [ID_USERDATA, 14] # DU biseau
rayonBiseau = op [ID_USERDATA, 15] # DU rayon du biseau
biseauSubd = op [ID_USERDATA, 16] # DU subdivisions du biseau
phongMax = op [ID_USERDATA, 18] # DU tag lissage
phongAngle = op [ID_USERDATA, 19]
phongAretes = op [ID_USERDATA, 20]
neutre = BaseObject(Onull) # création d'un neutre
cube = BaseObject(Ocube) # création d'un cube
cube.InsertUnder(neutre) # insertion du cube en tant qu'enfant du neutre
tagphong = BaseTag(Tphong) # création d'un tag de lissage
cube.InsertTag(tagphong)
cube.SetPhong(phongMax,phongAretes,phongAngle) # envoie la valeur de la DU dans le tag
biseauRayon = biseauClamp(rayonBiseau,tailleX,tailleY,tailleZ) # appel fonction pour clamper le rayon du biseau
op [ID_USERDATA, 15] = biseauRayon # affiche dans la DU la valeur réelle du rayon après un éventuel clampage
cube[1100] = Vector(tailleX,tailleY,tailleZ) # modif taille x,y,z du cube
cube[1102] = segX # modif segments X
cube[1103] = segY # modif segments Y
cube[1104] = segZ # modif segments Z
cube[1107] = biseau # activation biseau
cube[1105] = biseauRayon # modif rayon du biseau
cube[1106] = biseauSubd # modif subdivisions du biseau
posX= (tailleX/2)*ancreX # calcule le décalage du cube par rapport au null parent
posY= (tailleY/2)*ancreY
posZ= (tailleZ/2)*ancreZ
cube[903] = Vector(posX,posY,posZ) # déplace le cube selon l'ancrage choisi
return neutre
def main():
cube = creaCube()
return cube