Projet WebGL

Image de référence


Le but de ce projet est de reprendre un tableau pour le reproduire en 3D grâce à la technologie WebGL. Elle permet d'avoir des représentations 3D dans un navigateur web en temps réel. Pour cela, j'ai utilisé la librairie Three.js qui permet de simplifier l'utilisation de WebGL. Par exemple, elle permet de créer rapidement des formes géométriques simples, d'ajouter des lumières, des ombres, des textures etc... Je vais revenir sur ces points dans les paragraphes suivants.


1. La skybox

Au lieu d'avoir un fond totalement noir, il est possible d'ajouter une skybox. Comme son nom l'indique, c'est une boîte projetée à l'infinie sur laquelle on applique des textures. Pour en avoir une, j'ai utilisé le scene.background, ainsi que la classe THREE.CubeTextureLoader. J'ai donc du télécharger 6 images pour les 6 faces du cube de la skybox.

2. La lumière

L'étape suivante à été d'ajouter de la lumière. Pour cela, Three.js nous met à disposition un grand nombre de lumière différente. Celles que j'ai utilisé sont les suivantes :

Je n'ai pas eu besoin d'en utiilser d'autres mais il en existe beaucoup d'autres.

3. La caméra

Pour pouvoir se mouvoir librement dans la scène, il faut créer une caméra et l'ajouter à la scène. Pour cela, j'ai utilisé la classe PerspectiveCamera qui permet de créer une caméra avec une perspective. C'est à dire que les objets qui sont loin de la caméra sont plus petits que ceux qui sont proches. On peut également lui changer sa position et sa direction. J'ai également ajouté un contrôle à la caméra pour pouvoir se déplacer dans la scène. Pour cela, j'ai utilisé la classe OrbitControls qui permet de se déplacer avec la souris. Un point important est l'ajustement du near et du far, permettant de délimiter la distance minimale et maximale de la caméra. Si on ne les ajuste pas, on ne pourra pas voir toute la scène.

4. L'eau et les textures

Ensuite, j'ai ajouté l'eau comme sol. Pour cela, j'ai utilisé l'Objet Water de Three.js pour avoir un effet concluant rapidement. Pour cela, j'ai du trouver une texture spéciale : une normal map. Une normal map est une image permettant de simuler des reliefs sur une surface plane. C'est grâce à cette image que l'on peut voir les vagues sur l'eau. J'ai également ajouté une légère animation dans la fonction animate() pour qu'on ait l'impression que l'eau bouge. Cette eau permet également de créer un effet mirroir sur la scène et de pouvoir voir le reflet des objets. Il est possible de changer certains paramètres pour l'eau. Par exemple la Distortion Scale permettant de changer les reflets sur l'eau.

Pour continuer sur les textures, à part les normal map, il en existe plusieurs autres. Par exemple :

Pour ajouter ces textures, on doit les ajouter dans le material de l'objet. On peut y ajouter encore d'autres map, comme l'occlusion ambiante ou l'emissive map, mais la limitation des 2Mo ne m'a pas permis de les utiliser.

Enfin, pour finir sur les textures, il est important de noter que l'on peut en appliquer directement sur des cubes. Cela à pour utilité de pouvoir créer des formes complexes uniquement avec une image transparante. Pour cela, il ne faut pas oublier de mettre le paramètre transparent à true dans le material de l'objet. J'ai utilisé cette technique pour créer les personnes au premier plan. Cela permet également d'économiser de l'espace.

5. Les sprites

Les sprites sont un objet particulier, puisqu'ils ont la particularité de toujours faire face à la caméra. Cela permet de simuler des objets en 3D, alors qu'ils sont en 2D. J'ai utilisé cette technique pour créer les buissons en arrière-plan. Three.js intègre une classe Sprite permettant de créer facilement des sprites.

6. Les ombres portées

Pour rajouter du réalisme à la scène, il est important d'ajouter des ombres portées. Cela signifie que les sources du lumière vont projeter des ombres sur les objets de la scène. Pour cela, il faut ajouter le paramètre castShadow à true dans le material de l'objet qui va projeter l'ombre, et le paramètre receiveShadow à true dans le material de l'objet qui va recevoir l'ombre. Il faut également ajouter le paramètre shadowMap.enabled à true dans le renderer. Cela permet d'activer les ombres dans la scène. Enfin, il faut ajouter le paramètre shadow.camera.near et shadow.camera.far, ainsi que left, right, bottom et up dans la lumière. Cela permet de définir la distance minimale et maximale de la lumière, ainsi que sa taille. Si on ne les définit pas, les ombres ne seront pas visibles.