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: Orbiter dans Unity  (Read 6729 times)

0 Members and 1 Guest are viewing this topic.

Offline Olrik_jhor

  • Full Member
  • ***
  • Posts: 184
  • Country: France fr
  • Karma: 13
21 January 2016, 22:12:13
Bonjour a tous !

Hier j'ai commencer a m'amuser a recréer Orbiter dans Unity.



Quelques captures de rendus :

Delta Glider tout y est RCS , main et hover.




Astronaute de Moonbase Alpha modifier rig et animer par mes soins.





Je ferai une vidéo quand j'aurai avancer un peu plus.

Points positif :

- Scripts pas compliquer.  (Sauf pour les planètes et la mécanique de Newton)
J'ai utilisé un terrain pour la lune et la lune 3D c'est juste une sphère.

-  Multijoueur facilement intégrable.

- Astronautes (multi possibilités)

- Vaisseaux rapide a intégrer (Les particules c'est un peu plus long ..)

Points négatif :

- Mécanique Newtonienne.

- Planètes.   

(Mes connaissances son limitées)

« Last Edit: 21 January 2016, 22:20:47 by Olrik_jhor »

Offline jacquesmomo

  • Le budget !!!
  • Legend
  • ******
  • Posts: 7408
  • Country: France fr
  • Karma: 598
  • Plus on rate, plus on a de chances de réussir !..
Reply #1 - 22 January 2016, 00:54:12
C'est beau  :love:

Mes add-ons sont là !

Offline Olrik_jhor

  • Full Member
  • ***
  • Posts: 184
  • Country: France fr
  • Karma: 13
Reply #2 - 22 January 2016, 01:24:57
 :) oui

Je script en C# si il y a des codeurs sur le forum qui pourrai m'expliquer les mécanique d'orbiter en script  :wor:


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #3 - 22 January 2016, 06:09:18
C'est superbe ! :love:

Pour la mécanique...euh, c'est un sujet complexe, les équations orbitales sont disponible il faut encore les traduire en code et le faire très rapidement.

C'est un très gros boulot quand même. Commence par implémenter les lois de base, si tu obtiens un truc viable et que tu as encore le courage tu peux complexifier.


Offline jacquesmomo

  • Le budget !!!
  • Legend
  • ******
  • Posts: 7408
  • Country: France fr
  • Karma: 598
  • Plus on rate, plus on a de chances de réussir !..
Reply #4 - 22 January 2016, 08:07:40
C'est un très gros boulot quand même.
Olrik_jhor-biter est en marche !!!  :badsmile:

« Last Edit: 22 January 2016, 12:09:06 by jacquesmomo »
Mes add-ons sont là !

Offline antoo

  • Legend
  • ******
  • Posts: 3659
  • Country: France fr
  • Karma: 179
  • MSFS ❤️
Reply #5 - 22 January 2016, 10:58:33
C'est joliii ! Bravo !

---------------------------------------------------------------------------------------------------
"ET C´EST PARTI!!" Youri Gagarine au lancement de vostok 1 le 12 avril 1961

Offline Jim Lovell

  • Global Moderator
  • Legend
  • *****
  • Posts: 1529
  • Country: Belgium be
  • Karma: 31
    • Mon site
Reply #6 - 22 January 2016, 11:52:40
Wahou c'est top !
Unity permet de faire de belles choses assez rapidement, je n'ai pas encore eu l'occasion de m'y pencher beaucoup dessus malheureusement...

Ce qui est cool aussi c'est la compatibilité Oculus Rift en quelques clics ! :love:

Jim Love:love:LL
C'est en se plantant que l'on construit ses racines....


ConneXion

Offline Bibi Uncle

  • Legend
  • ******
  • Posts: 2264
  • Country: Canada ca
  • Karma: 17
Reply #7 - 22 January 2016, 18:02:09
Impressionnant !

Pour la physique, qu'as-tu besoin de plus que les lois de Newton ? Intégrer la relativité ou les corps non sphérique, c'est hardcore pour pas grand chose. D'ailleurs, Orbiter est un simulateur newtonien.

Sinon, pour une implémentation de base, tu as besoin de :
La loi de la gravitation : Fg = (G * m1 * m2) / r^2
Les lois de Newton: Sum(F) = ma
v = dx/dt
a = dv/dt

En gros, pour chaque corps, tu calcules la somme vectorielle des forces exercées par toutes les autres corps. Ensuite, tu calcules son accélération avec la loi de Newton. Finalement, tu calcules sa vitesse et sa nouvelle position grâce au dt (le temps écoulé depuis le dernier frame) donnée par Unity. Il est important de mettre à jour la position des corps une fois avoir tout calculé les forces. Sinon, les corps bougent en même temps que les calculs, et cela va mener à des imprécisions.

Un peu de code pour la route (écrit en pseudo-Python, pour simplifier l'écriture):

Code: [Select]
for body in bodies:
    var totalForces = new Vector()

    for otherBody in bodies:
        if body == otherBody:
            continue

        var direction = otherBody.position - body.position
        var force = (G * body.mass * otherBody.mass) / direction.length**2

        totalForces += direction.normalize() * force
       
    var acceleration = totalForces * m
    body.setSpeed(body.speed + acceleration * dt)

for body in bodies:
    body.setPosition(body.position + body.speed * dt)

Rien de tout cela n'a été testé, il y a donc probablement des erreur. Quand même, tu as la logique de base pour débuter.

Bien sûr, mon algo considère tous les corps comme des masse ponctuelle. Ça simplifie vraiment les calculs. Et pour des planètes qui sont plutôt sphérique et avec une masse distribuée uniformément, c'est une bonne approximation.

« Last Edit: 23 January 2016, 03:27:12 by Bibi Uncle »
Émile

Pluton, Saturne et Jupiter
Entendez-vous monter vers vous le chant de la Terre?

- Luc Plamondon

Offline Fox-Terrier

  • League of
  • Legend
  • ******
  • Posts: 1426
  • Country: Switzerland ch
  • Karma: 28
  • :D
Reply #8 - 22 January 2016, 18:48:42
C'est cool, ça permet de se rendre compte de toutes les difficultés que pose la création d'un simu spatial ;)

Effectivement Newton suffit, mais les grosses difficultés vont plutôt être d'ordre mathématiques : Comment représenter la position et les vitesses des astres, les vecteurs etc. Plus un problème de résolution de l'équation que t'as citée

Bibi : Ton algo a malheureusement un petit problème qui vient de l'approximation linéaire du déplacement entre tes calculs

Code: [Select]
body.setSpeed(body.speed + acceleration * dt) --> là tu sous-entends que c'est un mouvement uniformément accéléré, donc linéaire.

Comme tes corps tournent toujours dans le même sens, l'erreur entre la position réelle et la position calculée va toujours augmenter ... avec un soleil et une planète, la planète prendra toujours la poudre d'escampette.

Maintenant, au lieu de faire une approximation linéaire, on pourrait chercher à trouver une formule qui donne directement la position au lieu des forces. Une telle solution existe pour le problème à 2 corps, mais pas au delà ...

Si vous voulez de la lecture sur le sujet, j'ai trouvé ça (c'est plus clair que wikipedia) : http://lal.univ-lille1.fr/m316/cours_m316.pdf


Offline Maxorbiter

  • LordCroussette
  • Legend
  • ******
  • Posts: 2365
  • Country: Canada ca
  • Karma: 204
    • J'écris des fanfictions!
Reply #9 - 23 January 2016, 03:02:32
Wouah ! :eek: Tu nous envoie une version jouable dit ? :badsmile:



Offline Bibi Uncle

  • Legend
  • ******
  • Posts: 2264
  • Country: Canada ca
  • Karma: 17
Reply #10 - 23 January 2016, 03:53:16
Bibi : Ton algo a malheureusement un petit problème qui vient de l'approximation linéaire du déplacement entre tes calculs

Code: [Select]
body.setSpeed(body.speed + acceleration * dt) --> là tu sous-entends que c'est un mouvement uniformément accéléré, donc linéaire.

Comme tes corps tournent toujours dans le même sens, l'erreur entre la position réelle et la position calculée va toujours augmenter ... avec un soleil et une planète, la planète prendra toujours la poudre d'escampette.

En effet, mon algo n'est qu'une approximation numérique du problème. Il n'est précis qu'avec un petit dt, donc un fréquence de rafraîchissement élevée. Toutefois, j'ai implémenté cet algo en 2D dans un projet de session l'année dernière, et sa précision était suffisante pour faire orbiter un satellite autour d'une planète, tant que l'on restait à des vitesses raisonnables.

Intéressant l'article, je l'ai parcouru rapidement. La méthode de Runge-Kutta d'ordre 4 devrait donner de meilleurs résultats. Si j'ai bien compris, c'est le même principe que la solution que j'appliquais (celle d'Euler), sauf qu'au lieu de calculer directement la différentielle, on calcule la pente en plusieurs points autour du point voulu, puis on fait une moyenne de ces pentes pour calculer le prochain point. Là aussi, une erreur va s'accumuler, mais elle devrait être inférieure. Orbiter semble d'ailleurs utilisé une variante de cette approche pour faire ses calculs ( http://orbit.medphys.ucl.ac.uk/press/orbiter2006.pdf )

Émile

Pluton, Saturne et Jupiter
Entendez-vous monter vers vous le chant de la Terre?

- Luc Plamondon

Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #11 - 23 January 2016, 07:05:46
Bonne idée !
Tu peux aussi acheter ce projet sur l'asset store....
Toute la mécanique est déjà créée dans ce projet.

https://www.assetstore.unity3d.com/en/#!/content/34965

Essaye aussi la web player demo
http://nu.sycoforge.com/data/webplayer/orbital_gravity/orbital_gravity_demo.html




« Last Edit: 23 January 2016, 07:22:44 by picto »
Pic

Offline Olrik_jhor

  • Full Member
  • ***
  • Posts: 184
  • Country: France fr
  • Karma: 13
Reply #12 - 23 January 2016, 15:06:36
Merci à tous !   :)
Je vais voir cela quand je serai chez moi.

je précise aussi que si ce projet deviens concret il sera gratuit.
Donc toute aide proposer est bonne à prendre. :beer:


Offline Maxorbiter

  • LordCroussette
  • Legend
  • ******
  • Posts: 2365
  • Country: Canada ca
  • Karma: 204
    • J'écris des fanfictions!
Reply #13 - 23 January 2016, 16:26:20
Tu devrais faire un vaisseau EXCLUSIF a ce jeu ! :)



Offline Lift-off

  • Jr. Member
  • **
  • Posts: 15
  • Country: France fr
  • Karma: 5
Reply #14 - 30 January 2016, 13:30:50
Whaou ! Unity apporte un shading et un traitement des lumières assez impressionnant !!

Sinon d'un point de vue plus plus mécanique, j'ai pensé que l'utilisation d'un repère de Frenet, pourait aider pour la mise en code ( là par contre je peut rien faire pour vous !  :sad: ) : ( o , Un  , Ut ) (Un et Ut les vecteurs unitaires )
avec a = an * Un  + at * Ut
Avec an = v²/r  et at = dv/dt ( v le vecteur vitesse tangentiel ).

Sinon par la seconde loi de Newton on a aussi : a = ((G * Masse Planète) / r²) * Un
d'où v = sqrt ( (G * masse planète ) / r )

Mais tout ça ne marche que des orbites circulaires.

sinon, bon courage dans ton projet !