Voir la version complète : Besoin d'aide pour un code python
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/topic/77092-c4d-to-unity-3d-z-axis-issue/
Je vous met le code :
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()
Si vous pouvez m'aider, S'ils vous plaît merci d'avance.
edit: correction Y côté droite au lieu de gauche.
César Vonc
15/07/2017, 17h16
Salut,
Si j'ai bien compris tu veux pivoter l'axe d'un objet de 180° en Y :
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_CHIL DREN)
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()
Sélectionne un ou plusieurs objets puis exécute le script, ça devrait faire l'affaire.
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.
César Vonc
15/07/2017, 21h33
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. :biggrin:
Oui, dans ce sens là. :icon_mrgreen:
20178
Mais pas dans ce sens (c4d)
20179
César Vonc
16/07/2017, 09h15
C'est plus clair en effet !
Donc c'est une rotation X de 90° suivie d'une rotation Z de 90°.
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_CHIL DREN)
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()
Bon, bas ça ne marche pas dans ce sens, je sais pas quoi faire....:icon_cry:
20181
Petit up; supprimer le post après m'avoir répondu.
César Vonc
16/07/2017, 14h07
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.
Je chipote peut-être un peu, mais quand je regarde de près l'axe en vue de dessus, je vois qu'elle n'est pas droite du tout.
Pouvez-vous m'aider comment faire, s'il vous plaît merci, après j'ai encore une question mais qui n'a rien à voir.
20184
C'est très léger.
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.
:ninja:
Et puis tu peux aussi te faire un script pour remettre tous les axes à O :icon_wavey:
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? :icon_mrgreen:)
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/18688498dc96b678150bad39450df68c
Enfin bref tu as juste à changer les lignes 60/61/62 avec les valeurs que tu veux, sélectionne ton objet et execute ;)
Salut, d'accord, ça marche merci à vous. :thumbup1:
:icon_wavey::icon_wavey:
Powered by vBulletin® Version 4.2.1 Copyright © 2024 vBulletin Solutions, Inc. Tous droits réservés