Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Orbita di un oggetto in C# - XNA
Forum - C# / VB.NET - Orbita di un oggetto in C# - XNA

Avatar
alta (Normal User)
Newbie


Messaggi: 3
Iscritto: 05/03/2010

Segnala al moderatore
Postato alle 12:57
Venerdì, 05/03/2010
Salve a tutti,
in primo luogo mi scuso se questo non è il posto giusto dove postare. Nel qual caso prego un mod di spostare nella sezione giusta ^^

Vorrei chiedervi aiuto in quanto pur sbattendoci la testa non sono riuscito a trovare una soluzione adeguata.

Ciò che vorrei fare è simulare la rotazione di un oggetto Luna attorno ad un altro oggetto Terra.
Di questi oggetti ho ovviamente un Vector3 che ne rappresenza la posizione.

Qualche idea su come risolvere?
Vi ringrazio anticipatamente :k:

Ultima modifica effettuata da alta il 05/03/2010 alle 13:18
PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 13:31
Venerdì, 05/03/2010
hai considerato una simulazione fisica?

gli oggetti in questione avranno 4 parametri fondamentali:
- massa (mTerra, mLuna)
- posizione (pTerra, pLuna)
- velocità (vTerra, vLuna)
- accelerazione (aTerra, aLuna)

considerando che la gravità influisce sull'accelerazione e che:

G = k * m1 * m2 / d^2 (dove G è una forza, k è una costante)

e ricordando che F = m * a, da cui a = F / m

ricaviamo che aTerra = G / mTerra
e che aLuna = G / mLuna

quindi semplificando otteniamo che:
aTerra = k * mLuna / d^2
aLuna = k * mTerra / d^2

Per trasformare queste equazioni in codice basta considerare le comuni leggi della dinamica e trasformarle in codice... (esempio in pseudocodice)

Codice sorgente - presumibilmente Plain Text

  1. inizio:
  2. // calcoliamo la distanza quadrata
  3. d2 = (pTerra.x - pLuna.x)^2 + (pTerra.y - pLuna.y)^2 + (pTerra.z - pLuna.z)^2
  4.  
  5. // calcoliamo le accelerazioni
  6. aTerra = k * mLuna / d2
  7. aLuna = k * mTerra / d2
  8.  
  9. // i vettori corrispondenti saranno:
  10. accVettTerra = aTerra * ((pLuna - pTerra) / (sqrt(d2)))
  11. accVettLuna = -accVettTerra // legge della reazione
  12. // ricordiamo che pLuna e pTerra sono vettori
  13.  
  14. // calcoliamo le velocità
  15. vTerra = vTerra + accVettTerra * deltaTempo
  16. vLuna = vLuna + accVettLuna * deltaTempo
  17.  
  18. // e le posizioni
  19. pTerra = pTerra + vTerra * deltaTempo
  20. pLuna = pLuna + vLuna * deltaTempo
  21.  
  22. // aggiorniamo la grafica
  23. disegnaSfera(pTerra)
  24. disegnaSfera(pLuna)
  25.  
  26. // ricominciamo il ciclo
  27. ripeti da inizio:



Fatta questa premessa, ricorda che le quantità vettoriali (come pTerra, vTerra, ecc...) consistono di 3 elementi (x,y,z) e che nelle equazioni dovrai tener conto di questa cosa (ad esempio ripetendo 3 volte le equazioni, oppure usando funzioni che lavorano direttamente sui vettori).
Inoltre dovrai occuparti anche della visualizzazione grafica (la funzione disegnaSfera), che per entità così semplici non è una cosa difficile e su questo sito potrai trovare diversi programmini e tutorial già pronti per l'uso...

Spero di averti dato una mano... ciao ;)

PM Quote
Avatar
alta (Normal User)
Newbie


Messaggi: 3
Iscritto: 05/03/2010

Segnala al moderatore
Postato alle 17:37
Venerdì, 05/03/2010
Ciao, per prima cosa grazie della risposta.
Mi sono dimenticato di dire, sempre che siano informazioni utili, che il progetto è creato come Game XNA 3.1, e che utilizzo per i due astri dei modelli 3D salvati in fbx.

Ho provato ad implementare l'algoritmo che mi hai suggerito.
Però da un problema dopo pochi cicli del gioco : la luna inizialmente sembra fare l'orbita, poi "scappa" :-|

Ti posto un parte del codice, perchè sicuramente avrò sbagliato io qualcosa

Codice sorgente - presumibilmente C# / VB.NET

  1. protected override void Update(GameTime gameTime)
  2. {
  3.   defineOrbit();//esegue i calcoli per la definizione delle posizioni
  4. ...
  5. }



Codice sorgente - presumibilmente C# / VB.NET

  1. private void defineOrbit()
  2.         {
  3.             // calcoliamo la distanza quadrata
  4.             // d2 = (pTerra.x - pLuna.x)^2 + (pTerra.y - pLuna.y)^2 + (pTerra.z - pLuna.z)^2
  5.             d2 =(float)(
  6.                 Math.Pow((double)(pTerra.X - pLuna.X),2) +
  7.                 Math.Pow((double)(pTerra.Y - pLuna.Y),2) +
  8.                 Math.Pow((double)(pTerra.Z - pLuna.Z), 2));
  9.             // calcoliamo le accelerazioni
  10.             // aTerra = k * mLuna / d2
  11.             // aLuna = k * mTerra / d2
  12.             aT = k * mLuna / d2;
  13.             aL = k * mTerra / d2;
  14.             // i vettori corrispondenti saranno:
  15.             // accVettTerra = aTerra * ((pLuna - pTerra) / (sqrt(d2)))
  16.             // accVettLuna = -accVettTerra // legge della reazione
  17.             aTerra.X = aT * ((pLuna.X - pTerra.X) / (float)Math.Sqrt((double)d2));
  18.             aTerra.Y = aT * ((pLuna.Y - pTerra.Y) / (float)Math.Sqrt((double)d2));
  19.             aTerra.Z = aT * ((pLuna.Z - pTerra.Z) / (float)Math.Sqrt((double)d2));
  20.             aLuna.X = -1 * aTerra.X;
  21.             aLuna.Y = -1 * aTerra.Y;
  22.             aLuna.Z = -1 * aTerra.Z;
  23.             // calcoliamo le velocità
  24.             // vTerra = vTerra + accVettTerra * deltaTempo
  25.             // vLuna = vLuna + accVettLuna * deltaTempo
  26.             vTerra = vTerra + aTerra;
  27.             vLuna = vLuna + aLuna;
  28.  
  29.             // e le posizioni
  30.             // pTerra = pTerra + vTerra * deltaTempo
  31.             // pLuna = pLuna + vLuna * deltaTempo
  32.             pTerra = pTerra + vTerra;
  33.             pLuna = pLuna + vLuna;
  34.         }




Se c'è un errore francamente non riesco a trovarlo :P

Inoltre non ci sarebbe un modo più semplice per calcolare queste posizioni?
Qualcosa che utilizzi, che ne so, seno e coseno o mostruosità simili:rofl::rofl:
L'importante è che la terra rimanga ferma, e che la luna gli orbiti attorno, con questa comunque dipendente dalla posizione della terra (in pratica se sposto durante l'esecuzione la terra anche la luna si dovrà spostare di conseguenza)


PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 17:46
Venerdì, 05/03/2010
che la luna scappi, o che cada sulla terra, è una cosa normale :D

accade anche nella realtà, ma su scale temporali di miliardi di anni.... basta solo trovare i valori corretti di velocità e posizione iniziali, e massa, per avere una simulazione decente...

Se vuoi fare una cosa meno simulativa, ma più "piacevole alla vista", allora puoi cambiare approccio e usare formule diverse:

ad esempio potresti simulare la cosa come un oggetto attaccato ad una molla. In questo caso le forumule della forza diventano quelle della molla, ma il resto rimane invariato.
Se giochi correttamente sui parametri del coefficiente elastico della molla, riuscirai ad avere un gradevole effetto di orbita, anche se fisicamente non corretto.

PS: per avere la terra sempre ferma, basta semplicemente lasciare la sua accelerazione e velocità a 0 e calcolare solo quelle della luna...
Altro esperimento che potresti fare è quello di calcolare la posizione della luna come moto circolare uniforme (quindi con seno, coseno, e tutte le cose che ti piacciono tanto), ma sarebbe un movimento troppo rigido e regolare. Inoltre spostando la terra, con le formule della molla, vedrai la luna avvicinarsi in modo "elastico", mentre con le formule del moto circolare uniforme, vedrai entrambi i corpi spostasti con un movimento rigido, poco estetico :p

Ultima modifica effettuata da TheKaneB il 05/03/2010 alle 18:07
PM Quote
Avatar
alta (Normal User)
Newbie


Messaggi: 3
Iscritto: 05/03/2010

Segnala al moderatore
Postato alle 10:59
Sabato, 06/03/2010
:D:D:D
Grazie degli aiuti :k:

Ho risolto in modo poco "realistico" utilizzando come formule quelle del moto curvilineo uniforme

Codice sorgente - presumibilmente C# / VB.NET

  1. protected override void Update(GameTime gameTime)
  2. {
  3.   GameObject.SetGameObjectRotationAngle(_moon, 0.1f);
  4.  
  5.   pLuna.Y = Radius * (float)Math.Sin(MathHelper.ToRadians(_moon.getRotation())) + planetPosition.Y;
  6.   pLuna.X = Radius * (float)Math.Cos(MathHelper.ToRadians(_moon.getRotation())) +  planetPosition.X;
  7.  
  8.   ...
  9.   ...
  10. }



Vedrò comunque di lavorare un po' su la formula che simula la fisica che mi hai suggerito, perchè a dir la verità mi affascina :rofl::love:

Ti ringrazio nuovamente:k:

Ultima modifica effettuata da alta il 06/03/2010 alle 10:59
PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 14:19
Sabato, 06/03/2010
eheh prego, figurati :k:

ciao!

PM Quote