PDA

Voir la version complète : Question Modélisation Poutre - Générateur Python ou C.O.F.F.E.E



Misteralex007
02/05/2016, 23h07
Bonsoir,

Etant nouveau sur cinema4D, j'ai besoin de conseille et surtout besoin éclaircissement sur le fonctionnement de deux choses sur cinema4D. Il s'agit du générateur python et aussi du langage C.O.F.F.E.E

Mon objectif est de modéliser de manière simple une poutre (un profil par carré par exemple pour débuter mais là n'est pas la question). Ainsi de manière simple je décide de prendre un cube à l'origine et de l'affinée. On un pavé c'est simple efficace.

Seulement, cette poutre déforme selon un axe et j'ai une équation précise de cette déformation par rapport à un autre axe.
Ainsi j'ai y=f(x). Du coup je cherche comment faire ça, je vois différents outils tels que "Incurvation", "Torsion et j'en passe. Mais cela ne correspond pas à mes attentes.

Par la suite, je me rappel du générateur de python, étant un très familiarisé avec ce langage, je décide de m'y lancer. Ainsi je comprends les grandes mais impossible de créer le mien.

Du coup, j’abandonne et me dirige vers un objet qui m'aspire espoir; "Formule". Objet avec 3 paramètres, je me sens soulagé, j'arrive à faire des belles courbes. Mais entrer ma formule qui est relativement longue après plusieurs termes, c'est pas très esthétique.
17797


Comme vous pouvez le voir sur le screenshot, j'essaye de déclarer des constantes afin de pouvoir les réutiliser dans la formule. Mais sans grand succès. J'ai essayé en changeant le type de ma variable( int, float) mais toujours rien.

Ainsi donc je viens vers vous pour demander votre aide. Juste comment je fais pour mettre des constantes que je pourrais utiliser dans le paramètre "PRIM_FORMULA_Y".

Si vous avez des solutions plus simple, je suis à l'écoute. De plus une fois ce problème régler, il faudrait que je puisse faire suivre un profil (carré, H, T ) qui soit parallèle un plan (dans mon cas le plan YZ) sur cette ligne, ceci me donnerai ainsi un volume.

Après le meilleur reste à venir, cela serait d'animer cette déformation.

Voilà mon objectif, je demande que des conseilles et surtout de la documentation technique claire, je suis allée sur https://developers.maxon.net/ pour lire la documentation. Malheureusement, je n'ai pas trouvé ou plutôt je me suis perdu dans toutes cette doc.

PS: Si on peut m'attendre/m'expliquer comment généré l'objet Formule avec le générateur Python et pouvoir sans les paramètres de l'objet généré en fonction de l'espace et du temps, j'en serais ravi. Je connais le python mais je connais pas les id des object cinema4D après le cube "c4d.Ocube" qui est l’exemple de base.

Je vous remercie par avance,
Cordialement,

Misteralex007

gr4ph0s
03/05/2016, 16h24
Y'a moyen d'avoir la formule que tu veux?

Sinon j'avais fait ceci http://frenchcinema4d.fr/showthread.php?80571-3D-surface-Formula mais la il s'agit de surface. Mais bon rien de bien compliqué si tu désires une spline dois y'avoir moyen de faire ça.

De plus ce n'est pas clair tu veux faire en python ou en COFFEE? :)
Pour connaitre les type d'un objets https://developers.maxon.net/docs/Cinema4DPythonSDK/html/types/objects.html?highlight=objects%20types rajoute c4d. devant et voila. Sinon tu peux simplement prendre un cube est le glisser dans la console il te donnera l'ID

Créer une spline et met lui un tag python (tu aurais très bien pu généré la spline via un python générateur). Avec le code suivant, ensuite à toi de personnaliser la formule. (j'ai mis un fichier d'exemple en pièce jointe :))


import c4d


def main():
obj = op.GetObject() #on recup la spline
points = obj.GetAllPoints() #on recup lensemble des points
yScale = 500

#pour chaque point
for i in xrange(0,len(points)):
sin,cos = c4d.utils.SinCos(3.14*i) #on calcul le sin et le cosinus

x = 50*i #on fait un décalage de 50 sur chaque points
y = yScale * sin
z = 0
points[i] = c4d.Vector(x,y,z) #on définit notre nouveau vecteur pour le points

obj.SetAllPoints(points)#on met à jours les donnéess


obj.Message(c4d.MSG_UPDATE)#on met à jours notre objet

Misteralex007
03/05/2016, 16h49
Bonjour,

Alors oui, il n'y a pas de soucis, ci-dessous le programme python, lancez et il affichera un graphique sur lequel se trouve la courbe dont je voudrais avoir pour Y(t).


import matplotlib.pyplot as plt
from pylab import *

def y(t):
E = 210*10**9 #OK
F = -2200 #OK
L = 2 #OK
P = -1100 #OK
K1 = 2933.37 #OK
K2 = 61600 #OK
K21 = -82133.37 #OK
K3 = -17600 #OK
K31 = 76266.67 #OK
a = 0.2 #OK
e = 0.005 #OK
I = (((a**4)/(12))-(((a-2*e)**4)/(12))) #OK
if (t <= 4):
return ((1/(E*I))*(((F-P*L)/6)*(t**3)+(P/24)*(t**4)+K1*t))
elif (t > 4 and t <= 6):
return ((1/(E*I))*((3*L*F*t**2)-((F/3)*t**3)+K2*t+K21))
else:
return ((1/(E*I))*(K3*t+K31))

x = linspace(0, 8, 20000)
y_vect = vectorize(y)
plot(x, y_vect(x))

show()



17818

Ainsi voici, il y a pas mal de constante.
Sinon j'ai continué mes recherches et j'ai découvert XPressso avec les boîtes, je ne sais pas si cela va me débloquer mais c'est sympa de pouvoir jouer directement avec les constantes.

Merci du temps consacré.

gr4ph0s
03/05/2016, 16h58
Avec ce que je t'es passé normalement c'est bon te reste plus qu'a refaire les fonctions de numpy (regarde du côté de c4d.utils.
https://developers.maxon.net/docs/Cinema4DPythonSDK/html/modules/c4d.utils/index.html?highlight=utils#module-c4d.utils )

EDIT:
Voici le code avec ta fonction et en gardant le même principe que tout à l'heure.


import c4d



def maFonction(t):
E = 210*10**9 #OK
F = -2200 #OK
L = 2 #OK
P = -1100 #OK
K1 = 2933.37 #OK
K2 = 61600 #OK
K21 = -82133.37 #OK
K3 = -17600 #OK
K31 = 76266.67 #OK
a = 0.2 #OK
e = 0.005 #OK
I = (((a**4)/(12))-(((a-2*e)**4)/(12))) #OK
if (t <= 4):
return ((1/(E*I))*(((F-P*L)/6)*(t**3)+(P/24)*(t**4)+K1*t))
elif (t > 4 and t <= 6):
return ((1/(E*I))*((3*L*F*t**2)-((F/3)*t**3)+K2*t+K21))
else:
return ((1/(E*I))*(K3*t+K31))


def main():
obj = op.GetObject() #on recup la spline
points = obj.GetAllPoints() #on recup lensemble des points
yScale = 300

#pour chaque point
for i in xrange(0,len(points)):
sin,cos = c4d.utils.SinCos(3.14*i) #on calcul le sin et le cosinus
x = i
y = maFonction(i) * yScale
z = 0
points[i] = c4d.Vector(x,y,z) #on définit notre nouveau vecteur pour le points

obj.SetAllPoints(points)#on met à jours les donnée


obj.Message(c4d.MSG_UPDATE)#on met à jours notre objet

A toi de jouer maintenant sur le yScale

Misteralex007
04/05/2016, 18h03
Merci beaucoup !

Mais alors donc tu coup maintenant, j'ia un objet générateur de python, avec le code que tu m'as envoyé.
Seulement, après je suis bloqué. Que dois-je faire ? Pour qu'il récupérer l'objet, d'ailleurs n'importe quelle objet cela fonctionne-t-il ?

Désolé de avec c'est question de base.

Sinon merci encore,
Cordialement,
Misteralex007

oli_d
04/05/2016, 18h27
salut,

C'est un code pour une propriété python qui doit être attachée à une spline. Tu crées une spline suffisamment subdivisée et tu fais clic droit sur le nom de la spline puis Propriétés Scripting/python et tu colles le code dedans

Misteralex007
04/05/2016, 21h39
Merci,

Du coup, j'ai créer un spline vide, ensuite j'ai mis le script python, j'ai ajouté quelques point et cela semble être bon. Par contre, j'aurais voulu savoir si on peut pas faire un truc plus propre, créer une spline disons une droite de longueur L en n subdivision et ainsi appliqué le script sur cette objet, car je dois le faire à la main, c'est pas très précis. Il doit y a voir un truc sans doute.

Merci d'avance.

Cordialement,

gr4ph0s
04/05/2016, 22h35
En fichier joint tu as tout ce que tu veux. Sélectionne le tag scripting sur la spline et va dans l'onglet "User Data" dans les attributs et t'as plus qu'a faire joue-joue ! :)

17842
J'ai un petit problème la taille n'est pas correcte. Je pense que ça vient de la façon dont python fait les arrondis mais quelqu'un peu vérifier? ^^'

Voici le code


import c4d


def maFonction(t):
E = 210*10**9 #OK
F = -2200 #OK
L = 2 #OK
P = -1100 #OK
K1 = 2933.37 #OK
K2 = 61600 #OK
K21 = -82133.37 #OK
K3 = -17600 #OK
K31 = 76266.67 #OK
a = 0.2 #OK
e = 0.005 #OK
I = (((a**4)/(12))-(((a-2*e)**4)/(12))) #OK
if (t <= 4):
return ((1/(E*I))*(((F-P*L)/6)*(t**3)+(P/24)*(t**4)+K1*t))
elif (t > 4 and t <= 6):
return ((1/(E*I))*((3*L*F*t**2)-((F/3)*t**3)+K2*t+K21))
else:
return ((1/(E*I))*(K3*t+K31))




def createVectorList(numberOfVector):
buffer = []
for i in xrange(0,numberOfVector):
buffer.append(c4d.Vector())
return buffer


def main():
obj = op.GetObject() #on recup la spline

taille = op[c4d.ID_USERDATA,1]
subdivision = op[c4d.ID_USERDATA,2]
xScale = op[c4d.ID_USERDATA,4]
yScale = op[c4d.ID_USERDATA,3]
obj.ResizeObject(subdivision) #On met à jour le nobmre de points dans notre spline avec le nombre de subdivision
points = createVectorList(subdivision)

#pour chaque point
print taille/subdivision

for i in xrange(0,len(points)):
x = (i * (taille/subdivision)) * xScale
y = maFonction(i * (taille/subdivision)) * yScale
z = 0
points[i] = c4d.Vector(x,y,z) #on définit notre nouveau vecteur pour le points

obj.SetAllPoints(points)#on met à jours les donnée




obj.Message(c4d.MSG_UPDATE)#on met à jours notre objet

Misteralex007
05/05/2016, 15h17
Merci beaucoup,

C'est bon après une extrusion contrôle j'arrive à faire ce que je souhaite.
Juste une dernière question. Si maintenant je désire animer cette spline. Par exemple avoir une droite à l'image 0 et avoir la forme voulu (via le script) à l'image X. Comment faire ?

Dois-je modifier le programme ?

Merci encore pour vos réponses

Cordialement,
Misteralex007

gr4ph0s
05/05/2016, 15h29
Joue avec le YScale. Sur chaque paramètre dans cinema4D tu as un rond click dessus ça te mettra une clé d'animation.
Du coup met toi à la frame 0 met un scale de 1 (tu obtiens une droite), puis va par exemple a la frame 20 et la change la valeur par exemple 200/300 tu verra que la couleur du rond change, ceci est pour te signifier que la valeur a changé, reclick dessus il redeviendra rouge. Clique sur play et voila tu as ton animation toute faite :)

Misteralex007
06/05/2016, 12h55
C'est bon !

Merci beaucoup !
J'en aurais appris beaucoup de choses et rapidement.

Du coup, je clos le sujet.

Cordialement,
Misteralex007