#1 

14-02-2007 15:09:35

diOxy
Membres
Avatar de diOxy
Date d'inscription:
Messages: 153
IP: 41.223.30.150
Courriel

Salutation !

J'aimerais trouver un algo qui me permettrais de créer une galaxie peuplée d'environ 60.000 à 100.000 systèmes. Ce n'est pas vraiment complexe a la base, en fait le truc complexe est que j'aimerais avoir une distribution des systèmes équitable pour les joueurs. Pas qu'un joueur débutant se retrouve avec des systèmes trop lointains nécessitants un niveau excessif de développement pour les atteindre. De plus il faudrais (et c'est logique) que le nombre de système au centre de la galaxie soit bien plus élevé que sur les bords.

Ou alors je continue avec ma galaxie rectangulaire...
(Zut, je viens d'avoir une idée de génie... Elle doit être de mer...credi si je pense qu'elle est géniale....)

Si vous avez ce genre d'algo dans vos calepins, en tout cas, je suis preneur.

Merci et a peluche ! smile


Hors ligne


#2 

14-02-2007 16:07:09

Jerry Kan
Membres
Date d'inscription:
Messages: 265
IP: 82.243.77.149
Courriel

je sais pas si je vais avoir une solution, mais ton probleme m'interresse, j'y réflechi


Hors ligne


#3 

14-02-2007 17:11:52

diOxy
Membres
Avatar de diOxy
Date d'inscription:
Messages: 153
IP: 41.223.30.150
Courriel

L'idée de génie, qui est une véritable daube en fait, est de donner a ma galaxie la forme d'un anneau de moebius... C'est con, hein ? wink

Merci a toi Jerry Kan ! smile


Hors ligne


#4 

14-02-2007 17:38:03

Jerry Kan
Membres
Date d'inscription:
Messages: 265
IP: 82.243.77.149
Courriel

alors j'ai deux solutions qui peuvent se combiner :

la premiere :

tu découpe ta galaxie en cases, et tu fait un algo récursif de répartition a plat, ou tu prends a chaque fois 4 cases découpées dans la premiere :

donc tu part avec rempli_etoiles(S1,S2, nb_etoiles) // S1 et S2 sont les sommets de la case courante

et dedans tu relance ta fonction sur 4 sous carrés avec nb_etoiles =nb_etoiles/4 et

et quand tu veux que la répartition soit plus homogène, tu ne respecte plus le /4 et/ou tu arrete de redécouper réccursivement ton espace, et tu fait un random des positions dans ta sous case

si tu veux moduler le fait que le centre est plus dense, tu module nb d'étoiles en multipliant par l'inverse de la distance au centre, (plus t'est proche, plus tu alloue d'étoiles)


pour passer d'une répartition plane a un espace 3d, tu fait une répartition gaussienne, en pratique : tu prends une courbe de gauss, et tu l'utilise pour répartir tes positions horizontales

Comme moi tu pige pas trop comment on se sert efficacement d'une gaussienne, et tu veux coder ca a l'arrache ?
tu fait un tirage sur 100 valeurs, et tu dit que pour un résultat entre 0 et 25, ca te place au point 0,
entre 25 et 40 ca te place au point 1 (ou -1)
entre 40 55 ca te place au point 2 (ou -2)
etc en réduisant la fenetre a chaque fois,

comme ca la plupart de tes étoiles seront autour de -2 / 2 mais y'en aura d'autres éparpillées de facon aléatoire autour

tiens j'y pense, tu peux faire exactement la meme chose pour la position en x et la position en y, avec les fenetres que tu veux pour adapter le % d'étoiles dans chaque truc

c'est un peu brouillon tout ca, mais j'espere t'avoir donné une piste smile


Hors ligne


#5 

17-02-2007 21:35:10

ptitfred
Membres
Avatar de ptitfred
Date d'inscription:
Messages: 21
IP: 81.251.85.136
Courriel  Site web

Bonjour à tous!

J'aurais une réponse "scientifique" à te proposer :

Pour générer une galaxie qui te semble crédible il te faut déjà fixer des objectifs de crédibilité.

Il existe plusieurs types de galaxies, identifiables par des caractéristiques géométriques et statistiques. Pour simplifier, les étoiles se regroupent en branches, qui s'étirent depuis un centre plus volumineux, théoriquement autour d'un trou noir (mais c'est un détail). Les branches sont courbées du fait de la rotation (force centrifuge vs gravité... orbite quoi).

Après tu peux considérer que modéliser les branches est trop détaillé et te simplifier la vie en faisant quelque chose de plus uniforme.
Mais le disque galactique ne serait pour autant pas strictement uniforme.
En gros tu considères 3 répartitions statistiques sur 3 plans: l'écliptique, et 2 axes de l'ellipse galactique.

Les 2 axes peuvent etre représentés par la meme loi statistique et ta galaxie sera donc circulaire.
L'ecliptique pourra te permettre entre autre de modéliser la bulle centrale.

donc pour les 2 axes x et y tu prends une répartition gaussienne.
pour l'axe z tu modélises l'épaisseur et là il faut faire une répartition qui dépend de la distance au centre, c'est plus délicat

il y a un peu de travail sur cette question encore

mais pour résumer ca dépend principalement du degré de vraissemblance du résultat que tu comptes obtenir

il faudra que je revienne avec des détails un peu plus tard

fred

Hors ligne


#6 

18-02-2007 13:10:25

diOxy
Membres
Avatar de diOxy
Date d'inscription:
Messages: 153
IP: 41.223.30.150
Courriel

Merci pour vos réponses.

Mon problème viens des points suivants :

  • je n'ai pas envie d'une galaxie carré ou cubique.
  • J'aimerais une distribution équitable des systèmes.
  • Plus on s'approche du centre, plus les systèmes sont nombreux et proches.
  • La navigation VISUELLE doit être simple et rapide.
  • Le système de repérage ne doit pas être une usine a gaz.


Actuellement, j'hésite entre 2 options :
  • 1 gros cube, mais dont les faces opposées sont connectées (Pas de limite, effet moebius).
  • Une galaxie spirale, fine sur les bords, épaisse au centre.


Hors ligne


#7 

18-02-2007 13:56:58

Jerry Kan
Membres
Date d'inscription:
Messages: 265
IP: 82.243.77.149
Courriel

la deuxieme, la deuxieme .. smile

ne serait ce que parce que le joueur pourra se déplacer tout en aillant une idée de sa position 2d, nous avons toujours tendance a penser en 2d, meme si c'est dans une galaxie 3d

j'ai toujours révé de pouvoir dire "j'ai ma base dans la bordure extérieure, un peu a l'écart du plan de l'écliptique"


Hors ligne


#8 

18-02-2007 14:11:32

Jerry Kan
Membres
Date d'inscription:
Messages: 265
IP: 82.243.77.149
Courriel

d'ailleur c'est pour quel genre de jeu ? Rpg ou stratégie ?


Hors ligne


#9 

18-02-2007 16:35:55

ptitfred
Membres
Avatar de ptitfred
Date d'inscription:
Messages: 21
IP: 83.113.100.128
Courriel  Site web

Bonjour

  • je n'ai pas envie d'une galaxie carré ou cubique.
  • J'aimerais une distribution équitable des systèmes.

il est assez aisé de générer un nuage de points qui ressemble à un disque : travailler en coordonnées cylindriques (r, théta, z),
avec r la distance entre la projection sur le plan de l'écliptique et le centre de la galaxie,
avec théta l'angle du point projeté sur le plan de l'écliptique,
avec z la distance au plan de l'écliptique (projection sur l'axe perpendiculaire au plan de l'écliptique),
faire l'hypothèse d'une galaxie sans branche, uniforme
méthode:
  • tirer une valeur de
théta suivant une répartition uniforme entre 0 et 2*Pi
  • tirer une valeur de
r selon la répartition de ton choix (là c'est un choix de modélisation, une repartition uniforme peut suffire entre 0 et R le rayon de ta galaxie)
  • tirer une valeur de
z suivant une autre répartition, de préférence dépendant de la distance au centre.
  • boucler autant de fois que tu veux d'étoiles


  • Plus on s'approche du centre, plus les systèmes sont nombreux et proches.

> voir juste au dessus : cela consiste à bien choisir la répartition pour r et z

  • La navigation VISUELLE doit être simple et rapide.

j'avoue ne pas voir le rapport avec la génération de la galaxie, ce sont 2 problèmes différents

  • Le système de repérage ne doit pas être une usine a gaz.

Tu as à ta disposition quelques systèmes de coordonnées classiques : cartésien, cylindrique, sphérique (peu pertinent ici) ou personnalisé : découper ta galaxie en secteurs, les nommer.... à toi de voir

Ce genre de problème est mathématiquement intéressant puisqu'il fait appel à la fois aux statistiques et à la géométrie.

Bon courage à toi smile

Hors ligne


#10 

20-02-2007 10:36:58

diOxy
Membres
Avatar de diOxy
Date d'inscription:
Messages: 153
IP: 41.223.30.150
Courriel

@Jerry Kan : A la question "Rpg ou stratégie" je répond : "Les deux ! wink"
L'idée m'est venue avec des jeux online :

  • Ogame <
http://www.ogame.fr>
  • Exile <
http://www.exile.fr>
Ainsi qu'avec le jeu Mankind.

Je vais faire une présentation de mon jeu, tiens. Mais pas dans ce topic.


Hors ligne


#11 

12-07-2007 15:56:21

RaphAstronome
Membres
Date d'inscription:
Messages: 1
IP: 90.40.229.238
Courriel

La galaxie aura t'elle un mouvement de rotation ?
Sera t'elle elliptique, irrégulière, spirale, spirale-barrée ? (je l'ai mis par ordre de difficulté croissante, les 3 dernières étant très compliqué voire ingérable si la rotation doit être crédible)


Hors ligne


#12 

14-07-2007 21:00:41

diOxy
Membres
Avatar de diOxy
Date d'inscription:
Messages: 153
IP: 216.147.138.173
Courriel

Salut !
Merci de ton intéret !
Elle est Ronde et dispose de 2 bras. L'algo est fini et tout fonctionne a merveille ! smile
Maintenant, il faut que j'exploite tout ça ! smile


Hors ligne


#13 

09-12-2007 00:19:00

ptitfred
Membres
Avatar de ptitfred
Date d'inscription:
Messages: 21
IP: 82.235.16.81
Courriel  Site web

Je sais que c'est un peu moche de faire remonter un sujet, mais j'aimerais vraiment avoir une idée de ce que ça peut donner !

Tu aurais un petit screenshot de ta galaxie, genre une sorte de vue de dessus visualisant les étoiles pour vérifier la configuration en spirale à 2 bras ?

Hors ligne


#14 

09-12-2007 20:44:15

diOxy
Membres
Avatar de diOxy
Date d'inscription:
Messages: 153
IP: 216.147.138.173
Courriel

Pas de problèmes, voila :

Vue de dessus :


Vue de l'intérieur :


Partie du code qui génère le placement des soleils.

            Random rnd = new Random(1500);
			SceneNode sun = new SceneNode();

            // L'algorithme suivant provient d'un exemple de l'OpenSceneGraph
            // Pour ceux qui veulent voir l'original, c'est la Demo : osgpointsprite
            for (uint i = 0; i < nbetoiles/2; i++)
            {
                val = (i * 2.0f / (float)nbetoiles * 2.0f * 3.14159265359f);

                // Bras 1
                modx1 = rnd.Next(short.MaxValue) / (float)short.MaxValue*2;
                mody1 = rnd.Next(short.MaxValue) / (float)short.MaxValue*2;
                modz1 = ((rnd.Next(short.MaxValue) - (float)short.MaxValue / 2) / (float)(short.MaxValue)) * 3 / (val + 1);

                sunX = ((float)Math.Cos(val) * val + modx1) * etendue;
                sunZ = ((float)Math.Sin(val) * val + mody1) * etendue;
                sunY = modz1 * etendue;

                sun = smgr.AddBillboardSceneNode(smgr.RootSceneNode, new Dimension2Df(tailleDesSoleils, tailleDesSoleils), -1);
                sun.Position = new Vector3D(sunX, sunY, sunZ);
                sun.SetMaterialType(MaterialType.TransparentAddColor);
                sun.SetMaterialTexture(0, textures_soleils[rnd.Next(NbTexturesSoleils)]);
                sun.SetMaterialFlag(MaterialFlag.Lighting, false);

                // Bras 2
                modx2 = rnd.Next(short.MaxValue) / (float)short.MaxValue * 2;
                mody2 = rnd.Next(short.MaxValue) / (float)short.MaxValue * 2;
                modz2 = ((rnd.Next(short.MaxValue) - (float)short.MaxValue / 2) / (float)(short.MaxValue)) * 3 / (val + 1);

                sunX = (-(float)Math.Cos(val) * val + modx2) * etendue;
                sunZ = (-(float)Math.Sin(val) * val + mody2) * etendue;
                sunY = modz2 * etendue;

                sun = smgr.AddBillboardSceneNode(smgr.RootSceneNode, new Dimension2Df(tailleDesSoleils, tailleDesSoleils), -1);
                sun.Position = new Vector3D(sunX, sunY, sunZ);
                sun.SetMaterialType(MaterialType.TransparentAddColor);
                sun.SetMaterialTexture(0, textures_soleils[rnd.Next(NbTexturesSoleils)]);
                sun.SetMaterialFlag(MaterialFlag.Lighting, false);
            }


Hors ligne


#15 

11-12-2007 09:26:20

diOxy
Membres
Avatar de diOxy
Date d'inscription:
Messages: 153
IP: 216.147.138.173
Courriel

J'ai oublié de préciser.

Les soleils que vous voyez sont vraiment énormes parce que justement, avec une taille presque normale il aurait fallu que j'en mette 100 fois plus pour voir la galaxie. Et là, j'aurais atteint les limites de ma carte. Si j'affichais la totalité des soleils que j'ai prévu d'un seul coup, je saturerais la mémoire. Il y a donc un affichage en fonction de l'amplitude (taille, luminosité) des soleils.

Malheureusement, ce projet est également en stand by, because trop de boulot en ce moment.


Hors ligne


Options Liens officiels Caractéristiques Statistiques Communauté
Préférences cookies
Corrections
irrlicht
irrklang
irredit
irrxml
Propulsé par Django
xhtml 1.0
css 2.1
884 membres
1440 sujets
11337 messages
Dernier membre inscrit: Saidov17
119 invités en ligne
membre en ligne: -
RSS Feed