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++ VS 2005] Un bleu a un gros probleme... [rerésolu]  (Read 12877 times)

0 Members and 1 Guest are viewing this topic.

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #25 - 26 April 2007, 12:45:00
A mon humble avis il va falloir que ton module soit pour ta base (enfin le modele qui a le sas)
en entier et pas juste une "boite". Sinon je vois pleins de prob potentiel la. A vouloir
economiser tu risque de perde une ch*** de temps au final quand bloqué par un truc
vraiment moche tu devras repartir de zéro.

En fait le faire c'est très simple, suffit de regarder le ShuttlePB_example et de
comprendre. T'enleve les truc relatif au thrusters, tu reecris le config comme celui du
ShuttlePBMmu en mettant le nom de ton module, tu change le poid et divers parametre
et voila, ton premier vessel. En plus ca t'ouvre des possibilités enorme.

Au lieu d'y mettre dans le config tu change les parametre dans clbcksetclasscap
comme "SetMass" "SetPmi" et "addmesh" etc etc c'est exactement pareil que dans un cfg
sauf que c'est fait par la prog.

Pour la prog c'est toujours la meme chose: on essaie de comprendre ce qui ce passe,
ce n'est finalement qu'un gros fichier config mais qui s'execute en sequence.

Quand tu comprend pas du code "Orbiter" tu ouvre OrbiterSDK/doc/API_Reference.pdf
et tu recherche,

SetTouchdownPoints par exemple: (c'est plus joli dans le PDF)

SetTouchdownPoints
This defines 3 surface contact points for ground contact calculations (e.g. the points
where the landing gear touches the ground).
Synopsis:
void SetTouchdownPoints (
const VECTOR3 &pt1,
const VECTOR3 &pt2,
const VECTOR3 &pt3) const
Parameters:
pt1 touchdown point of nose wheel (or equivalent)
pt2 touchdown point of left wheel (or equivalent)
pt3 touchdown point of right wheel (or equivalent)
Notes: ·  The points are the positions at which the vessel’s undercarriage (or
equivalent) touches the surface, specified in local vessel coordinates.
·  The points should be specified such that the cross product pt3-pt1 x pt2-pt1
defines the horizon UP direction for the landed vessel (given a left-handed



La prog c'est d'abord une question de methode, je n'ai pas une mémoire
phénomenale mais je sais exactement ou chercher les infos.

A++

Dan



Message modifié ( 26-04-2007 12:46 )


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #26 - 28 April 2007, 13:24:15
Quote
Momo a écrit:
vi sa marche! merci!

j'ai juste une lacune, ... je voudrais crée un point d'attache parent (crée dans mon cfg comme le
hst) et attraper un enfant en appuyant sur une touche...
j'ai regardé partout mais je trouve pas la commande a rentrer sous if(key==OAPI_KEY_xxx) {
un peut comme tu as fais avec le Ummu (touche G pour attrapé un objet avec les mains)

sinon a part sa, tous marche!


Je reprend ton PM ici car ce que j'ecris peut servir à d'autres aussi.

---

Au début comme par la suite le meilleur moyen d'apprendre des choses qu'on connait pas c'est de voir comment les
autres ont faits, justement les exemples de la SDK sont la pour ca.

Je pourrais te donner la réponse mais ca n'arrangerais pas ton problème de methode et tu calerais à chaque étapes
et finirais par abandonner. La prog c'est d'abord être un detective, une fois que tu admis ca tu ne sera plus jamais
perdu. Nos outils sont: la doc, les autres codes sources, google.

Donc tu cherche comment faire un point d'attache ?

Premier arret: la doc, "API_Reference.pdf" on charge, on cherche "attache"

mouais, permier reponse "thurster" non... deuxieme, encore thruster... non..
Ah voila, troisieme réponse: BINGO !



moui moui, beaucoup de texte, mais on voit pas trop encore... de la théorie tout ca, faudrais un exemple pratique.
On va chercher les fonctions relative au "attachement" . Voila, une fonction c'est "CreateAttachment"



Donc en partant de cette fonctions on va chercher si elle a deja été utilisée dans les exemples de la SDK.

On ouvre MSVC, on clique sur l'outil chercher et on donne comme chemin le repertoire "sample" de la SDK:



Et voila, 13 réponses:



On clique sur les lignes ca ouvre le code source.

Après tu regarde quel projet utilise cette fonction (SHuttla par exemple), comment l'addon correspondant marche
dans Orbiter. Tu ouvre le projet dans une autre MSVC, tu essaie de comprendre comment ca marche.
(l'outil recherche" marche aussi en local (chercher dans "current project") par exemple
la fonction "CreateAttachment" retourne une valeur :

payload_attachment[0]  = CreateAttachment (false,_V(1.76f,0.0f,

Donc tu va ouvrir le projet ShuttleA et rechercher dans "current project" "payload_attachment" comme ca tu va voir
partout ou est utilisé cette valeur...

Voila, on avait un fil on a tiré et la pelote ce dévide, un vrais travail de detective.

Capisce ? ... OUI mon général !

C'est bien, repos ! :badsmile:

Dan



Message modifié ( 28-04-2007 13:25 )


Offline Momo

  • Legend
  • ******
  • Posts: 2682
  • Karma: 1
Reply #27 - 28 April 2007, 14:11:18
Quote
justement les exemples de la SDK sont la pour ca.

je fais plus que sa... 4H a regardé et comprendre :badsmile:   

Quote
Premier arret: la doc, "API_Reference.pdf" on charge, on cherche "attache"

P76 de tete :badsmile:   

crée le point d'attache, je lais deja fais, grace a tous sa...
Dans mon cas actuel je veux le faire attrapé un autre point sur un autre vessel (activation E), donc sans le savoir et en me
trompant ma foi, j'ai fais un truc du genre (effacé depuis car c'est pas ce que je voulais) :

Quote
int sas::clbkConsumeBufferedKey(DWORD key, bool down, char *kstate)
{

.../...

   if(key==OAPI_KEY_E)
       
attachment = CreateAttachment (true,_V(0,1,0)... ... ... );    
 [/color]  

donc E ma crée un point...

sinon sur le cpp d'atlantis, j'ai deja isolé cette ligne:
Quote
if (!rms_attach) rms_attach = CreateAttachment (false, ofs+arm_tip[0], arm_tip[1]-arm_tip[0], arm_tip[2]-arm_tip[0], "G", true);
[/color]

en faite, je pense, pour dire a mon sas de s'attacher a un autre module via une commande, le point d'att devient et doit etre
considéré comme un RMS...

j'ai aussi trouvé sa... (oui trouvé est le bon terme):
Quote
OAPI_KEY_8:
         ToggleGrapple();
[/color]

et d'autre...

Quote
La prog c'est d'abord être un detective, une fois que tu admis ca tu ne sera plus jamais
perdu. Nos outils sont: la doc, les autres codes sources, google.

puis ya les fofo... je cherche partout... puis ya les amis aussi! sans eux, j'aurais jamais touché a la prg...

Quote
Je pourrais te donner la réponse mais ca n'arrangerais pas ton problème de methode et tu calerais à chaque étapes
et finirais par abandonner

ben normal, pour le moment, je fais suivant les exp des autres (pas mieux ma foi) et sur ce prb, j'ai pas trouvé de codes
source qui utilise la fonction que je souhaite... mais je sais que c'est possible, a moi de comprendre, de testé...
je suis pas pressé, faut apprendre avant, c'est comme tous... mais là c'est dur... faut le dire... en 1 semaine
d'apprentissage j'y connais rien... j'ai juste réalisé une dll qui marche, sur ton travail! sa vient même pas de moi...

Quote
 Capisce ? ... OUI mon général !

C'est bien, repos ! :badsmile:

Merci mon Gégéne!!!



Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #28 - 28 April 2007, 14:18:27
si je comprend bien tu fait un sas "generique" qui pourrait s'attacher sur tes autres modules ?

Je suis pas certains que ca marche surtout au niveau du module de l'objet attaché
(le code tourne il encore ou le module attaché devient il inactif?) je sais pas
j'ai pas fait de tests.

Sinon oublie pas que pour l'attachement il faut un point PARENT sur un vessel
et un point CHILD sur l'autre vessel. Les containers du Shuttle A on un module:
ShuttleA_PL tu pourrait aller voir ce code.

Dan


Offline Momo

  • Legend
  • ******
  • Posts: 2682
  • Karma: 1
Reply #29 - 28 April 2007, 14:50:18
Quote
DanSteph a écrit:
si je comprend bien tu fait un sas "generique" qui pourrait s'attacher sur tes autres modules ?

Dan

oui, deja je commence sur le Hab, tous marche!
après si je fais un autre module de sortie, tous seras identique a 2 choses près... mais l'idée est là...

j'utilise deja les points d'att parent enfant pour les autres modules sol (pas de docking possible au sol, si... mais pas de
dedocking possible et vu que chaque module reste indépendant des autres, j'ai opté pour cette solution...
sa marche avec du spc3 "Q" puis shiftG+0 pour le grapping

j'ai testé avec un point de dock sur le sas (sa gene pas pour lui) mais pas de EVA possible du coup...

pour comprendre mon principe et l'utilisation du sas... sa fais donc:

-Module hab se pose sur la lune (spc3) animation panneaux et ouverture de la rampe de sortie    


-"J" libere le sas (dll) (focus direct sur le sas)


-"E" "1" "2" "S" sont les seuls fonctions utilisé sur la dll (le Ummu descend tranquillement de l'échelle)  



le truc, c'est que le sas est un vessel a lui tous seul, donc si un gus bouge le module hab, lui il suit pas...
normalement, une fois posé et le reste des modules sol accroché, il ne peut plus bougé, mais ya toujours un orbinaute qui le
fera...
alors voila l'idée du point d'att, comme sa, en sortant le 1° Ummu "E" il s'attache au Hab, et plus de soucis!
je sais, je fais compliqué... mais faire une dll entière sur le module hab... là c'est de la folie a mon niveau... de plus sa
changerai rien a mon prb... car lui a aussi 2 points d'att parents a 45° pour attaché les modules sol de raccord...

voila pourquoi je pense faire sa comme sa...

PS: si tes ok Dan, ya une dédicace prévus pour toi...



Offline Momo

  • Legend
  • ******
  • Posts: 2682
  • Karma: 1
Reply #30 - 28 April 2007, 22:36:00
bon... j'ai bien mon point d'att sur orbiter...

code:
void sas::clbkSetClassCaps_UMMu(void)
.../...
   CreateAttachment (true,_V(0,1,0),_V(0, 1, 0),_V(0, 0, 1),"GX" );

mais je trouve pas comment dire a ma dll l'activation "grap" sous:

int sas::clbkConsumeBufferedKey(DWORD key, bool down, char *kstate)
{
   
   if(key==OAPI_KEY_E)
   {

:bug:



Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #31 - 28 April 2007, 22:52:28
regarde sous "AttachChild"

Dan


Offline Momo

  • Legend
  • ******
  • Posts: 2682
  • Karma: 1
Reply #32 - 29 April 2007, 14:47:52
je regarde Dan... je regarde...

sinon j'ai modifié le point d'att du sas en :

CreateAttachment (false,_V(0,1,0),_V(0, 1, 0),_V(0, 0, 1),"GX");

True = enfant
False = parent

(un truc de plus que j'ai appris)

sinon, j'arrive toujours pas a accroché le parent au tio... via if(key==OAPI_KEY_E)...

:bug:

edit/ le point marche bien, si je le rentre dans le scn, le module ne peut plus bougé! donc j'ai 2 points sur 3 qui son reglés... manque plus que le grapping...



Message modifié ( 29-04-2007 16:09 )


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #33 - 29 April 2007, 16:28:43
Quote
Momo a écrit:
sinon, j'arrive toujours pas a accroché le parent au tio... via if(key==OAPI_KEY_E)...

Je le fait par "AttachChild", controle bien que tes handles soient corrects. (parametres de attachchild)

Dan


Offline Momo

  • Legend
  • ******
  • Posts: 2682
  • Karma: 1
Reply #34 - 29 April 2007, 21:08:28
Quote
DanSteph a écrit:
Quote
Momo a écrit:
sinon, j'arrive toujours pas a accroché le parent au tio... via if(key==OAPI_KEY_E)...

Je le fait par "AttachChild", controle bien que tes handles soient corrects. (parametres de attachchild)

Dan

ben vi... je crois que c'est la que je comprend plus... a vrais dire...

Synopsis:
bool AttachChild (
OBJHANDLE child,
ATTACHMENTHANDLE attachment,
ATTACHMENTHANDLE child_attachment) const

ATTACHMENTHANDLE  sas_attachment; est déclaré dans mon sas.h en private

mais le reste... je sais pas... OBJhandle, reste flou pour moi...
sur l'exp du shuttleA,  OBJHANDLE hV = oapiGetVesselByIndex (i); ,je sais même pas si sa convient pour moi, et de même pour
ATTACHMENTHANDLE hAtt = v->GetAttachmentHandle (true, j);

de toutes façon sa compile pas... et quand j'y arrive, sa marche pas...
se demerdé seul quand on connais rien, c'est plus que dur...
mais ya un Gégéne 5 étoiles voir un maréchale a 7 étoiles qui va m'aidé a y voir claire???



Offline Momo

  • Legend
  • ******
  • Posts: 2682
  • Karma: 1
Reply #35 - 30 April 2007, 08:57:39
Bon voila le code que j'ai repris du stutlleA, je sais pas si c'est bien comme sa qui faut faire...

Quote
   if(key==OAPI_KEY_E)
   {  

      VECTOR3 gpos, grms, pos, dir, rot;
      VECTOR3 gdir,grot;
      VECTOR3 gcdir,gcrot;
      GetAttachmentParams (sas_attachment, pos, dir, rot);
      Local2Global (pos, grms);   //local attach point to global frame
      GlobalRot(rot,grot);
      GlobalRot(dir,gdir);
      for (DWORD i = 0; i < oapiGetVesselCount(); i++) {
         OBJHANDLE hV = oapiGetVesselByIndex (i);
         if (hV == GetHandle()) continue; // we don't want to grapple ourselves ...
         oapiGetGlobalPos (hV, &gpos);
         if (dist (gpos, grms) < oapiGetSize (hV)) { // in range
            VESSEL *v = oapiGetVesselInterface (hV);
            DWORD nAttach = v-> AttachmentCount (true);
   OBJHANDLE hV = GetAttachmentStatus (sas_attachment);
   for (DWORD j = 0; j < nAttach; j++)
   ATTACHMENTHANDLE hAtt = v->GetAttachmentHandle (true, j);
   const char *id = v->GetAttachmentId (hAtt);   <=== ligne 70
   if (strncmp (id, "SH", 2)) continue; // attachment point not compatible
      v->GetAttachmentParams (hAtt, pos, dir, rot);
      v->Local2Global (pos, gpos);
         if (dist (gpos, grms) < MAX_GRAPPLING_DIST) { // found one!      
            // check if the attachment points are pointing the right way
            v->GlobalRot(rot,gcrot);
            v->GlobalRot(dir,gcdir); //should be normal by now
            if ((dotp(grot,gcrot)>MAX_GRAPPLING_ANG)&&(dotp(gdir,gcdir)<-MAX_GRAPPLING_ANG))//dotrot=1 and dotdir=-1(same up vector, but opposing dir vectors)
   {
   AttachChild (hV, sas_attachment, hAtt);
   return false;
                  }   
               }
            }
         }
      }
   }


le resultat...
Quote

Projet : sas_prj, Configuration : Debug Win32
Sas.cpp
c:\orbitersdk\samples\sas\sas.cpp(70) : error C2065: 'hAtt' : identificateur non déclaré


j'espere que je fait pas fausse route...
:bug:



Message modifié ( 30-04-2007 10:37 )


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #36 - 30 April 2007, 12:40:24
il doit manquer un "{" d'ouverture après

for (DWORD j = 0; j < nAttach; j++)
{
ATTACHMENTHANDLE hAtt = v->GetAttachmentHandle (true, j);

Que je t'explique le "scope" des variables (la portée):

Si tu met une variable dans ta classe (comme le "Crew.") elle est "globale"
accessible partout de n'importe quel fonction de cette classe.

Si tu declare une variable dans une fonction, boucle "for next" ou tout autre
instructions avec des {} ellse sont locale..



for(I=0;I<Z;I++)
{
int SalutMomo=1;
SalutMomo=2;

}


int test=SalutMomo; ERREUR VARIABLE SalutMomo inconnue ici, elle n'est valide QUE dans la boucle for next




Si tu fait ca:
for (DWORD j = 0; j < nAttach; j++)
ATTACHMENTHANDLE hAtt = v->GetAttachmentHandle (true, j);


La boucle for next n'est executé que pour cette ligne  et la variable hAtt est inconnue
plus bas. En bref tu a fait l'équivalent de ca:



for (DWORD j = 0; j < nAttach; j++)
{
ATTACHMENTHANDLE hAtt = v->GetAttachmentHandle (true, j);
}


const char *id = v->GetAttachmentId (hAtt); ERREUR hAtt inconnue ici.




Tu a trouvé la bonne methode mais a cause de ce "{" manquant ca ne marchera pas
et pas seulement a cause de l'erreur de compile, la boucle for next doit inclure les lignes
en dessous (ca sert a rien de repeter juste GetAttachmentId )

recopie la fonction en entier.

A++

Dan



Message modifié ( 30-04-2007 13:04 )


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #37 - 30 April 2007, 13:09:37
En passant un truc de prog en C++ on peut ce passer des {}
si on a qu'une ligne :

comme ca:

if(Salut==1)
OnMaDitSalut();


C'EST TRES MAUVAIS DE FAIRE CA, C'EST UN NID A BUG!!!!

Chercher l'erreur:

if(Salut==1)
OnMaDitSalut();A=A+1;


ou même :

if(Salut==1)
OnMaDitSalut();
A=A+1;



En fait on a fait ca:

if(Salut==1)
{
OnMaDitSalut();
}
A=A+1;


Alors qu'on voulait faire ca:

if(Salut==1)
{
OnMaDitSalut();
A=A+1;
}


Moi même pour une ligne je met TOUJOURS des {} Ca fait une source de bugs
moche en moins. (faire le meme regle pour for next etc etc)

Dan



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


Offline Momo

  • Legend
  • ******
  • Posts: 2682
  • Karma: 1
Reply #38 - 30 April 2007, 13:43:31
Bon ben plus de prb de compile... mais un gros prb de fonctionnement...
E ne sort plus les Ummu et pas d'attache sur le point enfant du module hab...

Merci pour toutes tes explications! MERCI!!!



Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #39 - 30 April 2007, 14:03:12
Quote
Momo a écrit:
Bon ben plus de prb de compile... mais un gros prb de fonctionnement...
E ne sort plus les Ummu et pas d'attache sur le point enfant du module hab...

Si tu a juste rajouté le "{" ca peut donner très moche ...
Tu en avais enlever une ailleurs pour que ca compile si tu la rajoute simplement
ici va savoir ou ca ce referme du coup.

Selectionne tout ton code avec "edit->Select all"
et presse ALT+F8 ca va re-indenté tout ton code
et tu va voir.

C'est pour ca que je deteste aussi les { mis sur la même ligne:

if (dist (gpos, grms) < oapiGetSize (hV)) {

Je trouve ca beaucoup plus platra et moins clair:



Que ca ou tu vois bien ou le code est englobé:



Dan


Offline Momo

  • Legend
  • ******
  • Posts: 2682
  • Karma: 1
Reply #40 - 30 April 2007, 18:05:26
ha vi, c'est plus claire comme sa! facile a lire du coup! merci pour la combine!
sinon, ben toujours pas d'effet sur la dll... sa marche po...
un truc étrange, quand je rajoute les lignes qui sont sensés marché, la dll perd 12Ko... (48ko a la base, 25ko avec les
lignes en plus...)
j'ai pas de ctd, les EVA marches nickel...

ya un truc la... obligé...

:bug:


« Last Edit: 30 April 2007, 18:05:26 by Momo »