Bonjour à tous,
Ayant un peu de temps à perdre pendant les vacances je me suis dis que j'aillais essayer de glander utile...
Hier soir je découvrais ce qu'étais python et aujourd'hui l'envie m'a pris d'essayer de coder un petit plugin histoire de m’entraîner.
Un plug dans ce genre que je trouve très pratique sur 3DS mais que je n'ai pas retrouvé sur C4d.
Il y a bien le tag constraint > clamp qui s'en rapproche mais je le trouve un peu contraignant quand il s'agit de modé.
Du coup j'ai attaqué par ce code ce matin, mais il permettais seulement de superposer les axes, du coup sa marchait mais je ne trouvais pas ça assez libre.
Et en continuant de trainer cet aprem je suis tombé sur le GeRayCollider, j'ai essayé avec mais la rien ne se passe, et vuCode:activeDoc = documents.GetActiveDocument()def main(): objetBase = activeDoc.GetActiveObject()#sur quoi cliquer bouton = op[c4d.ID_USERDATA,2] #on off //bool print bouton if bouton == 1: target = op[c4d.ID_USERDATA,3] #l'objet de reference //link rotation = target.GetRelRot() #rotation du fix position = target.GetRelPos() #position du fix importation = objetBase.GetMg() #l'objet qui bouge globalPos = importation.off globalRot = importation.off print('pos objet'), globalPos print('rot objet'), globalRot objetBase.SetRelRot(rotation) objetBase.SetRelPos(position)
que je ne m'y connais pas encore assez pour savoir si c'est mon code, ou ma façon d'approcher ça qui déconne je prèfere vous demander conseil
Voila voila j'espère que tout est clairCode:from c4d import gui from c4d import documents from c4d.utils import GeRayCollider #Welcome to the world of Python activeDoc = documents.GetActiveDocument() def main(): objetBase = activeDoc.GetActiveObject()#sur quoi cliquer bouton = op[c4d.ID_USERDATA,2] #on off //bool print bouton if bouton == 1: target = op[c4d.ID_USERDATA,3] #l'objet de reference //link importation = objetBase.GetMg() #l'objet qui bouge globalPos = importation.off importation = target.GetMg() globalPosition = importation.off rc = GeRayCollider() #creer le collider rc.Init(objetBase) rc.Intersect(globalPosition, globalPos,True) pos = rc.GetNearestIntersection() print pos tracer = objetBase.SetAbsPos(globalPosition) print tracerimp = target.GetMg() globalPos = imp.off print globalPos objetBase.SetRelPos(globalPos)
Merci d'avance
Nous avons l'art afin de ne pas mourir de la verité
Je n'ai pas trop le temps de regarder ton code dans les détail, mais fais attention avec GeRayCollider il faut un objet de type polygonal. Et sinon regarde je viens de mettre un script en python en ligne dans ce post qui utilise cette fonction
Haha bon me voila revenu de mon taff, t'as bien progressé depuis ce midi :p
Voila un bout de code qui fonctionne mais pas tout le temps et bug un peu ^^'
Sinon pourquoi ne pas utiliser le snaping?
Tu as juste mettre un propriété scripting python sur un objet et a changer sourceObj et targetobj par ce que tu veux si tu préfère rajouter des User data tu peux le faire !Code PHP:
def main():
sourceobj = doc.SearchObject("Cube.1") # L'ojet qu'on veux coller'
targetobj = doc.SearchObject("Cube") # L'ojbet de support'
ray = GeRayCollider() ray.Init(targetobj, True)
start = sourceobj.GetAbsPos() #On recup la position de base
distance = 100 #100 = tout marche
ray.Intersect(start, c4d.Vector(-1, -1, -1),distance) #on projette les rayon
intersection = ray.GetNearestIntersection()#On recup l'intersection la plus proche
ray.Intersect(start, c4d.Vector(1, 1, 1),distance) #on projette les rayon
intersection2 = ray.GetNearestIntersection()
if intersection != None: #Si il y a une intersection
sourceobj.SetRelPos(intersection["hitpos"])#On modifie la position de l'objet
elif intersection2 != None: #Si il y a une intersection
sourceobj.SetRelPos(intersection2["hitpos"])#On modifie la position de l'objet
main()
Cependant t'es relou parce que ce midi j'avais pas tout capté mais en gros sa devais être(et sa sera) mon prochain plugin car même si le snapping marche c'est vrai que pouvoir déposer rien qu'avec un click c'est le top !
Dernière modification par gr4ph0s ; 23/07/2015 à 00h06.
Rhalala, vous me faites plaisir les gars !
kenavo !! // Pinterest KAMIGAZ®
J'ai update mon code pour que sa fonctionne un peu mieux(je suis sur portable donc possible que y'ai des erreurs d'indentation).
C'est pas parfait mais sa marche un peu mieux.
Haha aurety ne sois pas jaloux,un jour toi aussi tu t'y mettras !
SDK Specialist
MAXON Computer GmbH
distance = 100 #100 = tout marche
Pas sûr...
Comme distance max du rayon, il vaut mieux prendre la taille max possible entre les deux points les plus éloignés de l'objet.
Tu récupères le centre local des objets avec GetMp.
Tu les convertis en position globales en multipliant respectivement leur matrice globale par leur centre local avec Mul.
Tu calcules la distance entre les deux.
Tu récupères leur taille max possible avec GetRad, tu calcules le plus grand rayon, soit la diagonale du cube avec GetLength. Pour les deux objets
T'ajoutes ces valeurs à la distance précédemment calculée et tu devrais avoir la distance max possible entre deux points.
Bon, à vrai dire je pige pas trop le code, pourquoi il y a deux intersections et pourquoi en direction il y a vector(1,1,1) et -1 ?
Et comme dit Oli_d, faut vérifier que l'objet soit polygonal, avec objet.CheckType(c4d.Opolygon) avant d'initialiser le rayon.
Dernière modification par César Vonc ; 23/07/2015 à 10h48.
A vrai dire jai fait deux raton car avec un seul tu verras quil ce snap que d'un seul côté de l'objet. Ce qui est normal que vu que je deplace l'objet sur la premiere intersection. Du coup en rajoutant deux lancé de rayon j'arrive a un truc plus ou moins correct.(essaye sur une sphere avec 1rayon tu comprendra direct)
Humhum dac pour la distance javais lu sur un forum 100= working all the time. Mais cest vrai quen regardant sr le sdk tu as raison
SDK Specialist
MAXON Computer GmbH