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.
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.
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 :
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.
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 :
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.
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.
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.