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