Ajouter des sources lumineuses

L'éclairage ambiant est beau, mais il est évident que vous n'allez pas loin avec. Pour une scène vraiment vivante, vous avez besoin, de sources de lumières plus dynamiques, de choses qui n'éclairent pas tout de la même manière. Pour cette raison Ultimate 3D supporte l'éclairage par vertex (per-vertex lighting). Cela fonctionne de la façon suivante. Vous devez ajouter un ensemble de sources de lumière à votre scène. Ultimate 3D les utilisera ensuite pour calculer une couleur pour chaque vertex. Ces couleurs seront interpolées sur le triangle qui est connecté à ce vertex. Ultimate 3D supporte également l'éclaire par pixel (per pixel lighting). Mais c'est une des techniques des utilisateurs avancés.

Il existe trois types de sources lumineuses. Le premier est appelé lumière directionnelle. L'exemple classique pour une lumière directionnelle est le soleil. Elle éclaire tout depuis la même direction. N'importe où que vous soyez (en ignorant le fait que la terre est une sphère), le soleil semble toujours au même endroit dans le ciel. L'opposé d'une lumière directionnelle est un point de lumière. Un point de lumière (light point) peut être comparée à une ampoule qui pend au milieu d'une pièce. Le mur de gauche sera éclairé depuis la droite et la paroi de droite sera éclairé à partir de la gauche, parce que l'ampoule est suspendu entre ces deux murs. Plus quelque chose sera éloigné du point de lumière, moins cette chose sera éclairée par la source lumineuse. Le troisième type de source lumineuse est une spot light. Un spot light est semblable à un point de lumière (point light). Mais contrairement à un point de lumière (point light), il n'éclaire pas tout autour de lui, seulement les éléments se trouvant dans un cône de lumière.

Comme pour les objets primitifs, vous avez besoin d'une instance d'objet pour chaque source de lumière. Et à nouveau, vous devez affecter quelques variables d'abord, après quoi vous ajoutez un appel à une fonction pour créer la source de lumière et finissez par mettre les commandes Step() et Destroy() dans les événements correspondants.

Lumière directionnelle

Donc voici les variables dont vous avez besoin pour régler une lumière directionnelle.

rotx, roty
Les noms de ces deux variables sont vraiment des reliques d'une ancienne version d'Ultimate 3D, parce que je ne voulais pas briser la compatibilité avec les versions précédentes. Aujourd'hui je les appellerai longitude et latitude. Elles définissent la direction de la lumière directionnelle. Pour avoir une description de ce que signifie longitude et latitude, jetez un oeil (NDT: Pas trop fort quand même...) à la fonction Move(...) dans le chapitre "Prise en main".

r, g, b
Ces variables définissent la couleur de la source lumineuse. Les valeurs sont en général comprises dans une fourchette allant de 0 à 255. En augmentant les valeurs de ces variables, vous augmentez l'intensité de la lumière. Vous pouvez également spécifier des valeurs négatives pour ces variables. Ensuite, la source de lumière va assombrir les objets qu'il éclaire.

Les lumières directionnelles n'ont pas de position et ni d'effet de portée, tout simplement parce que ces données n'ont aucune importance. Les lumières directionnelles sont omniprésentes. Après la mise en place de ces variables, vous pouvez appeler LightDirectional() afin d'initialiser la source de lumière directionnelle. Si vous n'avez pas oublié d'inclure Step() dans le évènement step, vous pourrez changer tous les paramètres de toutes les sources de lumière à tout moment.

Point lumineux

Allons-y avec les variables des points lumineux.

x, y, z
Ces variables définissent la position du point source de lumière. Plus une chose sera proche de ce point, plus elle sera éclairé par le point de lumière. 

range
La portée du point de lumière. Tout ce qui est trop loin de la source de lumière ne sera pas affecté par celle-ci. Plus grosse est la portée, plus forte est l'intensité de la lumière.

r, g, b
Ces variables définissent la couleur de la source lumineuse. Les valeurs sont en général comprises dans une fourchette allant de 0 à 255. En augmentant les valeurs de ces variables, vous augmentez l'intensité de la lumière. Vous pouvez également spécifier des valeurs négatives pour ces variables. Ainsi, la source de lumière assombrira les objets qui sont éclairées par cette dernière.

Après la mise en place de ces variables, vous pouvez appeler LightPoint() pour initialiser le point de lumière. Encore une fois, vous pouvez changer toutes les propriétés de la source de lumière, à tout moment, si vous n'oubliez pas Step() dans l'évènement correspondant.

Spot de lumière

Nous arrivons au dernier type de source de lumière, les spot lights. ils sont un peu plus complexes que les points lights et les lumières directionnelles, et requèrent plus de temps de calcul. Voici leurs variables:

x, y, z
Ces variables définissent la position de la source du spot light. Plus la chose est proche de ce point, plus elle sera éclairée par la lumière.

range
La portée du spot de lumière. Tout ce qui est le plus éloigné de la source de lumière ne sera pas affecté par celle-ci. Plus grosse est la portée, plus forte est l'intensité de la lumière.

rotx, roty
Ces deux variables définissent l'orientation du spot light. rotx est équivalente à la longitude et roty est équivalente à la latitude, dans laquelle le spot light éclaire.

deg
Cela définit l'angle qui est éclairé par le spot light. Si l'angle, entre les rayons de la source lumineuse allant jusqu'aux vertex et le vecteur directeur de la source de lumière défini par rotx et roty, est plus important que cette variable, le vertex ne sera pas éclairé par la source lumineuse. En d'autres termes, il contrôle la largeur du cône du spot light.

r, g, b
Ces variables définissent la couleur de la source lumineuse. Les valeurs sont en général comprises dans une fourchette allant de 0 à 255. En augmentant les valeurs de ces variables, vous augmentez l'intensité de la lumière. Vous pouvez également spécifier des valeurs négatives pour ces variables. Ainsi, la source de lumière assombrira les objets qui seront éclairées par celle-ci.

Après avoir affectées ces variables, vous pouvez appeler LightSpot() pour initialiser le spot lumineux, et si vous n'avez pas oublié l'appel à Step() dans l'évènement step, vous pourrez changer toutes les propriétés à n'importe quel moment.

Subdivision de primitives

Il est temps de respecter une promesse. Dans le chapitre à propos des primitives, j'ai dit que je n'avais pas listé toutes les variables des différents objets primitifs, et que quelques variables supplémentaires seraient introduites ici. Vous n'auriez pas compris pourquoi ces variables existent sans connaître les techniques d'éclairage basées sur les vertex. Alors voici ces nouvelles variables: 

partsx, partsy, (partsz)
Ces variables peuvent être utilisées pour subdiviser les primitives le long d'un axe particulier. partsz est listée entre parenthèses car seul l'objet cube en a besoin. Bien entendu les polygônes ne disposent pas de ces variables. En subdivisant un primitif vous augmentez son nombre de vertex. Ainsi un primitif subdivisé sera éclairé avec plus détails, étant donné que l'éclairage est réalisé sur la base des vecteurs. Les variables peuvent être définies à n'importe quel entier positif. Mais n'en abusez pas! Cela peut superbement diminuer vos FPS.



© Christoph Peters. Certains droits réservés. (Traduction FR 04/2008, Franck Vernel / Damien Buhl).

Creative Commons License XHTML 1.0 Transitional