PDA

Voir la version complète : Les aiguilles d'une montre !...



Phi²
22/05/2010, 01h34
Bonjour à tous ! Plutôt bonsoir, pour ceux qui comme moi glandouille sur le net à cette heure un vendredi soir !
Hum hum je vous sens interloqués à la vue de ce sujet, n'ayez pas peur tout va bien se passer lol.

Il y avait bien longtemps que je n'avais pas créé de sujet, ni même participé à la vie de ce forum...depuis mes tout premiers débuts en 3D à vrai dire :art:

Bref, je vous la fait courte...Je "travaille" (c'est plus un loisir qu'un travail en fait^^) en ce moment à la création d'une montre, ma montre à moua que ma chérie m'a offert :D, et il m'est venu une idée, mais je ne sais pas si elle est réalisable:

-En gros serait-il possible de faire en sorte que, si on écrit (je ne sais pas où on pourrait l'écrire, c'est un peu flou pour moi^^) une date précise avec une heure précise (22/06 à 1h17m26s par exemple), les aiguilles de ma montre s'orientent de façon automatique à la date et heure précisée ?

Je n'y connais rien du tout en Xpresso mais intuitivement il me semble que c'est ce qu'il faut utiliser pour obtenir ce genre de.....relation on va dire, entre deux paramètres (et là encore je ne sais pas ce que je dis ! mes yeux commencent à devenir collant, c'est surement signe que mon cerveau n'est pas dans sa meilleure forme, bien qu'il n'y ait pas de lien de cause à effet... :arg:)

Pfiou assez laborieux comme explications je trouves, j'espère avoir été clair néanmoins...
Merci d'avance pour votre aide, à bientôt :odile:

PS: Petit aperçu du projet sortant de sa coquille...
http://img413.imageshack.us/img413/4366/61055377.jpg

Aurety
22/05/2010, 11h15
Elle est magnifique ta montre !! Pour ton script, va voir du coté de Mazab http://www.zabiegly.com/xpresso/ , il y a exactement ce que tu cherches. :odile:

Phi²
22/05/2010, 11h31
Tout d'abord, merci du compliment :mrgreen: et puis merci pour ton efficacité, jpensais pas trouver une réponse aussi rapidement ^^
J'ai téléchargé le script avec le tuto, c'est pas vraiment ce que j'imaginais mais ça fera l'affaire!
Je m'y met dans la journée et jvous tiens au courant :art:

Phi²
22/05/2010, 14h38
Fiouuuuuuu... C'est pas simple c'est le moins qu'on puisse dire :S...
J'ai un peu (beaucoup) de mal à créer le script Xpresso, alors j'ai utilisé celui de la scène fournie avec le tuto, et je l'ai adapté aux aiguilles de ma montre, mais c'est pas encore ca du tout!...

Déjà, je peux abandonner mon idée pour que les aiguilles des cadrans "Jour de la semaine + Date + Heure de la journée" se mette au bon endroit :/
Ensuite, je veux bien m'adapter au script, le soucis c'est que l'aiguille des heures bouge de 5° toutes les 60minutes. Et j'imaginais une scène de 86 400 frames correspondant à chaque seconde de la journée, or là c'est 2 fois plus rapide (1h = 1800frames), changer le FPS ne résout rien...

Bref, je galère un peu^^un coup de main serait le bienvenu :grin:

Tengaal
22/05/2010, 16h21
le cas d'école des aiguille de montre, un classique ! :wink:

voilà un bout de code COFFEE pour gérer la rotation des aiguilles heures/minutes :

// définition de l'heure actuelle de la machine:
var heures=GeGetSysTime()->hour; // on extrait les heures de l'horloge systeme
var minutes=GeGetSysTime()->minute; // et les minutes
var secondes=GeGetSysTime()->second; // et les secondes si on veut gérer une trotteuse...

// on définit les objets à piloter en rotation Y
var aiguille_minutes=doc->FindObject("Aiguille des minutes");
var aiguille_heures=doc->FindObject("Aiguille des heures");

// on définit les rotations des aiguilles, avec une conversion en Radians
// on ajoute 90° pour que le 12 de l'horloge soit aligné sur Z+
// le signe - est là pour que le sens de rotation soit correct (sens horaire)
var angle_minutes=Radians(90-minutes*6); // 6 degrés par minute -> 360 degrés pour 60 minutes
var angle_heures=Radians(90-(heures*30+minutes/2)); // 1h=30 degrés, on ajoute un mouvement intermédiaire de 60min/2 = 0 à 29.5°

// on définit les rotations:
aiguille_heures->SetRotation(vector(angle_heures, 0, 0)); // rotation H, P, B equivaut à Y, X, Z
aiguille_minutes->SetRotation(vector(angle_minutes, 0, 0)); // rotation H, P, B equivaut à Y, X, Z

sur ce petit exemple il est simple d'ajouter la gestion de l'aiguille des secondes, tout est une question d'angle.

voilà déjà un peu d'aide sur ton projet. :poucehaut:

hokku
22/05/2010, 16h37
Je n'ai pas de réponse a ton problème, mais je passe juste pour dire que la modélisation de ta montre est vraiment superbe :love:

Phi²
22/05/2010, 16h50
Hmmm très intéressant tout ça dis-moi ! C'est pas vraiment ce que je voulais faire à la base, mais c'est plutôt cool :poucehaut:
J'ai remarqué qu'il manquait les paramètres pour que l'aiguille des secondes bouge par contre, alors je me suis permis de rajouter quelques lignes, mais visiblement y'a une erreur à la ligne 22


main(doc,op)
{// définition de l'heure actuelle de la machine:
var heures=GeGetSysTime()->hour; // on extrait les heures de l'horloge systeme
var minutes=GeGetSysTime()->minute; // et les minutes
var secondes=GeGetSysTime()->second; // et les secondes

// on définit les objets à piloter en rotation Y
var aiguille_minutes=doc->FindObject("Aiguille des minutes");
var aiguille_heures=doc->FindObject("Aiguille des heures");
var aiguille_secondes=doc->FindObject("Aiguille des secondes"); J'ai ajouté celle là

// on définit les rotations des aiguilles, avec une conversion en Radians
// on ajoute 90° pour que le 12 de l'horloge soit aligné sur Z+
// le signe - est là pour que le sens de rotation soit correct (sens horaire)
var angle_minutes=Radians(90-minutes*6); // 6 degrés par minute -> 360 degrés pour 60 minutes
var angle_heures=Radians(90-(heures*30+minutes/2)); // 1h=30 degrés, on ajoute un mouvement intermédiaire de 60min/2 = 0 à 29.5°
var angle_minutes=Radians(90-secondes*6); // 6 degrés par seconde -> 360 degrés pour 60 secondes J'ai ajouté celle là

// on définit les rotations:
aiguille_heures->SetRotation(vector(angle_heures, 0, 0)); // rotation H, P, B equivaut à Y, X, Z
aiguille_minutes->SetRotation(vector(angle_minutes, 0, 0)); // rotation H, P, B equivaut à Y, X, Z
aiguille_secondes->SetRotation(vector(angle_secondes, 0, 0)); // rotation H, P, B equivaut à Y, X, Z J'ai ajouté celle là qui bug visiblement

// on définit l'heure du texte "00:00:00"
var txt_heure, txt_minute,txt_seconde; // variable pour les textes HH:MM:SS

if (heures<10) txt_heure="0"+tostring(heures)+":";else txt_heure=tostring(heures)+":"; // on utilise 2 caractère à chaque fois
if (minutes<10) txt_minute="0"+tostring(minutes)+":";else txt_minute=tostring(minutes)+":"; // idem
if (secondes<10) txt_seconde="0"+tostring(secondes);else txt_seconde=tostring(secondes); // idem

var heure_digit=doc->FindObject("heure texte")->GetDown(); //objet enfant de l'extrusion = spline texte.
heure_digit#PRIM_TEXT_TEXT=txt_heure+txt_minute+tx t_seconde; // on actualise l'heure affichée



}

"Variable or function expected"
Alors qu'il n'y a ni variable ni fonction sur la ligne de dessus

Je ne sais que faire pour la réparer :bave:

Phi²
22/05/2010, 16h54
Merci hokku, le rendu n'est pas parfait pourtant, ya quelques bugs de modé, je posterais d'autres rendus si ca vous dit :wip:

Rudy
22/05/2010, 21h36
..., je posterais d'autres rendus si ca vous dit :wip:


Ben oui que ça nous dit. On sent déjà bien le volume et presque le poids du métal :poucehaut:

Phi²
23/05/2010, 01h00
Et bien me revoilà pour le dernier rendu de la journée, j'ai pas tellement avancé en modélisation, mais j'ai réglé quelques problèmes existant... :coup: mais ya toujours un foutu reflet pas cohérent ! Saurez-vous trouver lequel? lol...

http://img99.imageshack.us/img99/1537/23596066.jpg
http://img204.imageshack.us/img204/4250/76846308.jpg

Pfiou dommage aussi que je n'ai pas assez de sousous pour m'offrir VrayForC4D obligé de supporter ce logo sur tout mes rendus :nono: Quelqu'un se dévoue pour m'acheter une license? :love:
Sur ce, bonne nuit ;)

tarlack
23/05/2010, 06h55
tu t'es viandé dans ton copier-coller de code :


var angle_minutes=Radians(90-secondes*6);


faudrait que ce soit


var angle_secondes=Radians(90-secondes*6);


jolie modélisation sinon :)

Phi²
23/05/2010, 12h19
Ça marche ouai merci, sa sautait tellement aux yeux que je l'ai pas vus :mrgreen:
Donc voici le bout de code final


main(doc,op)
{// définition de l'heure actuelle de la machine:
var heures=GeGetSysTime()->hour; // on extrait les heures de l'horloge systeme
var heurejour=GeGetSysTime()->hour; // on extrait les heures de l'horloge systeme
var minutes=GeGetSysTime()->minute; // et les minutes
var secondes=GeGetSysTime()->second; // et les secondes
var jour=GeGetSysTime()->day; // et le jour
var jourdelasemaine=GeGetSysTime()->day; // et le jour de la semaine la variable est normalement 'DayOfWeek' mais elle n'est pas reconnue

// on définit les objets à piloter en rotation Y
var aiguille_minutes=doc->FindObject("Aiguille des minutes");
var aiguille_heures=doc->FindObject("Aiguille des heures");
var aiguille_heurejour=doc->FindObject("Aiguille de l'heure du jour");
var aiguille_secondes=doc->FindObject("Aiguille des secondes");
var aiguille_jour=doc->FindObject("Aiguille des jours");
var aiguille_jourdelasemaine=doc->FindObject("Aiguille du jour de la semaine");

// on définit les rotations des aiguilles, avec une conversion en Radians
// on ajoute 90° pour que le 12 de l'horloge soit aligné sur Z+
// le signe - est là pour que le sens de rotation soit correct (sens horaire)
var angle_minutes=Radians(90-minutes*6-secondes*0.1); // 6 degrés par minute -> 360 degrés pour 60 minutes
var angle_heures=Radians(90-(heures*30+minutes/2)); // 1h=30 degrés, on ajoute un mouvement intermédiaire de 60min/2 = 0 à 29.5°
var angle_heurejour=Radians(90-(heures*15+minutes/4)); // 15 degrés par heure -> 360 degrés pour 24 heures
var angle_secondes=Radians(90-secondes*6); // 6 degrés par seconde -> 360 degrés pour 60 secondes
var angle_jour=Radians(90-jour*11.613); // 11,6 degrés par jour -> 360 degrés pour 31 jours
var angle_jourdelasemaine=Radians(90-jourdelasemaine*51.43); // 51,43 degrés par jour -> 360 degrés pour 7 jours

// on définit les rotations:
aiguille_heures->SetRotation(vector(angle_heures, 0, 0)); // rotation H, P, B equivaut à Y, X, Z
aiguille_heurejour->SetRotation(vector(angle_heures, 0, 0)); // rotation H, P, B equivaut à Y, X, Z
aiguille_minutes->SetRotation(vector(angle_minutes, 0, 0)); // rotation H, P, B equivaut à Y, X, Z
aiguille_secondes->SetRotation(vector(angle_secondes, 0, 0)); // rotation H, P, B equivaut à Y, X, Z
aiguille_jour->SetRotation(vector(angle_jour, 0, 0)); // rotation H, P, B equivaut à Y, X, Z
aiguille_jourdelasemaine->SetRotation(vector(angle_jour, 0, 0)); // rotation H, P, B equivaut à Y, X, Z


}

Je suis plutôt content du résultat, 5 aiguilles sur 6 tournent à la perfection, le seul truc manquant c'est la variable du jour de la semaine (Dimanche=1, Lundi=2...etc)...

Ah oui aussi! Question: Comment obtenir une animation ??? étant donné que c'est du temps réel c'est possible?

Tengaal
24/05/2010, 11h18
c'est possible qu'il ait eu quelques bug dans mon bout de code, c'est une partie d'un programme complet que j'ai extrait sans forcément vérifier si toutes les variables étaient bien définies. :oops:

pour me faire pardonner :roll: :lol: voici un bout de code qui permet de connaitre le nom du jour qui correspond à une date donnée.
les calculs aboutissent à une valeur entre 0 et 6 (lundi à dimanche). Ce script prend en compte l'année bissextile ou non.

main(doc,op)
{
// obtenir le jour de la semaine d'après une date donnée entre 1900 et 2999


// jour, mois et année donnée par l'utilisateur exemple : 24/05/2010
var j=24;
var m=5;
var a=2010;


// on initialise le tableau des 7 noms de jours
var nom_jour=new(array,7);
nom_jour[0]="Samedi";
nom_jour[1]="Dimanche";
nom_jour[2]="Lundi";
nom_jour[3]="Mardi";
nom_jour[4]="Mercredi";
nom_jour[5]="jeudi";
nom_jour[6]="Vendredi";

var bissextile=0; // année non bissextile par défaut. (=1 si bissextile)

// on teste si l'année est bissextile
// une année est bissextile quand :
// elle est divisible par 4 mais non par 100
// ou bien si l'année est divisible par 400.
if (Modulo(a,4)==0 && Modulo(a,100)>0) bissextile=1; // oui, année bissextile

if (Modulo(a,400)==0) bissextile=1; // oui, année bissextile

// remplissage du tableau mois(N) contenant le code des mois
var mois=new(array,13);
mois[1]=1; if (bissextile=1) mois[1]=0; // janvier
mois[2]=4; if (bissextile=1) mois[1]=3; // fevrier
mois[3]=4; // mars
mois[4]=0; // avril
mois[5]=2; // mai
mois[6]=5; // juin
mois[7]=0; // juillet
mois[8]=3; // aout
mois[9]=6; // septembre
mois[10]=1; // octobre
mois[11]=4; // novembre
mois[12]=6; // decembre

// on garde les 2 derniers chiffres de l'annee et on divise ce nombre par 4
var x=0;
if (a<2000) x=a-1900;
else x=a-2000;

// on ne prend que la valeur entière de la division.
var y=int(x/4);

// on additionne x + y + code du mois + numero du jour.
// on garde le reste de la division de l'ensemble par 7.
var z=(x+y+mois[m]+j);
z=z-(int(z/7)*7);

// si l'année donnée est égale ou supérieure à 2000 on retire 1 à ce résultat
if (a>1999) z=z-1;

// il ne reste plus qu'à identifier le nom du jour
println ("La date du "+tostring(j)+"/"+tostring(m)+"/"+tostring(a));

if (bissextile=1) println("est une année bissextile et");
println ("c'est un "+nom_jour[z]+" !");

}

le résultat est affiché dans la fenetre "Console".
:wink:

zeclubbeur
24/05/2010, 17h52
Pfiou, ouep, elle est vraiment belle ta montre !
Chapeau :)

Phi²
25/05/2010, 10h17
Ouaw ben merci bien Tengaal :grin:
Mais du coup, s'il existe pas un moyen pour extraire directement le jour de la semaine depuis l'horloge système jpourrais utiliser ce code avec la date de départ qui s'actualiserait chaque jour automatiquement ? Comme ça chaque jour le calcul se ferait automatiquement pour savoir si on est un lundi mardi...etc, et le résultat serait reporté dans le premier bout de code pour faire bouger mon aiguille du jour de la semaine :arg:

C'est un peu complexe, se serait plus simple si on pouvait extraire le jour avec une commande GeGetSysTime()->xxxxxxxx...Mais la variable "DayOfWeek" ne marchant pas, j'ai cherché sur le net des infos, sans succès, pi j'y connais rien en programmation :bave: je ne sais même pas quel langage c'est ? VB ? C++ ? U+?
Bref si quelqu'un me trouve la variable qui marche, je cracherais pas dessus :lol:

Merci zeclubber ça fait toujours plaisir :grin:

Tengaal
25/05/2010, 12h44
avec GeGetSysTime() on peut lire l'heure et la date système actuelle.

var heure = GeGetSysTime()->hour;
var minutes = GeGetSysTime()->minute;
var secondes = GeGetSysTime()->second;

var jour = GeGetSysTime()->day;
var mois = GeGetSysTime()->month;
var année = GeGetSysTime()->year;
mais ça ne donne pas le nom du jour correspondant.

Phi²
25/05/2010, 18h45
Ok sa roule...aller pour reparler un peu 3D dans ce topic je vous poste mes derniers rendus :wink:

http://img340.imageshack.us/img340/6474/46323730.png
http://img717.imageshack.us/img717/1668/13945145.png
Reflet de m***e juste en dessous du cadran, jvais essayer de trouver d'où sa vient parce que je trouve ça vraiment laid :puke:

http://img44.imageshack.us/img44/2439/17579748.png

:odile:

Phi²
27/05/2010, 13h35
Ah au fait j'ai réussis à intégrer ton script afin de faire bouger l'aiguille du jour de la semaine :boss:
Ca marche nickel merci encore :poucehaut:

Si ça intéresse voici le code final:

main(doc,op)
{// définition de l'heure actuelle de la machine:
var heures=GeGetSysTime()->hour; // on extrait les heures de l'horloge systeme
var heurejour=GeGetSysTime()->hour; // on extrait les heures de l'horloge systeme
var minutes=GeGetSysTime()->minute; // et les minutes
var secondes=GeGetSysTime()->second; // et les secondes
var jour=GeGetSysTime()->day; // et le jour

// on définit les objets à piloter en rotation Y
var aiguille_minutes=doc->FindObject("Aiguille des minutes");
var aiguille_heures=doc->FindObject("Aiguille des heures");
var aiguille_heurejour=doc->FindObject("Aiguille de l'heure du jour");
var aiguille_secondes=doc->FindObject("Aiguille des secondes");
var aiguille_jour=doc->FindObject("Aiguille des jours");

// on définit les rotations des aiguilles, avec une conversion en Radians
// on ajoute 90° pour que le 12 de l'horloge soit aligné sur Z+
// le signe - est là pour que le sens de rotation soit correct (sens horaire)
var angle_minutes=Radians(90-minutes*6-secondes*0.1); // 6 degrés par minute -> 360 degrés pour 60 minutes
var angle_heures=Radians(90-(heures*30+minutes/2)); // 1h=30 degrés, on ajoute un mouvement intermédiaire de 60min/2 = 0 à 29.5°
var angle_heurejour=Radians(90-(heures*15+minutes/4)); // 15 degrés par heure -> 360 degrés pour 24 heures
var angle_secondes=Radians(90-secondes*6); // 6 degrés par seconde -> 360 degrés pour 60 secondes
var angle_jour=Radians(90-jour*11.613); // 11,6 degrés par jour -> 360 degrés pour 31 jours

// on définit les rotations:
aiguille_heures->SetRotation(vector(angle_heures, 0, 0)); // rotation H, P, B equivaut à Y, X, Z
aiguille_heurejour->SetRotation(vector(angle_heurejour, 0, 0)); // rotation H, P, B equivaut à Y, X, Z
aiguille_minutes->SetRotation(vector(angle_minutes, 0, 0)); // rotation H, P, B equivaut à Y, X, Z
aiguille_secondes->SetRotation(vector(angle_secondes, 0, 0)); // rotation H, P, B equivaut à Y, X, Z
aiguille_jour->SetRotation(vector(angle_jour, 0, 0)); // rotation H, P, B equivaut à Y, X, Z


// Script pour définir le jour de la semaine en fonction de la date actuelle

//Définition de la date actuelle de la machine:
var j=GeGetSysTime()->day;
var m=GeGetSysTime()->month;
var a=GeGetSysTime()->year;

var bissextile=0; // année non bissextile par défaut. (=1 si bissextile)

// on teste si l'année est bissextile
// une année est bissextile quand :
// elle est divisible par 4 mais non par 100
// ou bien si l'année est divisible par 400.
if (Modulo(a,4)==0 && Modulo(a,100)>0) bissextile=1; // oui, année bissextile

if (Modulo(a,400)==0) bissextile=1; // oui, année bissextile

// on initialise le tableau des 7 noms de jours
var nom_jour=new(array,7);
nom_jour[0]="Samedi";
nom_jour[1]="Dimanche";
nom_jour[2]="Lundi";
nom_jour[3]="Mardi";
nom_jour[4]="Mercredi";
nom_jour[5]="jeudi";
nom_jour[6]="Vendredi";

// remplissage du tableau mois(N) contenant le code des mois
var mois=new(array,13);
mois[1]=1; if (bissextile=1) mois[1]=0; // janvier
mois[2]=4; if (bissextile=1) mois[1]=3; // fevrier
mois[3]=4; // mars
mois[4]=0; // avril
mois[5]=2; // mai
mois[6]=5; // juin
mois[7]=0; // juillet
mois[8]=3; // aout
mois[9]=6; // septembre
mois[10]=1; // octobre
mois[11]=4; // novembre
mois[12]=6; // decembre

// on garde les 2 derniers chiffres de l'annee et on divise ce nombre par 4
var x=0;
if (a<2000) x=a-1900;
else x=a-2000;

// on ne prend que la valeur entière de la division.
var y=int(x/4);

// on additionne x + y + code du mois + numero du jour.
// on garde le reste de la division de l'ensemble par 7.
var z=(x+y+mois[m]+j);
z=z-(int(z/7)*7);

// si l'année donnée est égale ou supérieure à 2000 on retire 1 à ce résultat
if (a>1999) z=z-1;

// on définit l'objets à piloter en rotation Y pour les jours de la semaine
var aiguille_jourdelasemaine=doc->FindObject("Aiguille du jour de la semaine");

// on définit les rotations des aiguilles, avec une conversion en Radians
var angle_jourdelasemaine=Radians((90-(z*51.428))+51.428); // 51,428 degrés par jour -> 360 degrés pour 7 jours (!avec une correction pour que 90° corresponde au Dimanche sur ma montre!et non au Samedi si z=0)

// on définit les rotations:
aiguille_jourdelasemaine->SetRotation(vector(angle_jourdelasemaine, 0, 0)); // rotation H, P, B equivaut à Y, X, Z

// il ne reste plus qu'à identifier le nom du jour
println ("La date du "+tostring(j)+"/"+tostring(m)+"/"+tostring(a));

if (bissextile=1) println("est une année bissextile et");
println ("c'est un "+nom_jour[z]+" !");
//Affichage visible dans la fenêtre 'Console' (Fenêtre>Console)
}

Rendu du jour, quelques rectification (pas visibles ici) + les 2 première parties du fermoir:
http://img263.imageshack.us/img263/2782/10399708.png

Phi²
29/05/2010, 09h44
Finito :bounce:
Bon voilà environ 15h de boulot pour en arriver au dernier rendu (qui lui a duré plus de 5h quand même :arg:) Reste encore à peaufiner quelques détails par contre...
http://img695.imageshack.us/img695/231/15blur.jpg
(Effet de mise au point en post prod avec photoshop)
J'ai posé un petit rayon de soleil à l'arrache, donc un peu n'import'où, histoire de donner un peu plus de peps à l'image, mais je manque cruellement d'inspiration pour créer une scène réaliste, donc si vous avez des suggestions, je prend!

Eethan
30/05/2010, 14h27
ton dernier rendu est complètement pixélisé ou aliazé a l'avant plan (quand on affiche l'image en entiere) et c'est bien dommage parce que la qualité du rendu lui même est très bonne.... :wink:

Phi²
30/05/2010, 21h25
Ouai exact, je sais pas vraiment à quoi c'est dû :/ je vérifierais les paramètres d'AA...Par contre impossible de créer des matières aussi jolies que celle que j'ai fait avec VrayForC4D...Et jparles même pas du temps de rendu pour avoir un résultat semblable, juste avec le moteur de rendu C4D :(