PDA

Voir la version complète : Besoin d'aide pour un code python



bbenoit
15/07/2017, 12h36
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.

bbenoit
15/07/2017, 18h11
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:

bbenoit
16/07/2017, 08h52
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()

bbenoit
16/07/2017, 10h37
Bon, bas ça ne marche pas dans ce sens, je sais pas quoi faire....:icon_cry:

20181

bbenoit
16/07/2017, 11h45
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 !?

bbenoit
16/07/2017, 17h50
Je parlais du message #8 mais pas le topique.

Pour le code, je dois changer quoi ? Pour changer l'axe.

bbenoit
17/07/2017, 20h56
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.

gaff
17/07/2017, 22h31
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:

gr4ph0s
17/07/2017, 22h35
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 ;)

bbenoit
18/07/2017, 19h39
Salut, d'accord, ça marche merci à vous. :thumbup1:

:icon_wavey::icon_wavey: