Premier programme.

Cet article (et tous ceux qui vont suivre) explique la progression du projet « Constellations ».

  • Le résultat peut être trouvé ici.
  • Le user manuel ici.

Bon,  il n’y avait plus qu’à programmer. Mais en quel langage ? Je voulais un truc simple et rapide (car je m’imaginais que le programme complet ferait moins de 500 lignes). Cela voulait déjà dire :

  • Pas de compilation. Désolé pour ces langages, mais sortir la Grosse Bertha pour un projet de moins de 20.000 lignes de codes, je n’en voyais pas l’utilité ;
  • Utilisable et programmable partout, sur n’importe quel PC. La raison : j’en avais plusieurs dont certains sans accès d’installation. Seulement le programme Notepad2. C’était tout.

Bref, en cherchant un peu, j’hésitais entre Python et Javascript. Mais le hic avec Python, c’était la 3D. J’adore Python mais la 3D, cela n’a jamais été son truc, alors que Javascript a des librairies 3D à ne plus savoir qu’en faire.

Deux étaient intéressantes : tree.js et babylon.js, mais en voyant une démo de lens flare sur un soleil bien blanc (démo ici), c’était pile poil ce dont j’avais besoin. Et en voyant le code, cela ne m’avait pas l’air très mirobolant.

Premier draft

Pour arriver à un truc pas trop dégoûtant (et surtout fonctionnel), il fallait faire quelques choix architecturaux.

  • Les données sont directement au format Javascript (pas json ou csv).

C’est-à-dire que j’ai transformé le fichier csv (venant du site HYP) directement en tableau Javascript. En gros, chaque ligne était devenue quelque chose comme cela (voir ici pour le fichier complet) :

[0, ,,, ,,’Sol’,0.000000,0.000000,0.0000,0.00,0.00,0.0, -26700,4850,’G2V’,656,0.000005,0.000000,0.000000, 0.00000000,0.00000000,0.00000000,0,0,0,0,,,,1,0,,1,],

La raison principale étant la non-utilisation de librairie additionnelle (comme json ou csv) ainsi que de code additionnel. Ici, c’était le moteur Javascript qui allait tout faire directement au chargement. Le programme y gagnerait beaucoup en rapidité vu qu’il n’y avait pas de traitement à faire. De toute façon, ces données étaient statiques (les étoiles bougent peu sur une vie humaine).

En plus, je préférais cent fois faire quelques manipulations avec LibreOffice pour rajouter  des ‘ ou des , au bon endroit (pt de cellules trop courtes) que manipuler la librairie JSON.  Le fichier faisait trente-trois Mega’s, ce qui pour le lancer dans mon navigateur en local mettait 2-3 secondes à charger en local. Pas mal. Ils avaient fait des progrès sur Javascript ( Par après, j’ai aussi supprimé toutes les données inutiles du fichier. Le fichier ne faisait alors plus que 11 Méga’s.)

  • Pas besoin d’éclairage pour les sphères 3D.

Eh oui, si dans l’univers, c’étaient les étoiles qui éclairaient, dans un environnement 3D, c’était malheureusement un tantinet différent.

Dans un premier temps, j’avais représenté chaque étoile comme dans la vraie vie (et comme dans la démo). Une source lumineuse entourée d’une sphère 3D de couleur bleue (juste pour dire). Mais j’obtenais comme résultat un gros tas de boules blanches. Il me fallut un peu de temps pour comprendre, mais tout devint clair. Les distances entre les sphères n’étaient pas réelles, par contre, l’intensité lumineuse de chaque planète, si. Cela aveuglait. Sans parler du nombre d’objets à représenter sur la scène (tout fois deux : une sphère et une lumière).

Or, il y a une meilleure solution. Ne représenter que des sphères dans l’univers et mettre une lumière unique au-dessus de la tête, c’est-à-dire sur la caméra. En code, cela donne :

var light0 = new BABYLON.PointLight(« mainLight », new BABYLON.Vector3(0, 0, 0), scene);

light0.parent = camera1;

  • Très peu d’orientation Objet

La plus grosse erreur de ma vie (sur les 3 dernières semaines :-D). Plus sérieusement, cela me fera toujours rire, les gens qui, se croyant programmeurs parce qu’ils ont réussi à faire une macro dans Excel, viennent dire qu’il faut penser objet, concevoir objet, dormir objet. Et qu’un programme doit être directement codé avec des objets. NON !

J’ai toujours commencé un programme par un bête « hello world », pour ensuite faire des fonctions et des variables locales qui, une fois devenues in-maintenables, seraient transformées en objets avec hiérarchie et interface.

Et ici, pour le draft, il n’y avait principalement que des fonctions et des variables qui, justement, arrivaient à un stade où rajouter de nouvelles fonctionnalités devenait compliqué.

  • La taille de l’univers et des planètes

Alors là, c’était le plus dur. Évidemment, vu les distances et les tailles, impossible de représenter en réel (même pas sûr que le moteur 3D l’accepterait). Mais quelle échelle prendre ? J’en avais essayé plusieurs pour ensuite me rendre compte qu’il y avait un lien entre la distance et la taille d’une planète.

Sur la fin, notre soleil aura une taille 2 pour une galaxie de 1 000 000 (ce qui veut dire que l’étoile la plus éloignée sera au maximum à 1 000 000 de distance).

Voilà, avec ces quelques ajustements (et quelques autres), j’arrivais à ça. Ce n’était pas parfait, cela ramait si j’affichais toutes les étoiles d’une constellation, mais cela marchait.

Les constellations était affichées n’importe comment, aucune ne ressemblait à celle de Wikipédia, mais mon premier draft marchait :-D.

Next step : publication et Git.

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion /  Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion /  Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion /  Changer )

Connexion à %s