See site in english Voir le site en francais
Website skin:
home  download  forum  link  contact

Welcome, Guest. Please login or register.
Did you miss your activation email?

Login with username, password and session length

Author Topic: [C++] Animations  (Read 11320 times)

0 Members and 1 Guest are viewing this topic.

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15410
  • Karma: 266
  • Hein, quoi !?
    • FsPassengers
Reply #25 - 06 September 2007, 02:22:07
En passant c'est normal que la parabole "tourne" quand on deploie ? ca fait un peut naze...

Comprend toujours rien désolé ;)
En fait tu veux faire quoi ?
la parabole est sur le bras, tu veux la pointer en hauteur ? la tourner de droite à gauche ?

Dan


Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 25
  • Criiii Crii Crii
Reply #26 - 06 September 2007, 02:26:19
Oui, c'est normal, c'était pour tester les possibilités ...
Ce que je veux faire, c'est une fois en haut, je peux faire tourner la parabole
dans n'importe quel sens MAIS sur une autre anime ! Pas comme une composante
de l'anime qui fait sortir de la boite !
Et là, le problème est que je n'ai pas de coordonnées précises pour le centre de rotation de la parabole sur le haut du bras puisque les coordonnées de départ sont celles du bras .... mais docké.

Ceci dit, ce ne sont que des maths pour récupérer le nouveau point :lol:



Message modifié ( 06-09-2007 02:58 )

Pic

Offline brainstorm

  • Legend
  • ******
  • Posts: 2694
  • Karma: 0
Reply #27 - 06 September 2007, 21:15:38
En fait, va falloir que tu décales le point de rotation final de ta parabole en même temps que le premier mouvement....
Donc, tu définis le point de rotation dans sa position initiale (avec des valeur enregistrées dans x, y et z par
exemple) ...
Ensuite, bah selon le mouvement que tu vas faire, va falloir appliquer le mouvement à ces coordonnées ...
Comme tu dis c'est que des maths, de la trigo quoi ...
Si tu connais les dimensions de ton bras, les angles de rotation et toussa, y'a moyen d'en déduire l'axe de rotation ...
Et puis entre nous, c'est con, mais si l'axe est pas pile poil, tu le fais à vue de nez ...
si tu te rends compte que la rotation est excentrique, hop, +0.1 sur x ou , etc etc ... jusqu'à ce que ça tourne droit ...
C'est pas très conventionnel mais ça dépanne, surtout quand t'as la flemme de chercher ;)


Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 25
  • Criiii Crii Crii
Reply #28 - 06 September 2007, 22:42:17
Quote
surtout quand t'as la flemme de chercher

C'était un peu ça l'idée :badsmile:
Nan, c'est juste parce que le nouvel axe vient de la rotation
d'un bras à 90 degres plus une rotation du second bras de 22
degres et que j'ai oublié ma trigo ...


Pic

Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 25
  • Criiii Crii Crii
Reply #29 - 13 October 2007, 15:38:30
Necro topic mais pile poil dans le sujet ... ;)

Je me retrouve face à une équation que je ne sais pas résoudre.

Pour supprimer pas mal de lignes de codes, toutes les animations sont adressées sur une seule structure de
variables, une seule fonction d'animation et une seule routine dans post step. Mais il y a une des variables
obligatoires pour une animation dont je ne sais pas trop quoi faire. C'est sans doute celle qui identifie telle
ou telle animation auprès d'orbiter vu les exemples de la SDK ...

Voilà la structure ...

typedef struct{
   UINT anim_Porte;
   double dAnimPorte_proc;
   double dPorte_status;
   double dPorte_CLOSED;
   double dPorte_OPEN;
   double dPorte_CLOSING;
   double dPorte_OPENING;
   double dPorte_SPEED;
}PORTE;

Donc quand je memset ces structures toutes les UINT passent à zéro.
J'ai l'impression que c'est une STATIC normalement, qui fonctionnerait comme une id pour chaque anime.
Mais pas trop sûr ... Pour résoudre le problème, j'avais décidé de ne pas initialiser ces structures, mais
je crois que c'est une fausse bonne idée qui risque de créer des problèmes plus tard  ...

Et évidamment, quand j'initialise ces variables UINT anim_Porte à 0 plus rien ne marche.
Je crois deviner ce qu'il faut faire ...
Anim0 -> UINT anim_Porte = 0
Anim1-> UINT anim_Porte = 1
etc ...

Mais j'aimerais mieux comprendre ce qu'est ce type de "variable"



Message modifié ( 13-10-2007 15:40 )

Pic

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15410
  • Karma: 266
  • Hein, quoi !?
    • FsPassengers
Reply #30 - 13 October 2007, 15:46:10
UINT c'est un "unsigned int"  en bref exactement la même chose qu'un int
sauf qu'il ne peut pas devenir negatif (unsigned=pas de signe)

En bref considere le comme un int comme les autres si tu n'a pas besoin de valeurs negative (-1)

Dans le cas de ta structure c'est l'ID (le numéro) de ton animation, Orbiter ce sert de ce numéro
pour identifier de quel animation on parle.

Code: [Select]
// creation de l'animation dans DefineAnimation
Portes[DOOR_FRONT_DOCK].anim_Porte = CreateAnimation (0.0);
...
// utilisation dans clbkPostStep
SetAnimation (Portes[porte].anim_Porte, Portes[porte].dAnimPorte_proc);

Dans ton cas ce qui peut arriver c'est que tu memset tes structures PORTE Portes[FIN_PORTES];
APRES avoir appellé DefineAnimation(), tout les Numéro d'animation sauf la zéro sont perdue=
pas d'animation.

Dan


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15410
  • Karma: 266
  • Hein, quoi !?
    • FsPassengers
Reply #31 - 13 October 2007, 15:49:53
Autre bug possible:

Portes[porte].dPorte_SPEED=0 = pas d'animation

Cas si fait après memset ou pas settée du tout

Memset est vraiment a faire au tout début de clbkSetClassCap
comme scn.Init.

Dan



Message modifié ( 13-10-2007 15:52 )


Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 25
  • Criiii Crii Crii
Reply #32 - 13 October 2007, 15:51:47
SetAnimation (Portes[porte].anim_Porte, Portes[porte].dAnimPorte_proc);
SetAnimation (UINT anim, double state);

J'avais bien vu que c'était une ID ...
Thanks pour l'explication sur UINT.
Si j'ai bien compris, Martin nous a imposé une UINT pour
être sûr qu'on ne lui balance pas des moins dans sa fonction.

Pour le speed, c'est bon ;) ... c'est juste que je voulais être sûr
de la signification de ce UINT.

Mais quand même ! Je n'avais jamais initialisé ces UINT nulle part (volontairement)
et les animes fonctionnaient .... pas mal comme travail sans filets :badsmile:



Message modifié ( 13-10-2007 15:54 )

Pic

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15410
  • Karma: 266
  • Hein, quoi !?
    • FsPassengers
Reply #33 - 13 October 2007, 15:54:26
Si ca marche toujours pas fout un F9 dans le for/next animation de poststep.
tu verra tout de suite si ca couille.

Dan


Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 25
  • Criiii Crii Crii
Reply #34 - 13 October 2007, 16:08:40
Oui, c'est ça ... mais quand on met des ids au hasard, ça marche pas ..
J'ai l'impression que l'ordre dans la fonction define animations est important.
C'est pour ça que ça marchait sans initialisation certainement;

Tout ça pour pouvoir faire un memset avant d' initialiser réellement juste après :sad:



Message modifié ( 13-10-2007 16:19 )

Pic

Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 25
  • Criiii Crii Crii
Reply #35 - 13 October 2007, 16:24:53
Ah oui... c'est ça ! :)
Bravo encore !
Constructeur est appellé avant Class Cap j'imagine.
En fait l'endroit idéal d'ou appeller c'est dans restore scenario.
Puis, par sécurité à la fin de class cap.

//****************************************************
// Irridium - Constructeur
//****************************************************
Irridium::Irridium (OBJHANDLE hObj, int fmodel)
: VESSEL2 (hObj, fmodel)
{
   int i;
   for (i = 0; i < nsurf; i++) srf = 0;
   DefineAnimations ();
}



Message modifié ( 13-10-2007 16:30 )

Pic

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15410
  • Karma: 266
  • Hein, quoi !?
    • FsPassengers
Reply #36 - 13 October 2007, 17:02:32
Quote
picto a écrit:
Constructeur est appellé avant Class Cap j'imagine.

oui

Quote
picto a écrit:
En fait l'endroit idéal d'ou appeller c'est dans restore scenario.
Puis, par sécurité à la fin de class cap.

T'est fou ? NON ! :fool:

Une fois a la fin de clbkSetClassCap !!!!! et c'est TOUT !!!
dans restore scenario tu remettra simplement l'etat des piece a la bonne position
en fonction des variable restorée:
SetAnimation()

Quote
picto a écrit:
//****************************************************
// Irridium - Constructeur
//****************************************************
Irridium::Irridium (OBJHANDLE hObj, int fmodel)
: VESSEL2 (hObj, fmodel)
{
   int i;
   for (i = 0; i &lt nsurf; i++) srf[i ] = 0;
   DefineAnimations ();
}

Surtout pas la !!!

Dan



Message modifié ( 13-10-2007 19:15 )


Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 25
  • Criiii Crii Crii
Reply #37 - 13 October 2007, 19:23:02
Quote
Surtout pas la !!!

ShuttleA -> constructeur !
HST -> constructeur !

Comment veux tu ne pas faire de conneries avec des exemples  SDK pourris ? :sad:



Message modifié ( 13-10-2007 19:24 )

Pic

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15410
  • Karma: 266
  • Hein, quoi !?
    • FsPassengers
Reply #38 - 15 October 2007, 01:47:56
il utilisent probablement l'ancienne methode ou on pouvait le faire la,
ils n'ont manifestement pas été mis à jour.

Avec la nouvelle methode tu instancie une classe "new MGROUP_ROTATE" et tu doit garder
le handle dans ta classe.....

:doubt: **scritch scritch controle les trucs**  8o  STOOOOOOOP !!!!

Je dit des conneries... tu peux tout a fait le faire dans le constructeur de la classe irridium
et les delete des handle animation dans le destructeurs.

La ou ou dans clbkSetClassCap ca n'a pas d'importance vraiment, mais tu *peux* le faire effectivement
aussi dans le constructeur.

Désolé ;)

Donc:

-surtout pas plusieurs fois
-surtout pas ailleurs que dans clbkSetClassCap ou dans le constructeurs.


Dan



Message modifié ( 15-10-2007 01:49 )

« Last Edit: 15 October 2007, 02:11:07 by DanSteph »

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15410
  • Karma: 266
  • Hein, quoi !?
    • FsPassengers
Reply #39 - 15 October 2007, 01:56:37
Note que logiquement par sécurité vu que ca accede au mesh j'aurais tendance à vouloir le faire par instinct
plutôt à la fin de clbkSetClassCap *après* le chargement des meshes.

Ca ne *semble* pas poser de probleme de le faire avant, mais qui sait si dans une future version d'Orbiter
les fonctions anim ferons pas de check des mesh à l'instanciation des animations ?

A++

Dan

« Last Edit: 15 October 2007, 02:11:07 by DanSteph »

Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 25
  • Criiii Crii Crii
Reply #40 - 15 October 2007, 02:11:06

Après les meshes me parait une bonne idée aussi ;)
Je le fait de ce pas. Quand je vois comment ça crashe
fastoche si le moindre groupe n'est pas trouvé.


« Last Edit: 15 October 2007, 02:11:07 by picto »
Pic