Stage d'Arnaud Steinmetz - IUT Schuman Illkirch - [13/04/15 au 19/06/15]
Important : cette page est réservée au suivi du stage, merci de ne pas la modifier
Informations générales pour les stagiaires
Pour toute information concernant ce stage : contacter André
Sujet
Documents de travail
Stage (avril - juin 2015)
Avril
13 :
- Accueil et visite de différents bâtiments
- Création d'une arborescence de travail en local
- Téléchargement des principaux outils de développement et bibliothèques :
14:
- Spécification des attentes d'André Schaaff
- Modélisation WebGL : Ce premier projet fait suite à un stage effectué par un étudiant de l'ENSIIE l'année denière qui a réalisé une application de modélisation en OpenGL. André Schaaff m'a donc demander de réaliser un travail similaire en WebGL, du fait que cette dernière technologie de modélisation fonctionne sans plugin et est basé sur HTML5. Ce premier projet a donc été subdivisé selon les indications suivantes :
- Reprendre le travail déjà effectué concernant la modélisation du système solaire (réalisé en three.js durant les cours) en utilisant babylon.js, pour se faire à cette deuxième bibliothèque.
- Modéliser un ensemble de données dans l'espace à partir de données extraites d'un fichier (avec les deux bibliothèques).
- Comparer les deux librairies selon plusieurs critères :
- La performance (temps de chargement initial, taux de rafraichissement : Frame Per Second)
- La facilité de développement (Syntaxe utilisée les deux bibliothèques, documentation présentes)
- Les possibilités d'optimisation et les évolutions (maintien) de chaque librairies.
- Adaptation de la modélisation de données dans l'espace pour une utilisation avec l'Oculus Rift.
- Angular.js : Deuxième projet dont les spécifications restent à définir s'il reste du temps après la finalisation du premier projet.
- Recherche et lecture de documentations concernant Babylon.js
- Comparaison threeJS et BabylonJS
- Documents concernant de nombreuses fonctionnalités :
- Tutoriel explicatif de concepts généraux :
- Blogs des principaux développeurs :
- Création de code simple, pour comprendre babylon.js.
- Début de la création du système solaire sous babylon.js
15:
- Continuation du système solaire, mais interruption pour éviter de perdre du temps à fait d'un bug provenant d'une origine autre que babylon.js.
- Lecture du rapport de stage de Philippe Gaultier, étudiant à l'ENSIIE, ayant travaillé sur un projet similaire en OpenGL en 2014.
- Tentative de lancer l'application de Philippe, pour voir à quoi devra ressembler le rendu final. Mais il semble que j'ai mal configuré certaines librairies, je retenterais donc une prochaine fois.
- Prise de contact avec Philippe Gaultier, mail : filip.3@hotmail.fr
16:
- Passage à la modélisation d'un ensemble de donnée à partir de fichiers contenant des informations concernant la position d'étoiles dans un espace. Pour cela j'ai procédé en plusieurs étapes :
- Importation et stockage des données dans une variable à l'aide de XMLHTTPRequest
- Test de la limite en taille du fichier pouvant être chargé (aux alentours de 268 Mo)
- Lecture de documents concernant l'optimisation du code JavaScript :
- Modélisation des données dans l'espace (avec three.js).
17:
- Participation à la conférence sur les lentilles gravitationnelles
- Tentative de modélisation des données dans l'espace (avec babylon.js)
- Mise en place de moyens de visualisation de la performance des deux bibliothèques :
- Vitesse de chargement initiale de la page en ms.
- Vitesse de raffraichissement et Frame Per Second.
- J'ai notamment pu remarquer que three.js optimisait déjà les performances de modélisation des données, car lorsque le nombre de données affichées à l'écran (données présentes dans la scène quand même) diminue, on observe que le nombre de frame per second augmente.
- Visualisation de différents exemples d'utilisation des bibliothèques fournies sur les sites officiels de three.js et babylon.js. Le site Potree a retenu particulièrement mon attention avec cet exemple de Pompeii, où l'on peut voir le nombre assez important de points affichés sans grand soucis de lag. Je vais regardeer le code de ces exemples plus en détail la semaine prochaine.
20:
- Optimisation du rendu sur three.js
- Modification de l'objet cube représentant les données par des objets PointCloud beaucoup plus performant. Quelques examples d'utilisation ci-dessous : (A réutiliser également plus tard)
- Autres idées d'optimisation : Level of Details. Dans le cas de représentation de données plus complexe/
- Recherche de méthodes d'optimisation du JavaScript
21:
- Modélisation sous BabylonJS (plus complexe qu'avec three.js du au manque de documentation)
- Test des différentes caméra présentes dans three.js (la meilleure reste la PerspectiveCamera)
- Discussion avec André pour définir la suite du déroulement du projet (pistes traitées le lendemain)
- Les fichiers qu'il me fournit sont à chaque fois séparés en 8, donc pistes d'optimisation :
- Lecture en parallèle des fichiers et puis ajout des points à la scène par blocs ?
- Modification des contrôles pour se déplacer de manière plus fluide qu'avec la molette (Pas prioritaire)
22:
- Renseignement sur les possibilités de multiprocessing en JavaScript
- Web Workers : Créations de threads permettant au thread principal s'occupant de l'interface de ne pas être bloqué.
- FileReader : API permettant de lire des fichiers en JavaScript de manière asynchrone. (Remplace l'utilisation de XMLHttpRequest qui n'était pas adapté à la problématique du projet)
23:
- Mise en place de l'API File pour la lecture de fichier (compatible avec tous les navigateurs)
- Comparaison pur la lecture de fichier entre : (pour le moment la première solution est la plus simple et rapide -> a continuer à explorer)
- Renseignement sur les WebWorkers :
- Découverte
24:
- Matinée conférence sur le design patern singleton
- Tentative de faire une barre de progression prenant en compte la progression des 8 fichiers (en suspens pour le moment)
- André n'étant pas présent la semaine prochaine, grosse mise au point sur la suite :
- Interface :
- Voir comment mettre en place une interaction avec les éléments de la scène.
- Déplacement des particules :
- Voir s'il y a possibilités de modéliser des particules en mouvements (des exemples cités les jours précédent seront étudiés à nouveau)
- Voir s'il y a possibilité d'appliquer une fonction gérant le mouvement aux points.
- Octrees :
- Voir ce que cela pourrait apporter (je pense surtout à l'utilisation dans le cas des particules en mouvement, sachant que three.js fait déjà une optimisation partiel en fonction de ce qui se trouve dans le champs de la caméra)
- Chargement :
- Prise de contact avec des personnes :
- Ian Webster : ingénieur chez Google ayant réalisé Asterank
- Contact :
- Questions à poser :
- Utilisation des Web Workers
- Optimisations possibles dans mon cas
- MrDoob : créateur de la librairies three.js
- Contact :
- Questions à poser :
- Présentation de mon sujet
- Questions générales sur l'optimisation liée à three.js
- Babylon.js :
- Contact :
- David CATUHE (@deltakosh) : Développeur principal
- David ROUSSET (@davrous) : Dévelopeur
- Pierre LAGARDE (@pierlag) : Développeur
- Questions à poser :
- Présentation de mon sujet
- Questions générales sur l'optimisation liée à babylon
27 :
- Etude de WebCl permettant de réaliser des traitements parallèles en javascript. Malheureusement la librairies n'est plus tnue à jour et n'est qu disponible pour d'anciennes version de mozilla.
- Après recherche de plusieurs moyen d'évaluation du code, j'ai choisi FireBug du côté Mozilla :
28 :
- Retouche du code threeJS :
- Modification de la suppression des éléments après rechargement de nouveaux fichiers
- Tests fichiers output60 -> est-ce normal que tous les points sont alignés et décalés
- Amélioration de la visibilité du code et commentaire
29 :
- Recherche sur principes d'optimisations d'une modélisation de nombreux éléments (merging mesh)
- Déplacement de nombreux éléments
- Récupération des variables inutilisées (garbage collector)
- Optimisation de boucles
- Optiques d'amélioration
- Ray Casting
- Frustum Culling
- Octrees
- Object Pooling
30 :
Toutes les idées et recherches sont à exploiter la semaine à venir
Mai
4 :
- Modification du code pour que la modifcation de la taille de la fenêtre s'actualise
- Sort PointCloud
- Lecture de ressources parlant du WebGL pur (sans librairies) pour mieux comprendre certains fondements.
- WebGL 2.0:
- Autre outil utilisant WebGL Haxe
- Livres pouvant s'avérer intéressant :
- Présentation simpliste de threeJS
5 :
- Les objets vertices ont une propriété transformDirection
- Modification et test de la lecture des fichiers
- FileReader, la lecture des fichiers se fait de façon asynchrone soit
- par alternance
- vraiment asynchrone
- Le main reprend lorsque le code arrive à onload/onloadend
- Test de performance avec nouveau output
- 30 secondes de chargement initial pour 14 133 149 / 15 à 24 fps
- 32 secondes de chargement initial pour 17 318 587 / 15 à 22 fps
- Il va falloir découper les fichiers trop volumineux en sous partie s'il y a nécessité d'en lire.
6 :
7 :
- Compréhension de Potree
- Chargement des données par "chunk" de fichiers binaires ou compressé en LAZ/LAS
- Utilisation de webworkers (encore à voir ce qu'ils font réellement)
- Utilisation de wmlHTTPRequest pour faire les requêtes au serveur qui envoie les données (format /?\)
- Présence d'outils de mesure (longueur, angles, coupes, volume ?) --> il faudrait tenter d'en ajouter d'autre
- Possibilité de changer le déplacement de la caméra.
- Découpage de Potree pas à pas pour comprendre (en cours)
- path of pointcloud : ../resources/poinclouds/lion_takanawa/cloud.js
- cloud.js contient donnée des chunks binaires.
- initialisation des paramètres dat-gui (interface utilisateur)
- creation de 3 scènes (sûrement pour les différentes caméra)
- scene/scenePointCloud/sceneBG
- déclaration object3D referenceFrame ajouter à scene poinCloud
- Déclaration du renderer
- /?\ Pourquoi autoclear à false, intérêt ?
- /?\ A quoi sert l'extension frag_depth
- Chargement du pointcloud en utilisant POCLoader
- Déclaration PointCloudOctree
11 : Absent pour cause d'entretien et examen CNAM
12 :
- Renseignement fonctionnement Octrees
UI : Initialisation (scène, caméra, sélection fichier, interface - désactivée avant chargement de fichier) Worker | Requête chargement du fichier totalement en mémoire -> Chargement et envoie au thread principal ou garde côté worker ? UI : Ajout des éléments à la scène en fonction des octrees (ou autre découpage), ou ajout en chunk avec workers (potree) Worker | Modification de la position des vertices grâce à des fonctions de mouvement -> Mettre à jour la présence des vertices dans la structure utilisée
13 :
- Recherche sur buffers geometry et mise en place
Gain de 12 secondes de chargement en utilisant les buffers geometry "Nombre d'élément dans la scène : 25980565" "Temps écoulé 32367"
14 :
- Recherche sur la modification des couleurs
- grâce aux shaders
- grâce aux buffers
- Problème dans la formule de la couleur ?
18 :
- Modification de la couleur en fonction de l'âge
- Envoie de mail du fait de la formule qui semble étrange (screenshot)
- problème car couleur doit être entre 0 et 1 (résolu)
- /!\ question boucle pour récupérer l'étoile la plus ancienne
- /!\ que faire avec les valeurs nul
- Mise en place de dat gui
- Modification de la taille des points
- correctif lorsqu'on clickait sur dat la scène se déplaçait
19 :
- Questionnement pour modication de la représe
- Modification des contrôles pour adapter au clavier de type azerty
- ZQSD pour OrbitControls
- Correction d'un problème de rotation pour FPSControls qui lorsqu'on se déplaçait sur l'axe horizontal, la caméra effectuait une rotation en diagonale.
- Changement du reset pour FPSControls
- Tentative de mise en place de EarthControls (nécessite du raycasting)
20 :
- Recherche sur les meilleurs moyens de changer les paramètres des points durant la simulation
21 :
- Recherche sur des méthodes de picking (pour sélectionner les objets de la simulation)
- Mise en place d'une interaction lors d'un clic sur un objet de la scène
- Création d'un point rouge à l'emplacement du clic
- Tentative d'affichage d'information lors du clic sur l'élément.
- Correction bug, pour l'objet PointCloud, il ne faut pas oublier de spécifier le threshold à threeJS pour qu'il puisse correctement effectuer les calcul d'intersection.
22 :
- Recherche de mise à jour de l'opacité :
- Mise en place de la colorisation du point sélectionné
- Mise en place du contrôle par l'utilisation d'EarthControls
- Modification d'EarthControls pour que l'on puisse se déplacer à 360°
- Tentative d'utilisation de texture pour représenter les points
25 :
26 :
- Etoffage des commentaires du code
- Mise en place d'affichage d'information lors d'un clic sur un élément
- modification dat-gui
- Recherche de comment représenter les points très proches, pour éviter qu'ils se confondent.
27 :
- Correction d'un problèmes lors de la sélection des éléments en cliquant, du fait de computeBoundingBox (remplacé par computeBoundingSphere)
- Recherche sur l'utilisation de WebWorkers pour la lecture des fichiers
- Mise en place d'un zoom lors d'un double clic sur un élément. Lorsqu'on zoom il y a :
- Changement de la taille de tous les éléments (pour pouvoir les distinguer plus précisément)
- Déplacement de la caméra à l'emplacement cliqué + un offset de la taille des éléments (pour ne pas se retrouver dans l'élément
- Focus de la caméra sur l'emplacement du clic.
28 :
- Passage de Pierre G. pour la visite et débriefing
- Discution avec Nicolas Gillet pour les points
- Début de mise en place d'une multivues
Juin
1:
- Discution avec Nicolas Gillet :
- Il faudrait modifier la représentation des points (utilisation de shaders)
- Développement de l'aspect multivues
- Exemple même scène avec vues différentes (ViewPort)
- Questionnement, y a-t-il possibilité d'utilisé une même caméra pour deux scènes et renderer différents, pour ne pas avoir à appliquer les transformations similaires à deux caméras (clarté du code et optimisation à l'exécution)
- Mise en place de la modification de la taille des éléments de la scène grâce à l'interface
2:
3:
- Recherche de l'utilisation de threeJS avec l'oculus
4:
- Réalisation vue Oculus de la simulation
- Recherche d'un moyen d'animer les éléments dans l'espace tout en restant fluide. Plusieurs option
- Utilisation d'un shader, envoie des données à la GPU et calcul en GLSL
- Calcul et mise à jour des position directement dans le CPU principale (testé et non efficace, environ 7 FPS)
- Calcul des nouvelles positions en utilisant des WebWorkers (n'ayant pas assez d'expérience dans le domaine, je n'ai pas testé cette option)
5:
- Edition des shaders
- Mise en place du déplacement des particules de matières noires grâce aux shaders (fonctionne correctement à 60 FPS)
- Question posée sur StackOverFlow
- Idée de faire la même chose pour la modélisation skybot3D avec la formule et les données adaptées.
6:
- Mise en place de moyen de contrôle du défilement du temps dans la simulation animée de Nicolas Deparis.
- Test Oculus avec MozVR (mieux que les anciens exemples testés, il faudra voir ce que ça donne demain avec les contrôles et le câble micro-usb).
Remarques personnelles pour la continuation du projet :
Définir un format de données pour une utilisation plus générale. Vérification du format de donnée (Si non respecté, demander à l'utisateur de modifier la fonction de lecture) Utilisation de
WebWorkers (pour le chargement des données, à voir ce qui est le mieux) Utilisation d'Octrees
De plus dans la version de Mozilla Nightly, qui a deux versions d'avance sur l'officiel, ils sont en train d'établir des API intéressante :
Proposition : Ce qui serait intéressant serait de mettre en place la structure d'octree pour la modélisation, et lorsque la caméra se trouve trop loin d'un amas d'étoiles, il serait intéressant de charger une texture 2D de la galaxie correspondante. Puis lorsqu'on s'approche, il suffirait de charger les sous-cubes pour affiner la précision et donc charger directement les textures des étoiles/astéroïdes concernés.
=======================================================================================
=======================================================================================
CDD PARTIE OCULUS :
Mise en place de l'utilisation de l'oculus (headtracking et vue)
La configuration utilisée :
- Système d'exploitation : Windows 8.1
- Runtime Oculus
- Navigateur :
- Configuration résolution :
> Clic droit sur le bureau > Résolution d'écran
![rsolution.jpg rsolution.jpg](http://cds.u-strasbg.fr/twiki/pub/Stages/ArnaudSteinmetz/rsolution.jpg)
> Sur la page avec l'affichage du DK2 sélectionner > Paramètres avancés > Ecran
- Source disponible sur de mon projet : cloud 3 en interne dans le dossier "www>versionFinale>dev>B_Deparis>V4_Oculus"
- Documentation sur l'utilisation de l'Oculus en web :
Piste intéressante :
Addon Oculus bridge : addon utilisé pour la communication, dans l'état actuel, la première méthode est préférable puisque fonctionnelle directement. Mais il serait intéressant de comparer les performances entre les deux méthodes.
Sauvegardes
- à définir au cas par cas suivant le sujet du stage
Liens
Versions testables
Testé sur ...
Documentation
Informations/travaux divers
Travail post stage éventuel
Liste des améliorations à envisager
Bugs connus
*