Bonjour, j'ai besoin d'aide pour le langage python dans cinema4d, c'est pour réglé l'axe d'un sens.
Par exemple je voudrais mettre l'axe Z en dessus et l'axe Y en côté Droite et l'X en vue de face.
Voici, le lien ;
https://www.c4dcafe.com/ipb/forums/t...-z-axis-issue/
Je vous met le code :
Si vous pouvez m'aider, S'ils vous plaît merci d'avance.import c4d
from c4d import documents
#Welcome to the world of Python
def GetNextObject(op):
if op==None: return None
if op.GetDown(): return op.GetDown()
while not op.GetNext() and op.GetUp():
op = op.GetUp()
return op.GetNext()
def main():
#Grab the active document
doc = c4d.documents.GetActiveDocument()
# Make sure the Axis Enable tool is enabled
# This allows us to rotate the axis explicitly instead of the object
if not(doc.IsAxisEnabled()):
c4d.CallCommand(c4d.ID_MODELING_AXIS)
print "Enabling [Enable Axis]"
else:
print "[Enable Axis] already enabled"
myobject = doc.GetFirstObject()
if myobject==None: return
while myobject:
#do something to "myobject here"
print myobject.GetName()
myobject.SetAbsRot(c4d.Vector(-180, myobject.GetAbsRot().y, myobject.GetAbsRot().z))
c4d.EventAdd()
myobject = GetNextObject(myobject)
print "Done..."
# ================================================== =====================
if __name__ == "__main__":
main()
edit: correction Y côté droite au lieu de gauche.
Dernière modification par bbenoit ; 15/07/2017 à 13h36.
Salut,
Si j'ai bien compris tu veux pivoter l'axe d'un objet de 180° en Y :
Sélectionne un ou plusieurs objets puis exécute le script, ça devrait faire l'affaire.Code PHP:
import c4d
def ChangeAxe(obj, mat, matInv) :
pts = obj.GetAllPoints()
for i, p in enumerate(pts) :
pts[i] = matInv.Mul(p)
obj.SetAllPoints(pts)
obj.SetMl(obj.GetMl() * mat)
obj.Message(c4d.MSG_UPDATE)
def main() :
objs = doc.GetActiveObjects(c4d.GETACTIVEOBJECTFLAGS_CHILDREN)
if not objs : return
mat = c4d.utils.MatrixRotY(3.141592653589793)
matInv = ~mat
doc.StartUndo()
for obj in objs :
if not obj.CheckType(c4d.Opoint) : continue
doc.AddUndo(c4d.UNDOTYPE_CHANGE, obj)
ChangeAxe(obj, mat, matInv)
doc.EndUndo()
c4d.EventAdd()
if __name__=='__main__':
main()
Dernière modification par César Vonc ; 15/07/2017 à 17h18.
Non, je voudrais avoir l'axe Z en Z-up et le x en forward, et le y coter droite. Le code lui même n'était pas très bon, je parle de mon code pas du votre ^^ Mais pas de 180° Pour que l'objet soit dans le bon axe d'un logiciel sinon, l'objet il part en vrille.
Dernière modification par bbenoit ; 15/07/2017 à 18h14.
Tu peux me faire un dessin avant/après ? Parce que le X côté droite ou en forward, c'est pas très précis pour moi.
C'est plus clair en effet !
Donc c'est une rotation X de 90° suivie d'une rotation Z de 90°.
Code PHP:
import c4d
import math
def ChangeAxe(obj, mat, matInv) :
pts = obj.GetAllPoints()
for i, p in enumerate(pts) :
pts[i] = matInv.Mul(p)
obj.SetAllPoints(pts)
obj.SetMl(obj.GetMl() * mat)
obj.Message(c4d.MSG_UPDATE)
def main() :
objs = doc.GetActiveObjects(c4d.GETACTIVEOBJECTFLAGS_CHILDREN)
if not objs : return
mat = c4d.utils.MatrixRotX(math.pi / 2.) * c4d.utils.MatrixRotZ(math.pi / 2.)
matInv = ~mat
doc.StartUndo()
for obj in objs :
if not obj.CheckType(c4d.Opoint) : continue
doc.AddUndo(c4d.UNDOTYPE_CHANGE, obj)
ChangeAxe(obj, mat, matInv)
doc.EndUndo()
c4d.EventAdd()
if __name__=='__main__':
main()
Petit up; supprimer le post après m'avoir répondu.
La ligne ci-dessous indique les rotations à appliquer à l'axe :
mat = c4d.utils.MatrixRotX(math.pi / 2.) * c4d.utils.MatrixRotZ(math.pi / 2.)
À partir de ça t'as tout ce qu'il faut pour essayer d'autres combinaisons.
Pourquoi supprimer le post !?
Je parlais du message #8 mais pas le topique.
Pour le code, je dois changer quoi ? Pour changer l'axe.
Tes axes d'origine sont peut être un peu foireux.
A la place du script, tu peux aussi tout simplement remettre tes axes à 0 :
Tu sélectionnes ton objet, ensuite, tu passes en mode Axe ( touche L ) et tu remets les coordonnées H,P,B à 0 dans les coordonnées. Ensuite, tu ré-appuies sur la touche L ( tu peux aussi faire la manip en gardant le doigt sur la touche L ). C'est rapide comme manip et tu es certain d'avoir tes axes remis proprement.
Et puis tu peux aussi te faire un script pour remettre tous les axes à O
Je comprends vite, mais faut m'expliquer longtemps…
Voila un petit snippet d'un plug que j'ai codé qui permet d'aligné spline/obj/generateur au centre bas et mettre la rotation en fonction du monde qu'il faudrait que je clean et que je poste d'ailleurs... (un super projet qui ma permis de comprendre les matrices... ça fait rêver non? )
Mais bon je ferais ça une fois les que j'aurais du temps/fini les études ! (enfin sauf si je trouve un taff d'ici la :p)
Cependant dans ce snippet tu as juste la partie qui permet de définir une rotation et de le set sur un objet
https://gist.github.com/gr4ph0s/1868...0bad39450df68c
Enfin bref tu as juste à changer les lignes 60/61/62 avec les valeurs que tu veux, sélectionne ton objet et execute
Dernière modification par gr4ph0s ; 17/07/2017 à 22h38.
SDK Specialist
MAXON Computer GmbH
Salut, d'accord, ça marche merci à vous.