PDA

Voir la version complète : Répartition automatique de sphères



proparjak
05/03/2004, 07h24
Salut la Frenchcompagnie !
Alors j'inaugure ma première intervention sur le forum Xpresso avec un un petit casse-tête (pour moi en tout cas) afin de connaître votre avis et par la même solliciter votre aide si vous le voulez bien.
J'ai déjà trouvé la moitié de la solution grâce au site de Srek et aux PDF de Tengaal :) (merci à eux)

Voici une petite image :
http://membres.lycos.fr/proparjak/boules.gif

Le but est de répartir uniformément les 3 boules centrales peu importe l'écartement de la boule orange et marron.
Ça marche à merveille tout le temps que la boule orange n'ait pas encore bougé.
Je peux mettre la boule marron n'importe où les trois suivent et se répartissent bien.
Mais dés que c'est la boule orange, ça foire. Les actions s'inversent.

Je montre le code à cette adresse : http://membres.lycos.fr/proparjak/code.htm .
Les boules se nomment "slider" de 1 (orange) à 5 (marron).

Merci par avance de votre aide !
(je vais quand même continuer à me creuser la tête :) )

lenogre
05/03/2004, 10h27
Il me semble que le plug Align Assistant le fait à merveille (depuis la 8, c'est une expression). Un plug indispensable à mon avis.

proparjak
05/03/2004, 13h50
:o
:D
Merci lenogre, je vais regarder ce plug providentiel !

proparjak
05/03/2004, 14h02
:oops: :oops:
C'est exactement ça... J'ai honte.

Je crois quand même que j'essaierai de le faire par défi ! :twisted:

Merci encore ;)

Tengaal
05/03/2004, 14h05
Ton truc n'est pas trop compliqué à mettre en place si j'ai bien tout compris...
Tu veux aligner les 3 boules grises de manière équilibrée su une ligne imaginaire qui relies la boule orange à la boule marron.

- la base (référence) de placement des 3 boules = position_globale_orange
- la ligne imaginaire (vecteur) est Direction = position_globale_marron - position_globale_orange
- les positions:
boule 1 = position_globale_orange+direction*(1/4)
boule 2 = position_globale_orange+direction*(1/2)
boule 3 = position_globale_orange+direction*(1/3)

Si tu bloques toujours je te fais le truc. :wink:

proparjak
05/03/2004, 14h11
Super, merci de ton aide Tengaal et merci de ta proposition :poucehaut:

Logique et simple.
Je vais donc utiliser Coffee et je préfère autant car un autre défi viendra après, qu'AlignAssistant ne pourra résoudre.
Mais commençons par le commencement et rendez-vous bientôt ;)

Tengaal
05/03/2004, 14h12
Je viens à l'instant d'éditer mon post car il y avait encore plus simple et plus rapide. :wink:

proparjak
05/03/2004, 14h15
ah... oui.
Ça fait un calcul en moins. Merci :)

Tengaal
05/03/2004, 15h04
C'est ICI (http://tengaal.free.fr/fc4d/xpresso/aligne_boules.c4d) si tu en as marre de chercher :wink:

proparjak
05/03/2004, 15h40
:shock: :D
Merci Tengaal. C'est vraiment gentil. Je vais regarder le code, l'étudier et essayer de le reproduire. :art:

tabou
05/03/2004, 16h46
Sinon, pour les feignants comme moi il y a le nœud Mélanger qui est bien pratique :wink:

http://tabou.free.fr/tabou/XPresso/melanger.png

Il faut les règler sur Vecteur et changer le facteur de mélange comme indiqué dans la capture.

Tengaal
05/03/2004, 18h05
Ah oui, tiens, ce noeud "Mélanger" fait la même chose, à savoir obtenir une position entre 2 valeurs ! :poucehaut:
Bien vu Tabou ! :prie:

Je ne connaissais pas...
Trop feignant pour explorer les noeuds Xpresso ! :lol:

proparjak
05/03/2004, 18h26
Merci Tabou. :D

Je n'ai pas encore regardé ta méthode Tengaal, mais à priori celle de Tabou pourrait peut-être convenir, par l'utilisation de ce noeud, pour la deuxième partie du "problème" aussi.
A savoir : en fonction du rapprochement des deux boules d'extrêmité, qui ne sont en fait que les enfants visibles des sliders (ce sont bien les sliders que je veux répartir) les boules montent jusqu'à la hauteur maximum de ces sliders.
Je vous tiens au courant :)

Merci encore.

proparjak
05/03/2004, 23h49
Je viens de regarder ton fichier Tengaal Et ça fait le même problème que pour mon fichier.
Tout est ok lorsque l'on bouge bouleB mais c'est la catastrophe en bougeant bouleA...
C'est encore un peu obscur pour moi cette histoire de vecteur.
Je vais essayer la méthode Tabou pour voir... :art:

Et je vous donne des nouvelles ;)

Merci.

Tengaal
05/03/2004, 23h54
Ah oui tiens, bêtement je n'avais même pas vérifié en bougeant la boule orange, le système me paraissait parfaitement logique, je ne me suis même pas posé la question... :oops:
Je vais essayer de comprendre d'où vient ce problème, et puis je vais essayer le truc de Tabou.

proparjak
06/03/2004, 00h01
La méthode de tabou donne ce truc rigolo :)
http://membres.lycos.fr/proparjak/boules1.gif

Tengaal
06/03/2004, 00h14
Pour moi la méthode du maître des noeuds :wink: marche très bien et c'est très simple à utiliser.
Le truc qui déconne avec ma méthode c'est la manière dont C4D fait des calculs sur des vecteurs, notamment multiplier un réel par un vecteur, ça ne donne pas ce qu'il faudrait, mais bon...

proparjak
06/03/2004, 00h28
Désolé Tabou et Tengaal.... Je n'avais pas réglé mes mélangeurs sur vecteur...

Merci à vous deux ! J'ai appris déjà plein de choses ! :prie:
Je passe à l'autre étape :)

proparjak
06/03/2004, 16h33
Alors je suis proche de la solution... :)
Hier, après une soirée des plus intensives (imaginez deux neurones bouger pour la première fois depuis des années), je suis allé me coucher tout content d'avoir réussi :
http://membres.lycos.fr/proparjak/boules2.jpg

Mais...
En rouvrant mon fichier aujourd'hui, surprise : les boules sont constamment au maximun de leur hauteur peu importe l'écartement.
Qu'à cela ne tienne, je trouve le problème : rafraîchir ma distance de base en cochant et décochant un DU.
Voici l'adresse de l'image de l'Xpresso pour mieux expliquer : Code expresso (clic droit - enregistrer sous...) (http://membres.lycos.fr/proparjak/code2.gif).

Bref tout fonctionne à merveille à nouveau bien qu'il faille trouver quelquechose d'automatique pour avoir ma valeur de base.
Je lance l'animation dans l'éditeur, c'est renversant de beauté :P

Mais... (encore :roll: )
Déjà je ne comprends pas pourquoi ça fonctionne :lol:
Parce que la difficulté était d'avoir les boules au maximum de leur hauteur quand l'écartement des sliders d'extrêmité étaient à la moitié de la distance de base définie auparavant.
Je ne pense pas avoir fait quoique ce soit dans ce sens mais ça fonctionne.
Quand je suis à 100% et plus de l'écartement, les boules sont à 0 % de la hauteur qu'il doivent avoir.
Bref ça fonctionne, c'est merveilleux... mais pourquoi ? :o

Ensuite, et là c'est plus problématique, quand je fais un export quicktime. Ça ne marche pas : http://membres.lycos.fr/proparjak/preview.zip. (clic droit/enregistrer sous..)

Je vais chercher mais si vous avez envie de m'aider (ou de me fouetter :mrgreen: ), ce serait très sympa ! Merci !

Tengaal
06/03/2004, 19h22
Ah d'accord, c'est pour faire une espèce de ver de terre de la mort qui tue sa race ! :lol:
Je pense qu'il faut que tu définisses une distance de base entre la boule orange et la boule marron.

- Si l'écart entre ces boules est supérieur, alors on a l'effets d'étirement, toutes les boules sont sur une ligne droite et répartie de manière équilibrée (25%,50%75%)

- Si l'écart est inférieur, alors les écarts entre chaque boules sont fixes (distance de base / 4 ), ce qui provoque la courbure de la bestiole.

C'est le même principe que pour la simulation dynamique du tissus, on peut l'étirer par rapport à son état au repos (élasticité: les écarts entre les points du maillages varient) mais également le froisser (plis: les écarts entre les points sont constant, ils se chevauchent et forme des courbes).

Tu peux partir du principe que ton ver est un triangle avec une base variable qui fait varier la hauteur de manière inversement proportionnelle:
- si base = 0% alors hauteur =100%
- si base = 50% alors hauteur = 50%
- si base = 100% alors ahuteur = 0%

proparjak
06/03/2004, 19h35
Oui :)
C'est précisément l'Xpresso que j'ai créé et ça marche mais pas lors de l'export quicktimme... ce qui est vraiment bizarre.
Mais peut-être est-ce dû à la faiblesse de mon script sur la récupération de la valeur de base.
Comment puis-je faire (en Xpresso) pour récupérer cette valeur pour en faire une variable constante et ce, même si je dois redimensionner mon ver ?
Je m'explique : mon ver fait une taille 1, ce qui me donne une distance de 100 m par exemple. Cette distance va être ma valeur de base et je pourrais jouer entre les boules d'extrêmité pour calculer le pourcentage par rapport à cette distance de base.
Mais dans une autre scène, afin de l'intégrer à un décor d'une autre proportion, je serai peut-être obligé de lui donner une taille de 0.5 et donc ma valeur de base devient 50 m pour la variable constante.
Et à partir de cette nouvelle valeur, je calculerai le pourcentage.

Bref il faut une valeur constante mais "flottante" que je compare à la distance entre les deux boules.

En tout cas merci de te pencher sur mon problème. c'est vraiment gentil de ta part :D

Tengaal
06/03/2004, 19h38
Tu as le noeud "constante" (dans Xpresso->Généralités) qui peut contenir n'importe quelle valeur de manière fixe.
Ou bien avec une autre DU pour définir cette distance...

proparjak
06/03/2004, 19h45
oui, mais qui n'a pas de point d'entrée.

Peut-être bien en passant par un DU effectivement... Je vais essayer. Merci.

*** edition ***

En fait je passe déjà par un DU qui fixe bien ma valeur. Je voulais juste savoir comment faire un systéme automatique (toujours le même problème : se casser la tête pour en faire moins :P)

Si ça ne marche pas lors de mon rendu quicktime, c'est parce que ma méthode de calcul est mauvaise je crois.
Ce qui me semble logique tellement je suis étonné de voir que ça fonctionne dans la fenêtre de prévisualisation... :mrgreen:

proparjak
07/03/2004, 01h27
Hé bien voilà une petite vidéo avant de passer la soirée en famille : http://membres.lycos.fr/proparjak/ver.zip (clic droit/enregistrer sous..).

But atteint :) Merci beaucoup de votre aide !!

Mais ce n'est pas fini ! :mrgreen:
Pour la suite, j'ai l'intention d'utiliser les sphères comme points de référence pour bâtir une chaîne d'os.
Ou je pensais également à créer un spline, s'il est possible à des portions de spline d'y poser des tags de restriction.
Tout ceci afin de créer un squelette pour l'animation d'un vrai ver.

Bref ! Va falloir potasser :roll: :)

Fluffy
07/03/2004, 01h39
Bravo Proparjak, c'est très convaincant!
Et tu peux très facilement affecter l'Xpresso à des objets neutres qui vont, eux, contrôler ta chaîne d'os.
Ça va asticoter dur :mrgreen:

Bravo pour ta persévérance.

proparjak
07/03/2004, 01h45
oui Fluffy ! la motivation soulève des montagnes :mrgreen:

Merci de tes encouragements et de tes indications :)

proparjak
07/03/2004, 04h49
J'explique quand même : la fixation fonctionne très bien avec un DU. Il me suffit de l'initialiser en deux frames avant l'animation.
Ensuite, c'est très simple comme on le disait plus haut. Le truc était de trouver son application dans l'interface Xpresso.

Voici le fichier (http://membres.lycos.fr/proparjak/essai8.c4d), ça sera plus simple qu'une tonne d'explications, à décortiquer, voire à triturer et ça profitera à tous.
(Partage avec l'accord de Fluffy)

tabou
07/03/2004, 13h12
Et en adaptant un peu ton XPresso (déplacement latéral à la place du déplacement vertical) on doit pouvoir faire facilement un serpent qui ondule :D

proparjak
07/03/2004, 15h05
Oui :)
En tout cas, ce serait une bonne base car le mouvement du serpent est complexe et donc doit être dur à mettre en place.

Je pencherais plus sur un slider comme a pu le faire Yasuhiro Nishi avec SplineTrainNode1.5 (http://www.linkclub.or.jp/~westy/tools/xpresso/xpresso_archives01.html).

Aurety
07/03/2004, 15h27
hehe, proparjack, on goute aux joies de Yasuhiro Nishi ?? Bravo ton expérimentation XPresso, Proparjack, c'est super intéressant ! :efface:

proparjak
08/03/2004, 06h44
Merci Aurety ! Voici l'application directe du sytème.
J'ai du m'armer de deux plugins pour ça.
En fait les sphères me servent de points par lesquels passe une spline linéaire.
J'applique ensuite un plug qui me permet de coller des bones au spline.
C'est un peu complexe et je suis pas trop content du résultat (il y a des déformations).
Bref c'est encore à travailler.
En fait, j'aimerais faire quelquechose de plus simple et pour cela, quelqu'un connaît-il la façon de donner à un os enfant la propriété de contraindre la chaîne parente à ne pas pouvoir une position x, y ou z au besoin ?

Voici la video (http://membres.lycos.fr/proparjak/asticot.zip) : Il y a quand même eu du progrès :mrgreen:

Fluffy
08/03/2004, 09h13
Pourquoi n'utilises-tu pas tout simplement des objets neutre en guise de cible pour tes os, au lieu d'une spline?

Bon début sinon! :efface:

proparjak
08/03/2004, 14h24
Merci Fluffy,

C'est ce que j'ai fait au départ et ça donne de bons résultats sauf pour la queue où l'avant-dernier os traverse le sol et èmmène du coup la queue sous le sol.
C'est pour ça que je voulais savoir s'il y avait moyen de donner au dernier os le pouvoir de bloquer sa position en contraignant les os parents.

Maha
08/03/2004, 15h15
je suis en silence depuis le début .. n'ayant rien à dire d'utile .. mais là je craque ..

je suis impressionné ! bravo prop's !! ça c'est un chtit gars qui n'en veux !!

Fluffy
08/03/2004, 15h16
Attention, pour le dernier os il te faut 2 cibles en fait, pour pouvoir l'orienter et le garder dans la même orientation. Par contre, je suis sûr que tu peux lui coller un Xpresso qui le contraigne aussi, ça peut être marrant à créer...

proparjak
08/03/2004, 15h46
Merci Jah :D
Rien ne résiste au pouvoir de l'asticot :lol:

Oui Fluffy :)
Je penche plus pour la solution de l'Xpresso car des cibles n'ont pas assez de contrôle. Ça pourra être utile aussi pour une certaine canne à pêche 8)

proparjak
09/03/2004, 14h18
Salut tout le monde. :)
J'envoie ce post comme une bouteille à la mer...

Finalement ce que je cherche à faire n'est ni plus ni moins qu'une cinématique inverse avec contraintes de direction pour les os.
Après avoir bidouiller de l'Xpresso et du COFFEE :roll: , j'ai essayer d'utiliser les tags et expressions de cinematique de Mocca.

Je suis parvenu à un résultat moyen avec ces derniers.
Donc je repense à utiliser COFFEE.
J'ai tenté de modifier la cinematique inverse de Wesware mais ça ne donne aucun résultat satisfaisant.

Je demande donc votre aide chers Maîtres du café :P

Voici ce que ça fait et ce que cherche à faire (en dessin bleu par dessus) :
http://membres.lycos.fr/proparjak/cinematique.gif

Merci d'avance à ceux qui m'aideront :wink:

Aurety
09/03/2004, 14h29
Juste un clamper ne suffirait pas ??

proparjak
09/03/2004, 15h27
non, ou alors associé à une cinématique inverse.
Sinon l'os reste à peu près à le même place et "tremble" car il subit les contraintes des os parents :o

Fluffy
09/03/2004, 16h59
Attention Proparjak avec cette contrainte sur Y, car elle va minimiser ta liberté de mouvements.. Contraints plutôt ton Os à un objet plan, comme ça tu peux jouer sur le niveau du plan et lui faire faire d'autres choses (monter un escalier par ex..).

proparjak
09/03/2004, 17h06
Tu as raison Fluffy.
En fait, au lieu de le contraindre à 0 (je me suis mal exprimé) je le contraignais à la position globale de la sphère.
Et c'est là où mon os tremble... ça doit être un vieil os :mrgreen:

proparjak
12/03/2004, 16h17
Je lance à nouveau un gros HELP ! :)

Après parcouru les méandres du cybermonde, traverser les océans d'octets, combattu les virus les plus immondes, ma quête se termine par un échec. :P
Et c'est pour ça que je demande aux experts de FC4D, comme un affamé demandant un bon pain chaud à quelque seigneur, d'éclairer ma lanterne...

Je voudrais faire une expression coffee qui teste la position globale Y de mon dernier os avec la position Y de la dernière boule : si différent fixation de la position Y de tous les os parents ; si pas différent, roule cocotte... :)
En fait je ne parviens pas à trouver la commande : position globale d'un os. Pour le reste je vais me le taper bien sûr :mrgreen:
Merci de toute aide :D

tabou
12/03/2004, 18h32
Pourquoi le faire en coffee ? :roll: c'est tellement simple à faire en XPresso :wink:

proparjak
12/03/2004, 19h03
J'ai trop peu encore d'expérience en coffee et en xpresso, Tabou, pour pouvoir comparer :wink:
Et puis, j'ai vu, dans mes recherches sur le web, que prendre la position globale d'un os était possible en coffee (pas retrouvé l'info depuis :( )... est-ce qu'on le peut avec la matrice globale de l'os dans Xpresso, pour en ressortir la position globale de Y ?

Dans ce cas, effectivement un clamper serait peut-être suffisant... :)

tabou
12/03/2004, 19h25
Pour clamper directement avec XPresso ça donne ça :
http://tabou.free.fr/tabou/XPresso/clamper.png
Si tu veux que le minimum et le maximum varient en fonction d'autres objets il te suffit de les relier comme ça :
http://tabou.free.fr/tabou/XPresso/clamper2.png
et voilà :D

proparjak
12/03/2004, 19h28
:D
Super ! c'est très gentil à toi Tabou !
Je vais essayer ça ce soir...
:poucehaut:

proparjak
15/03/2004, 22h24
Je lance un gros help ! :cry2:

Parce que j'ai passé tout mon week à trouver une solution... je me suis même bouffer de la trigonométrie :o

je cherche desespérément un moyen de calculer l'angle de l'avant-dernier pour que le dernier soit tout le temps dams la même position Y que la dernière boule.

(Pour comprendre, j'ai fait une image dans un post plus avant)

Merci de tout aide ! :love:

:coup:

Majoul
15/03/2004, 23h29
salut proparjak

Pour acceder a la position d'un objet en Coffee il faut passer par sa Matrice
tu créé un noeud coffee avec une entrée de type lien pour ton objet

main()
{
var matrice = objet->GetMg(); // on accede a la matrice
var position = matrice->GetV0() // on accede a la position (vecteur)
// aprés si tu veut les valeurs x,y,z
var ma_valeur_x = position.x ;
var ma_valeur_y = position.y ;
var ma_valeur_z = position.z ;

}

voila comment on accede a la position global d'un objet en coffee

proparjak
16/03/2004, 02h59
Merci beaucoup Majoul :)
Je me garde ces renseignements sous le coude car j'en aurai très certainement besoin.

J'essaie d'aller au bout de mon Xpresso. Ça serait bien que je puisse le traduire en COFFEE par gageure.
Donc merci ! :poucehaut:

Voici le "probleme" : tout d'abord une image.
http://membres.lycos.fr/proparjak/probleme.gif
C'est un peu fouillis mais j'espère que ce sera "lisible" quand même :)
Donc le but est de ramener la pointe de mon os à la position Y de sphere5.

Pour cela, j'ai adopté le la methode du calcul d'un angle "ah" au moyen de son cosinus.
Comme vous pouvez le voir, l'Xpresso prend donc la distance "a" qui la distance entre sphere5 et l'os (cela donne le côté adjacent).
Enfin nous avons l'hypothénus qui est la longueur de l'os.

Je calcule donc le cosinus en appliquant la formule "cos(angle)=côté adjacent / hypothénus".

Mais deux questions se posent : cette méthode est-elle une hérésie ?
et impossible de trouver la formule qui me permet de connaître la valeur en degrés depuis le cosinus ; quelle est-elle ?

Je pourrais ainsi appliquer cette valeur à l'os.

Ca fait longtemps que je n'ai pas touché à la trigonométrie. :P
Si quelqu'un pouvait m'aider, ce serait excellent :poucehaut:
Merci d'avance ! :D

proparjak
16/03/2004, 05h51
Voici quelques liens, résultats de mes recherches.

Les bases de la trigonométrie
http://www.trigofacile.com/trigo/
http://www.alphaquark.com/Mathematique/Trigonometrie.htm
http://membres.lycos.fr/villemingerard/Analyse/Trigo.htm
Ça m'a pas mal aidé à comprendre certains principes

Les bases du mariage COFFEE-Xpresso :
http://www.peranders.com/c4d8/tute/tutcofnode.html

Calculateur et convertisseur :
http://www.mathepower.com/francais/sincostan.php
http://www.couvrir.com/unite/index1.htm

Et le pompon pour les matheux/programmeurs amateurs de jolis formes aux multiples applications :
http://www-groups.dcs.st-and.ac.uk/~history/Curves/Curves.html

Voilà :)

Majoul
16/03/2004, 20h07
salut proparjak

Merci pour les liens, il y a des information intéressantes pour ceux qui veulent se rafraîchir la mémoire. Je t’avoue que la trigonométrie a une place importante dans les expressions.

Si tu cherche à trouver la valeur d'un angle à partir de son cosinus ou sinus il suffit d'utiliser le nœud trigonométrie qui se trouve dans Xpresso --> calculer --> trigonométrie et tu choisi la fonction adéquate.
- si tu as le cosinus de l’angle utilise la fonction Acos pour avoir l’angle en sortie
- idem pour sinus --> Asin
- idem pour tangente --> Atan
la valeur de l’angle résultante est exprimé en Radian , pour l’avoir en degrés il suffit de la convertir avec le nœud degrés qui se trouve aussi dans calculer.

proparjak
16/03/2004, 20h40
Majoul, tu réponds parfaitement à ma question.
Et je n'avais même pas pensé que acos donnait un résultat en radians :roll: :oops:

Je vais essayer cela ce soir et je donnerai des nouvelles

Merci beaucoup :D :poucehaut:

proparjak
23/03/2004, 16h41
Salut à tous !
Alors mon petit truc avance bien... mais ! :lol:

Le calcul mis en place fonctionne.
Le problème viendrait (?) du rafraichissement de l'expresso.

J'ai lu quelque part que le COFFEE faisait sa routine avant de valider toutes les positions des objets à chaque frame.
Est-ce qu'Xpresso fait la même chose ?

Quand j'avance manuellement le curseur, l'xpresso me donne à chaque fois un résultat exacte, mais quand je raccorde le résultat à la rotation du dernière os, celui-ci fait n'importe quoi :o

Est-ce que quelqu'un a déjà rencontré ce problème ?

Merci d'avance de tout aide.

- une solution me vient à l'esprit : utiliser finalement COFFEE pour comparer -

tabou
23/03/2004, 16h58
Certains problèmes de rafraichissement peuvent être résolus en mettant la priorité de l'expression sur "Animation", fais un essai pour voir si cela règle ton problème.

proparjak
25/03/2004, 03h02
Merci Tabou.

Mais ça ne marche pas. :wink:
Ce n'est pas grave car j'ai le regret de vous dire que j'abandonne après avoir adapter l'Xpresso en COFFEE.
Ça réagit au quart de tour mais pas avec les bons angles alors qu'il me semble bien l'avoir adapté conformément.
De plus, par une erreur de manip' j'ai perdu mon fichier avec l'xpresso.
Bref la mouise totale. (c'est pas trop grave, je pourrais le refaire sans problème)
Enfin, j'ai eu un coup de main de Fluffy, pour trouver une solution en cinématique inverse qui fonctionne à merveille.

MAIS... ce travail m'a permis d'apprendre beaucoup de choses et je voulais vous remercier tous d'avoir suivi ce topic et particulièrement un grand merci à tous ceux qui sont intervenus et m'ont aidé.
Vos efforts n'ont pas été vains, loin de là.

:love: