#0 

14-02-2007 16:09:35

diOxy
Abonné
Date d'inscription: 10-10-2006
Messages: 153

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


#1 

14-02-2007 17:07:09

Jerry Kan
Habitué
Date d'inscription: 21-11-2006
Messages: 265

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

Hors ligne


#2 

14-02-2007 18:11:52

diOxy
Abonné
Date d'inscription: 10-10-2006
Messages: 153

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


#3 

14-02-2007 18:38:03

Jerry Kan
Habitué
Date d'inscription: 21-11-2006
Messages: 265

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

Dernière modification par Jerry Kan (14-02-2007 18:41:16)

Hors ligne


#4 

17-02-2007 22:35:10

ptitfred
Membre
Lieu: Paris
Date d'inscription: 17-02-2007
Messages: 21
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


#5 

18-02-2007 14:10:25

diOxy
Abonné
Date d'inscription: 10-10-2006
Messages: 153

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


#6 

18-02-2007 14:56:58

Jerry Kan
Habitué
Date d'inscription: 21-11-2006
Messages: 265

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"

Dernière modification par Jerry Kan (18-02-2007 15:03:44)

Hors ligne


#7 

18-02-2007 15:11:32

Jerry Kan
Habitué
Date d'inscription: 21-11-2006
Messages: 265

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

Hors ligne


#8 

18-02-2007 17:35:55

ptitfred
Membre
Lieu: Paris
Date d'inscription: 17-02-2007
Messages: 21
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


#9 

20-02-2007 11:36:58

diOxy
Abonné
Date d'inscription: 10-10-2006
Messages: 153

@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


#10 

12-07-2007 17:56:21

RaphAstronome
Petit nouveau
Date d'inscription: 12-07-2007
Messages: 1

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


#11 

14-07-2007 23:00:41

diOxy
Abonné
Date d'inscription: 10-10-2006
Messages: 153

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


#12 

09-12-2007 01:19:00

ptitfred
Membre
Lieu: Paris
Date d'inscription: 17-02-2007
Messages: 21
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


#13 

09-12-2007 21:44:15

diOxy
Abonné
Date d'inscription: 10-10-2006
Messages: 153

Pas de problèmes, voila :

Vue de dessus :


Vue de l'intérieur :


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

Code:

            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);
            }

Dernière modification par diOxy (09-12-2007 21:49:11)

Hors ligne


#14 

11-12-2007 10:26:20

diOxy
Abonné
Date d'inscription: 10-10-2006
Messages: 153

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é
Corrections
irrlicht
irrklang
irredit
irrxml
xhtml 1.0
css 2.1
Propulsé par FluxBB
Traduit par FluxBB.fr
883 membres
1429 sujets
11121 messages
Dernier membre inscrit: Saidov17
134 invités en ligne
Aucun membre connecté
RSS Feed