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: Panneaux solaires suivant le soleil  (Read 3240 times)

0 Members and 1 Guest are viewing this topic.

Offline Tom

  • Sr. Member
  • ****
  • Posts: 367
  • Karma: 0
26 October 2009, 17:36:48
Salut à tous,

voilà ma question, sur Iris, il existe 9 panneaux solaires, avec tous une orientation différente. Le but serait que les 9 panneaux solaires qui ne tourneraient que sur l'axe
vertical soient positionnés vers le soleil. Et là je dois dire que je coince un peu.

J'imagine qu'il faut récupérer la position du soleil avec GetGlobalPosition(), vectoriser et normaliser pour avoir un vecteur qui pointe vers le soleil. Et après, je ne vois pas
comment faire pour définir une animation.

Quelqu'un a-t-il déjà fait ça ? une idée peut être ?


---------------
Tom

Offline DagoO

  • Legend
  • ******
  • Posts: 2161
  • Karma: 7
Reply #1 - 26 October 2009, 18:00:51
Je sais pas, mais je sais que Dan l'a fait, ya une antenne sur prélude qui suit justement le soleil.

edit : Je vais me faire tuer...je viens de gâcher 10 minutes de boulot pour Dan :sad:



Message modifié ( 26-10-2009 18:21 )


Offline MartySpaceLines

  • Legend
  • ******
  • Posts: 1096
  • Karma: 0
Reply #2 - 26 October 2009, 18:27:13
Ben tes panneaux, ils peuvent tourner sur 360°n nan?-> il tourne sur deux dimensions.
Alors tu peux simplement lui dire dans clbkPostStep (...) de continuer l'animation dans la bonne direction jusqu'à-ce que
l'azimut soit atteint.

J'ai pas le temps d'essayer de poster un bout de code, on verra plus tard (a moins que quelqu'un d'autre ne s'y colle ;))


@++

MSL  


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 258
  • Hein, quoi !?
    • FsPassengers
Reply #3 - 26 October 2009, 18:27:13
10 minutes ? tu va voir le b... a cleaner et expliquer,
si vous arrivez à vous débrouiller avec ca ce serait aussi bien: (c'est compréhensible imho)


Code: [Select]
oapiGetGlobalPos (MyData.MyHandle,&GSpacecraftPos);
oapiGetGlobalPos(Solar[Numb].TrackedObjHandle, >argetPos);
Global2Local(GSpacecraftPos, SpacecraftPos);
Global2Local(GTargetPos, TargetPos);
pos = TargetPos - SpacecraftPos;
Solar[Numb].Distance = sqrt(pow(pos.x, 2) + pow(pos.y, 2) + pow(pos.z, 2));
double pitch = asin(pos.y/Solar[Numb].Distance);
double yaw=acos(pos.z/(Solar[Numb].Distance * sin(acos(pos.y/Solar[Numb].Distance))));
if(pos.x < 0)
Solar[Numb].requestedYaw=1-(yaw*0.159154943);
else
Solar[Numb].requestedYaw=yaw*0.159154943;
Solar[Numb].requestedPitch=pitch*0.159154943;//+0.06;

// set antenna speed
if(Solar[Numb].Speed==0)
MoveSpeed=oapiGetSimStep() *0.015;
else
MoveSpeed=oapiGetSimStep() *0.033;


if(Solar[Numb].requestedPitch<0.01)
{
Solar[Numb].requestedPitch=0.0;
Solar[Numb].requestedYaw=0;
}

// avoid "north" problem (0-360)
if(Solar[Numb].requestedYaw-Solar[Numb].ActualYaw>0.5)
{
Solar[Numb].requestedYaw-=1.0;
}
else if(Solar[Numb].ActualYaw-Solar[Numb].requestedYaw>0.5)
{
Solar[Numb].requestedYaw+=1.0;
}
if(Solar[Numb].ActualYaw<Solar[Numb].requestedYaw)
{
//Solar[Numb].ActualYaw += MoveSpeed;
Solar[Numb].ActualYaw =min (Solar[Numb].requestedYaw,Solar[Numb].ActualYaw+MoveSpeed);
if(Solar[Numb].ActualYaw>1.0)
Solar[Numb].ActualYaw-=1.0;
}
else
{
//Solar[Numb].ActualYaw -= MoveSpeed;
Solar[Numb].ActualYaw =max (Solar[Numb].requestedYaw,Solar[Numb].ActualYaw-MoveSpeed);
if(Solar[Numb].ActualYaw<0.0)
Solar[Numb].ActualYaw+=1.0;
}
if(Solar[Numb].ActualPitch<Solar[Numb].requestedPitch)
{
//Solar[Numb].ActualPitch += MoveSpeed;
Solar[Numb].ActualPitch =min (Solar[Numb].requestedPitch,Solar[Numb].ActualPitch+MoveSpeed);
}
else
{
//Solar[Numb].ActualPitch -= MoveSpeed;
Solar[Numb].ActualPitch =max (Solar[Numb].requestedPitch,Solar[Numb].ActualPitch-MoveSpeed);
}
if(Solar[Numb].ActualPitch<0.0)
Solar[Numb].ActualPitch=0.0;

SetAnimation (anim_SolarBase[Numb], Solar[Numb].ActualYaw);
SetAnimation (anim_SolarTop[Numb],Solar[Numb].ActualPitch);
//SetAnimation (anim_SolarBase[0], Solar[Numb].ActualYaw);
//SetAnimation (anim_SolarTop[0],Solar[Numb].ActualPitch);
//SetAnimation (anim_SolarBase[2], Solar[Numb].ActualYaw);
//SetAnimation (anim_SolarTop[2],Solar[Numb].ActualPitch);

// get the force of the signal
Solar[Numb].SignalForce=10-((fabs(Solar[Numb].ActualYaw-Solar[Numb].requestedYaw)+
fabs(Solar[Numb].ActualPitch-Solar[Numb].requestedPitch))*(600+(Solar[Numb].Distance/10000000.0)));
Solar[Numb].SignalForce-=Solar[Numb].Distance/100000000000.0;

Le numb c'est parce que c'était repris de symphony qui en contenait 3.



Message modifié ( 26-10-2009 18:32 )


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 258
  • Hein, quoi !?
    • FsPassengers
Reply #4 - 26 October 2009, 18:31:25
C'EST QUOA ÇAAAAA???? :eek:



;)

Dan



Message modifié ( 26-10-2009 18:31 )


Offline Tom

  • Sr. Member
  • ****
  • Posts: 367
  • Karma: 0
Reply #5 - 26 October 2009, 18:32:26
Merci beaucoup Dan ! Je vais regarder et je te dirais si y'a des trucs que je comprends pas !


---------------
Tom

Offline Tom

  • Sr. Member
  • ****
  • Posts: 367
  • Karma: 0
Reply #6 - 26 October 2009, 20:28:22
Quote
DanSteph a écrit:
C'EST QUOA ÇAAAAA???? :eek:



;)

Dan

Un nouveau projet de Dagoo ?? J'ai rien vu, ni entendu à ce sujet là pour le moment ! Il faudrait une petite annonce ;)


---------------
Tom

Offline DagoO

  • Legend
  • ******
  • Posts: 2161
  • Karma: 7
Reply #7 - 26 October 2009, 20:53:30
Quote
Tom a écrit:
Quote
DanSteph a écrit:
C'EST QUOA ÇAAAAA???? :eek:



;)

Dan

Un nouveau projet de Dagoo ?? J'ai rien vu, ni entendu à ce sujet là pour le moment ! Il faudrait une petite annonce ;)


C'est prévu pour 2010, je commencerais après le laboratoire que je pense sortir dans une semaine plus ou moin.



Offline brainstorm

  • Legend
  • ******
  • Posts: 2694
  • Karma: 0
Reply #8 - 27 October 2009, 11:24:54
Paye ta motivation ;) C bo :)



Offline Tom

  • Sr. Member
  • ****
  • Posts: 367
  • Karma: 0
Reply #9 - 27 October 2009, 11:37:22
Bon, je pense avoir pas mal compris le code, j'ai par contre un problème de taille (pour le débutant que je suis) Mes panneaux ont un mouvement pour le moins étrange
(ça c'est pas grave, juste un problème d'animations)

Mais quand je vérifie les paramètres pos.x pos.y et pos.z ils varient de -210000000 à 21000000 plus ou moins quelques millions en une seconde à peine et ceci en
continu ! Et je ne comprends pas bien pourquoi !

j'ai pourtant mis ça :

Quote
       oapiGetGlobalPos (baseName,&GSpacecraftPos);
   oapiGetGlobalPos(TargetName, &GSunPos);
   Global2Local(GSpacecraftPos, SpacecraftPos);
   Global2Local(GSunPos, SunPos);
   pos = SunPos - SpacecraftPos;

Quelqu'un aurait une idée ?


---------------
Tom

Offline tofitouf

  • Legend
  • ******
  • Posts: 1380
  • Karma: 0
Reply #10 - 27 October 2009, 13:51:48

Quote
       
oapiGetGlobalPos (baseName,&GSpacecraftPos);
oapiGetGlobalPos(TargetName, &GSunPos);
   Global2Local(GSpacecraftPos, SpacecraftPos);
   Global2Local(GSunPos, SunPos);
   pos = SunPos - SpacecraftPos;

Quelqu'un aurait une idée ?


de mémoire oapiGetGlobalPos demande non pas un nom d'objet mais bien un handle
donc avant il faut faire oapiGetObjectByName pour récupérer ton ahndle
c'est une focntion lente donc garde les handle de coté comme membre de ta classe
T'obtiens des valeurs aléatoire car tu pointe n'improte où dans la mémoire. d'ailleur c'est un mirackle que ca crashe pas :)


---------------------------------------------

PC en rade, codage en panne.... Nom de Zeus

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 258
  • Hein, quoi !?
    • FsPassengers
Reply #11 - 27 October 2009, 16:06:52
Attention avec les handles gardé: si l'objet est détruit (UMMU ingress) hop CTD.
Pour le soleil pas de risque :)

Tom, quand tu es sur une fonction fait "click droit" et "voir la déclaration" ça te donne le prototype de la fonction (quel
valeurs il attend) et oublie pas si ça marche pas de regarder la doc SDK (API_reference.pdf) avec le nom de fonction.

En dernier le mode debug pas a pas est indispensable quand ça marche pas justement pour voir ligne par ligne si tout marche
comme supposé. (voir mes tutos)

Une fois que tu a le réflexe de savoir chercher un bon endroit et le debug t'est presque plus jamais perdu.

A++

Dan


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 258
  • Hein, quoi !?
    • FsPassengers
Reply #12 - 27 October 2009, 16:09:15
En l'occurence il attend notre handle a nous pour la première ligne donc tu fait:

au lieu de: oapiGetGlobalPos (MyData.MyHandle,&GSpacecraftPos);
fait: oapiGetGlobalPos (GetHandle(),&GSpacecraftPos);


Offline Tom

  • Sr. Member
  • ****
  • Posts: 367
  • Karma: 0
Reply #13 - 27 October 2009, 17:51:27
:( :( Je dois pas être fait pour ça !

J'ai beau regarder les références et tout comme dans ton tuto Dan, je vois pas ce qui cloche.

J'ai bien récupéré des handles avec pour le soleil : (dans clbkPostStep.cpp)

Quote
OBJHANDLE ObjHandleSun = oapiGetObjectByName ("sun");

et toujours dans clbkPostStep.cpp plus bas j'ai :
Quote
VECTOR3 GSpacecracftPos;
VECTOR3 GSunPos;
VECTOR3 SpacecracftPos;
VECTOR3 SunPos;
VECTOR3 pos;
oapiGetGlobalPos (GetHandle(),&GSpacecraftPos);
oapiGetGlobalPos(ObjHandleSun, &GSunPos);
Global2Local(GSpacecraftPos, SpacecraftPos);
Global2Local(GSunPos, SunPos);
pos = SunPos - SpacecraftPos;

ça compile au poil ! Seulement en vérifiant les valeurs de pos avec DebugString() dans orbiter ça part dans tous les sens ?

Soit j'ai rien compris, soit il me manque encore un élément !


---------------
Tom

Offline tofitouf

  • Legend
  • ******
  • Posts: 1380
  • Karma: 0
Reply #14 - 28 October 2009, 10:27:49
étrange éffectivement.
Mais y'a totu de même un truc qui me chiffone :

oapiGetGlobalPos (GetHandle(),&GSpacecraftPos); demande la position globale de ton vaisseau.
Global2Local(GSpacecraftPos, SpacecraftPos); la repositionne par rapport à...  ton vaisseau donc on devrais obtenir zero......

me gourre-je ?


---------------------------------------------

PC en rade, codage en panne.... Nom de Zeus

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 258
  • Hein, quoi !?
    • FsPassengers
Reply #15 - 28 October 2009, 11:05:11
Quote
tofitouf a écrit:
étrange éffectivement.
Mais y'a totu de même un truc qui me chiffone :

oapiGetGlobalPos (GetHandle(),&GSpacecraftPos); demande la position globale de ton vaisseau.
Global2Local(GSpacecraftPos, SpacecraftPos); la repositionne par rapport à...  ton vaisseau donc on devrais obtenir zero......

me gourre-je ?


Non, tu passe les coordonnée de globale a locale. Ça c'est bon.
Vérifie le handle de ton sun. Pour debug fait le juste avant:

Code: [Select]
OBJHANDLE ObjHandleSun = oapiGetObjectByName ("sun");
VECTOR3 GSpacecracftPos;
VECTOR3 GSunPos;
VECTOR3 SpacecracftPos;
VECTOR3 SunPos;
VECTOR3 pos;
oapiGetGlobalPos (GetHandle(),&GSpacecraftPos);
oapiGetGlobalPos(ObjHandleSun, &GSunPos);
Global2Local(GSpacecraftPos, SpacecraftPos);
Global2Local(GSunPos, SunPos);
pos = SunPos - SpacecraftPos;

Et méfie toi des mauvais mix variable locale/globale (ne pas en avoir une dans la class et une dans la fonction avec le même nom)

Cela dis les coordonnée sont forcément énormes vu la distance. Vérifie plutot coté distance, pitch et yaw
avec par exemple plus bas un affichage debug:

Code: [Select]
sprintf(oapiDebugString(),"Distance: %.2f Yaw: %.2f  Pitch %.2f",dDistance,yaw,pitch );
Of course faut d'abord changer la ligne Distance:
Code: [Select]
double dDistance = sqrt(pow(pos.x, 2) + pow(pos.y, 2) + pow(pos.z, 2));

Et utilise bien des "double" partout, int ou float ca va pas.

Dan


Offline Tom

  • Sr. Member
  • ****
  • Posts: 367
  • Karma: 0
Reply #16 - 29 October 2009, 00:53:34
Merci beaucoup, ça marche ! Je ne sais pas exactement où j'ai était le problème, j'ai essayé plein de trucs, et maintenant mon yaw et mon pitch sont corrects ! Il me
reste quelques réglages à faire pour que les panneaux pointent effectivement vers le soleil et ne lui tourne pas le dos, je sais pas encore comment faire, mais j'imagine
que ça doit pas être trop sorcier !

Merci encore pour vos aides précieuses !


---------------
Tom

Offline DagoO

  • Legend
  • ******
  • Posts: 2161
  • Karma: 7
Reply #17 - 29 October 2009, 02:02:04
Hé ben c'est à cette heure là qu'on bosse ?! :badsmile:



Offline Tom

  • Sr. Member
  • ****
  • Posts: 367
  • Karma: 0
Reply #18 - 29 October 2009, 07:52:16
Bien obligé ! La journée je dois bosser mes cours ! :D Les partiels commencent mercredi ! :eek:


« Last Edit: 29 October 2009, 07:52:16 by Tom »
---------------
Tom