Programmation des logiciels infographiques interactifs 3 D et

  • Slides: 72
Download presentation
Programmation des logiciels infographiques interactifs 3 D, et le Open. GL

Programmation des logiciels infographiques interactifs 3 D, et le Open. GL

Images synthètiques de haute qualité http: //commons. wikimedia. org/wiki/Image: Raytracing_reflection. png http: //3 drockstar.

Images synthètiques de haute qualité http: //commons. wikimedia. org/wiki/Image: Raytracing_reflection. png http: //3 drockstar. com/wp-content/uploads/2008/01/3 d_radiosity_solution. jpg

Caustiques http: //www. duarte. cl/blog/monosblog/caustics. jpg (Une photo pris par Ágnes Kiricsi) http: //atmosphericoptics.

Caustiques http: //www. duarte. cl/blog/monosblog/caustics. jpg (Une photo pris par Ágnes Kiricsi) http: //atmosphericoptics. blogspot. com/2007/10/kausztika-caustics. html http: //bp 2. blogger. com/_Co 5 Lv 6 ONs. KU/Rx. JMl. Bjq 9 g. I/AAAABg 8/afty 6 xv 5 d. Qg/s 1600 -h/signed_mini-caustics 1. jpg

Image synthètique de haute qualité Reflets de lumière rougeâtre et bleuâtre http: //www. cgtutorials.

Image synthètique de haute qualité Reflets de lumière rougeâtre et bleuâtre http: //www. cgtutorials. com/oneadmin/_files/linksdir/1963__Global_Illumination. jpg

 • Les images précédentes contiennent des ombres douces, reflets spéculaires et diffus, réfractions,

• Les images précédentes contiennent des ombres douces, reflets spéculaires et diffus, réfractions, etc. • Ces images sont habituellement – générées avec du « backward rendering » , par exemple, le lancer de rayon ( « ray tracing » ), où on part de chaque pixel et on détermine la contribution des objets dans la scène à sa couleur – plus faciles à générer entièrement sur le CPU, en traitant chaque pixel individuellement – très coûteuses, en temps, à générer

Le « Forward Rendering » • Des images de plus basse qualité peuvent être

Le « Forward Rendering » • Des images de plus basse qualité peuvent être générées avec du « forward rendering » , où on part des objets dans la scène (la géometrie) et on détermine quels pixels ils recouvrent • Cela est plus rapide et très bien supporté au niveau matériel par les GPUs • Exemples …

Fils de fer ( « wireframes » ) ou maillages ( « meshes »

Fils de fer ( « wireframes » ) ou maillages ( « meshes » ) http: //www. gardendome. com/Intro_prin. htm http: //www. frontiernet. net/~pdoering/Scorpio/D&E/88 Scorp/Wireframe. jpg http: //en. wikipedia. org/wiki/Image: Wireframe. png

Maillage de triangles https: //upload. wikimedia. org/wikipedia/commons/f/fb/Dolphin_triangle_mesh. png

Maillage de triangles https: //upload. wikimedia. org/wikipedia/commons/f/fb/Dolphin_triangle_mesh. png

http: //www. cgchannel. com/wp-content/uploads/2015/06/150625_Art. Mesh. jpg Maillage de triangles Maillage de quadrilatères Chaque ensemble

http: //www. cgchannel. com/wp-content/uploads/2015/06/150625_Art. Mesh. jpg Maillage de triangles Maillage de quadrilatères Chaque ensemble de 3 points définit un plan 4 points ne sont pas nécessairement coplanaires

Les ingrédients pour le forward rendering • Une façon de projeter des coordonnées 3

Les ingrédients pour le forward rendering • Une façon de projeter des coordonnées 3 D vers des coordonnées 2 D. On fait cette projection pour chaque sommet (“vertex”) d’un maillage. – La projection se fait avec des multiplications de matrices • Une façon d’enlever les parties cachées 1. Clipping 2. Élimination de faces arrières (“backface culling”) 3. Algorithme du peintre OU Tampon de profondeur • Une façon de remplir les polygones – La rastérisation calcule les pixels recouverts par un polygone – Le lissage (“shading”) calcule la couleur de chaque pixel dans le polygone

Enlever les parties cachées : Clipping http: //images. slideplayer. com/24/7368106/slides/slide_10. jpg ; http: //slideplayer.

Enlever les parties cachées : Clipping http: //images. slideplayer. com/24/7368106/slides/slide_10. jpg ; http: //slideplayer. com/slide/7368106/

Enlever les parties cachées Il reste encore certaines faces avant qui sont supposées être

Enlever les parties cachées Il reste encore certaines faces avant qui sont supposées être cachées par d’autres faces avant Maillage original Faces arrières enlevées (“backface culling”) http: //www. geometricalgebra. net/images/chap 2 ex 2_screenshot. png

Enlever les parties cachées Maillages originaux Faces arrières enlevées (“backface culling”) Algorithme du peintre

Enlever les parties cachées Maillages originaux Faces arrières enlevées (“backface culling”) Algorithme du peintre OU Tampon de profondeur http: //www. dma. ufg. ac. at/app/link/Grundlagen%3 A 3 D-Grafik/module/9760? step=all ; http: //www. dma. ufg. ac. at/assets/9760/intern/culling 01. gif

La rastérisation trouve les pixels recouverts https: //upload. wikimedia. org/wikipe dia/commons/thumb/d/d 6/Pixels_co vered_by_a_triangle. png/200

La rastérisation trouve les pixels recouverts https: //upload. wikimedia. org/wikipe dia/commons/thumb/d/d 6/Pixels_co vered_by_a_triangle. png/200 px. Pixels_covered_by_a_triangle. png https: //www. ntu. edu. sg/home/ehchua/programming/opengl/images/Graphics 3 D _Rasterization. png http: //2. bp. blogspot. com/Go. Qd. MGt. Kbwg/Tb 1 EAWlo. Dv. I/AAAAAA AAACE/1 Ss_Hpv. E 9 ng/s 1600/Rasterizatio n. png

Remplissage et lissage des polygones Maillage original Faces arrières enlevées Polygones remplis avec lissage

Remplissage et lissage des polygones Maillage original Faces arrières enlevées Polygones remplis avec lissage plat (“flat shading”) Lissage Gouraud (“Gouraud shading”) Lissage Phong (“Phong shading”) http: //www. dma. ufg. ac. at/app/link/Grundlagen%3 A 3 D-Grafik/module/9728? step=all

Dans le « forward rendering » … À retenir! Comment enlever les polygones cachés

Dans le « forward rendering » … À retenir! Comment enlever les polygones cachés et les parties de polygones cachées ? • 1. « clipping » : on ne dessine pas les polygones hors de la vue de la caméra • 2. « backface culling » : on ne dessine pas les polygones qui sont des « faces arrière » (face arrière = pas orientée vers la caméra) • 3. on enlève les parties des faces avant qui sont cachées par d’autres faces avant. Deux stratégies: – L’algorithme du peintre ( « Painter’s algorithm » ): on trie et on dessine les polygones, en ordre de profondeur, du plus loin au plus proche – Tampon de profondeur ( « depth buffer » ou « z-buffer » )

Pour enlever les faces arrières, il faut d’abord trouver la normale de chaque face

Pour enlever les faces arrières, il faut d’abord trouver la normale de chaque face Notez: les sommets sont numérotés dans l’ordre antihoraire (en anglais: “counter clockwise winding” ou CCW) du point d’un vue d’un observateur du côté externe du polygone

 Règles approximatives : Face avant Face arrière

Règles approximatives : Face avant Face arrière

 À retenir! Face arrière Règles exactes : Face avant

À retenir! Face arrière Règles exactes : Face avant

L’algorithme du peintre Dessiné en premier Dessiné en dernier On trie et on dessine

L’algorithme du peintre Dessiné en premier Dessiné en dernier On trie et on dessine les polygones, en ordre de profondeur, du plus loin au plus proche. À retenir!

Un problème pour l’algorithme du peintre:

Un problème pour l’algorithme du peintre:

Une approche plus simple, mais plus coûteuse en mémoire: le tampon de profondeur À

Une approche plus simple, mais plus coûteuse en mémoire: le tampon de profondeur À retenir! ( « depth buffer » ou « z-buffer » )

Algorithme du peintre vs Tampon de profondeur • L’algorithme du peintre nécessite de faire

Algorithme du peintre vs Tampon de profondeur • L’algorithme du peintre nécessite de faire un tri (habituellement sur le CPU) avant de faire le rendu. Cet algo était populaire anciennement, avant que la mémoire devienne très peu cher permettant les tampons de profondeur. • Le tampon de profondeur permet de rendre les polygones dans n’importe quel ordre • Le tampon de profondeur est supporté directement au niveau matériel dans les GPUs et dans les APIs modernes comme le Open. GL • Pour faire un rendu réaliste de polygones transparents, il est nécessaire de quand même utiliser l’algo du peintre (toutefois, il y a des modèles de transparence irréalistes et simplistes qui ne demandent pas de faire un tri)

Silicon Graphics Inc. • Dans les années 1990, le chef de file modial dans

Silicon Graphics Inc. • Dans les années 1990, le chef de file modial dans les machines avec puces graphiques (machines de dizaines de milliers de $US) • Leurs puces étaient optimisées pour faire beaucoup d’opérations vectorielles et matricielles, en parallèle et dans une pipeline, pour traiter beaucoup de sommets et de polygones • Leurs puces graphiques supportaient au niveau matériel la projection, clipping, élimination de faces arrières, tampon de profondeur, rastérisation, lissage gouraud, textures, alpha blending

La série des machines IRIS de SGI • IRIS = Integrated Raster Imaging System

La série des machines IRIS de SGI • IRIS = Integrated Raster Imaging System • Système d’exploitation: IRIX (IRIS UNIX) Indigo Indy Onyx

O 2 Octane

O 2 Octane

Visual Workstation Tezro et Onyx 4

Visual Workstation Tezro et Onyx 4

 • Plus tard, vers les années 2000, des entreprises comme n. Vidia développent

• Plus tard, vers les années 2000, des entreprises comme n. Vidia développent des puces graphiques beaucoup plus flexibles (GPUs ou GPGPUs) et beaucoup moins chers (moins de 1000$) pour le marché des jeux vidéo • Ces nouvelles puces supportent toutes les anciennes fonctionnalités des puces graphiques, en plus de supporter des lisseurs ( « shaders » ) : des bouts de code chargés sur la puce par le client qui sont exécutés pour chaque polygone ou pour chaque fragment (pixel). • Les lisseurs peuvent même être utilisés pour faire des calculs parallèles non-graphiques, donnant une accélération de calcul de 1000 fois ou plus par rapport au CPU. • Dans ce cours, nous allons nous limiter aux fonctionnalités de base des puces graphiques, et laisser de côté les lisseurs.

Open. GL • Descendant de IRIS GL, de SGI • Permet d’accéder au matériel

Open. GL • Descendant de IRIS GL, de SGI • Permet d’accéder au matériel graphique et de faire du « forward rendering » très rapide, enlevant du travail du CPU et le donnant au GPU • Portable, contrairement au Direct X / Direct 3 D de Microsoft • Un API en C (et accessible depuis Java via JOGL) • Ne nécessite pas de matériel graphique (exemple: la librairie Mesa implemente le API de Open. GL entièrement au niveau logiciel)

Open. GL (suite) • Comme le Open. GL est portable, on peut, par exemple,

Open. GL (suite) • Comme le Open. GL est portable, on peut, par exemple, réaliser le rendu de toute notre interface (même les widgets 2 D) en l’utilisant • Exemples: les librairies multi-plateforme GLOW, GLUI, et CEGUI

GLOW http: //glow. sourceforge. net/

GLOW http: //glow. sourceforge. net/

GLUI http: //www. cs. unc. edu/~rademach/glui/

GLUI http: //www. cs. unc. edu/~rademach/glui/

CEGUI - Crazy Eddie’s GUI Pour les jeux vidéo http: //www. youtube. com/watch? v=i.

CEGUI - Crazy Eddie’s GUI Pour les jeux vidéo http: //www. youtube. com/watch? v=i. Xs. Zh 1 owp. BI

Open. GL (suite) • Certaines fonctionnalités de Open. GL dont on ne discutera pas:

Open. GL (suite) • Certaines fonctionnalités de Open. GL dont on ne discutera pas: – Le lissage/ombrage et l’éclairage ( « shading » et « lighting » ) – Les textures – Les « display lists » – Comment rendre des courbes – Les lisseurs ( « vertex shaders » et « fragment shaders » ou « pixel shaders » )

Dessiner des triangles en Open. GL … setup camera view … gl. Begin( GL_TRIANGLES

Dessiner des triangles en Open. GL … setup camera view … gl. Begin( GL_TRIANGLES ); gl. Color 3 f( 1, 0, 0 ); gl. Vertex 3 f( 0. 5 f, 0, 0 ); gl. Vertex 3 f( 0, 1, 0 ); 2 triangles rouges gl. Vertex 3 f( 0, 0, 0. 1 f ); gl. Vertex 3 f( 0. 5 f, 0, 0. 1 f ); gl. Vertex 3 f( 0, 1, 0. 1 f ); gl. Color 3 f( 0, 1, 0 ); gl. Vertex 3 f( 0, 0, 0. 2 f ); gl. Vertex 3 f( 0. 5 f, 0, 0. 2 f ); gl. Vertex 3 f( 0, 1, 0. 2 f ); gl. End(); 1 triangle vert

Remarques • Le préfixe "gl" au début des noms des routines (ou, parfois, "glu"

Remarques • Le préfixe "gl" au début des noms des routines (ou, parfois, "glu" ou "glut" pour les routines des librairies GLU et GLUT, qui sont souvent utilisées avec le Open. GL) • Indentation de code entre les appels au gl. Begin() et gl. End() – ce n’est pas obligatoire, mais ça rend le code plus lisible

Dessiner des triangles en Open. GL … setup camera view … gl. Begin( GL_TRIANGLES

Dessiner des triangles en Open. GL … setup camera view … gl. Begin( GL_TRIANGLES ); gl. Color 3 f( 1, 0, 0 ); gl. Vertex 3 f( 0. 5 f, 0, 0 ); gl. Vertex 3 f( 0, 1, 0 ); gl. Vertex 3 f( 0, 0, 0. 1 f ); gl. Vertex 3 f( 0. 5 f, 0, 0. 1 f ); gl. Vertex 3 f( 0, 1, 0. 1 f ); gl. Color 3 f( 0, 1, 0 ); gl. Vertex 3 f( 0, 0, 0. 2 f ); gl. Vertex 3 f( 0. 5 f, 0, 0. 2 f ); gl. Vertex 3 f( 0, 1, 0. 2 f ); gl. End();

Remarques (suite) À retenir! • Le Open. GL est une machine à états –

Remarques (suite) À retenir! • Le Open. GL est une machine à états – Chaque appel à gl. Color 3 f() a un effet sur la couleur utilisée dans les appels successifs à gl. Vertex 3 f() • Chaque appel à gl. Begin() doit être suivi d’un appel à gl. End() pour terminer le bloc. • À l’intérieur des blocs gl. Begin()-gl. End(), il y a seulement certaines routines Open. GL qu’on peut appeler, comme gl. Vertex*(), gl. Color*(), pour transmettre des sommets au GPU. • À l’extérieur des blocs gl. Begin()-gl. End(), il y a bien d’autres routines Open. GL qu’on peut appeler, pour effectuer des transformations, configurer des options de rendu, etc.

En Java, avec JOGL … GL gl =. . . ; … setup camera

En Java, avec JOGL … GL gl =. . . ; … setup camera view … gl. Begin( GL. GL_TRIANGLES ); gl. Color 3 f( 1, 0, 0 ); gl. gl. Vertex 3 f( 0. 5 f, 0, 0 ); gl. Vertex 3 f( 0, 1, 0 ); gl. Vertex 3 f( 0, 0, 0. 1 f ); gl. Vertex 3 f( 0. 5 f, 0, 0. 1 f ); gl. Vertex 3 f( 0, 1, 0. 1 f ); gl. Color 3 f( 0, 1, 0 ); gl. Vertex 3 f( 0, 0, 0. 2 f ); gl. Vertex 3 f( 0. 5 f, 0, 0. 2 f ); gl. Vertex 3 f( 0, 1, 0. 2 f ); gl. End();

Remarques (suite) • L’argument passé à gl. Begin() identifie les primitives qu’on veut dessiner

Remarques (suite) • L’argument passé à gl. Begin() identifie les primitives qu’on veut dessiner dans le bloc gl. Begin()-gl. End() • Exemples: – gl. Begin( GL_TRIANGLES ); – gl. Begin( GL_QUADS ); – gl. Begin( GL_LINES ); –… À retenir!

Primitives de rendu de Open. GL

Primitives de rendu de Open. GL

Quelques suffixes … À retenir! • 2 f, 3 f, 4 f : pour

Quelques suffixes … À retenir! • 2 f, 3 f, 4 f : pour passer 2, 3, ou 4 coordonnées • 3 i, 3 f, 3 d : pour passer des entiers, float, ou double • 3 fv : pour passer un tableau de 3 coordonnées • Exemples: gl. Vertex 3 f(x, y, z); gl. Vertex 2 d(x, y); gl. Vertex 3 fv(float. Array); gl. Vertex 2 iv(int. Array);

Dessiner des triangles en Open. GL … setup camera view … gl. Begin( GL_TRIANGLES

Dessiner des triangles en Open. GL … setup camera view … gl. Begin( GL_TRIANGLES ); gl. Color 3 f( 1, 0, 0 ); gl. Vertex 3 f( 0. 5 f, 0, 0 ); gl. Vertex 3 f( 0, 1, 0 ); gl. Vertex 3 f( 0, 0, 0. 1 f ); gl. Vertex 3 f( 0. 5 f, 0, 0. 1 f ); gl. Vertex 3 f( 0, 1, 0. 1 f ); gl. Color 3 f( 0, 1, 0 ); gl. Vertex 3 f( 0, 0, 0. 2 f ); gl. Vertex 3 f( 0. 5 f, 0, 0. 2 f ); gl. Vertex 3 f( 0, 1, 0. 2 f ); gl. End();

(voir notes de cours pour la suite de la discussion)

(voir notes de cours pour la suite de la discussion)

L’exemple de Simple. Modeller. java

L’exemple de Simple. Modeller. java

Custom. Widget. java Simple. Modeller. java class Colored. Box class Scene Vector< Colored. Box

Custom. Widget. java Simple. Modeller. java class Colored. Box class Scene Vector< Colored. Box > colored. Boxes = …; draw. Scene() class Scene. Viewer Scene scene = …; Radial. Menu. Widget radial. Menu = …; display() mouse. Pressed() mouse. Released() mouse. Moved() mouse. Dragged() class Simple. Modeller action. Performed() create. UI() main() class Custom. Widget press. Event() release. Event() move. Event() drag. Event() draw() Radial. Menu. Widget. java class Radial. Menu. Widget …

JFrame frame Scene. Viewer scene. Viewer Container tool. Panel JMenu. Bar menu. Bar t

JFrame frame Scene. Viewer scene. Viewer Container tool. Panel JMenu. Bar menu. Bar t ge id u. W en M ") s xe A ) t" ou Ab (“ ld or y W la ) x” Bo m te u. I en ) it" Qu ) ll" A te le De (“ (“ m te u. I en JM JM JM te ea sp Di (“ ox k. B ec r “C n( tto u JB … h JC … al di Ra ) p" el ("H u en JM ") ile ("F u en JM

Rendu dans le tampon de couleur À retenir! • À chaque fois qu’on veut

Rendu dans le tampon de couleur À retenir! • À chaque fois qu’on veut mettre à jour l’image affichée (exemple: dessiner un nouveau « frame » dans une animation), si on efface le contenu du tampon de couleur et on le redessine, cela peut créer un effet de clignotement ( « flicker » ), surtout si le rendu prend longtemps, car la fenêtre affiche une image noire ou seulement partiellement dessinée pendant le redessinement.

 « Double buffered rendering » À retenir! • Normalement, on a assez de

« Double buffered rendering » À retenir! • Normalement, on a assez de mémoire sur la carte graphique pour avoir deux tampons de couleur: – Tampon avant ( « front buffer » ) • Stocke l’image actuellement affichée – Tampon arrière ( « back buffer » ) • Tampon de travail dans lequel on redessine

 « Double buffered rendering » (suite) À retenir! • Lorsqu’on veut mettre à

« Double buffered rendering » (suite) À retenir! • Lorsqu’on veut mettre à jour l’image, on efface le contenu du tampon arrière, on dessine dans le tampon arrière, et on effectue un échange ( « swap » ) des tampons qui est très rapide – glut. Swap. Buffers();

À retenir! Un seul tampon : Pourcentage de frame rendu et visible gl. Clear()

À retenir! Un seul tampon : Pourcentage de frame rendu et visible gl. Clear() Temps Frame 1 Frame 2 Frame 3 Frame 4 Double buffered rendering : swap Pourcentage de frame visible dans le tampon avant Temps Frame 1 Frame 2 Frame 3 Pourcentage de frame rendu dans le tampon arrière gl. Clear() Temps Frame 1 Frame 2 Frame 3 Frame 4

Les tampons formant le « frame buffer » • Tampon de couleur ( «

Les tampons formant le « frame buffer » • Tampon de couleur ( « color buffer » ) – Tampon avant ( « front buffer » ) • Stocke l’image actuellement affichée – Tampon arrière ( « backbuffer » ) • Tampon de travail • • Tampon de profondeur ( « depth buffer » ) « Stencil buffer » « Accumulation buffer » Etc.

Esquisse de code gl. Matrix. Mode( GL_PROJECTION ); gl. Load. Identity(); … setup camera

Esquisse de code gl. Matrix. Mode( GL_PROJECTION ); gl. Load. Identity(); … setup camera view … gl. Matrix. Mode( GL_MODELVIEW ); gl. Load. Identity(); gl. Clear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); gl. Depth. Func( GL_LEQUAL ); gl. Enable( GL_DEPTH_TEST ); gl. Enable( GL_CULL_FACE ); gl. Vertex 3 f( 0, 0, 1 ); gl. Front. Face( GL_CCW ); gl. Vertex 3 f( 0. 5 f, 0, 1 ); gl. Disable( GL_LIGHTING ); gl. Vertex 3 f( 0, 1, 1 ); gl. Shade. Model( GL_FLAT ); gl. Color 3 f( 0, 1, 0 ); gl. Begin( GL_TRIANGLES ); gl. Vertex 3 f( 0, 0, 2 ); gl. Color 3 f( 1, 0, 0 ); gl. Vertex 3 f( 0. 5 f, 0, 2 ); gl. Vertex 3 f( 0, 0, 0 ); gl. Vertex 3 f( 0, 1, 2 ); gl. Vertex 3 f( 0. 5 f, 0, 0 ); gl. End(); gl. Vertex 3 f( 0, 1, 0 ); gl. Begin(. . . ); . . . gl. End(); . . . glut. Swap. Buffers();

Rendu stéréo: « Quad buffering » À retenir! • Dans ce cas, il y

Rendu stéréo: « Quad buffering » À retenir! • Dans ce cas, il y a quatre tampons de couleur: – Gauche, avant – Gauche, arrière – Droit, avant – Droit, arrière • Question: est-ce que juste trois tampons de couleur seraient suffisant ?

y draw. Face() x y x rotate(45*radians. Par. Degre) translate(10, 0) draw. Face() translate(10,

y draw. Face() x y x rotate(45*radians. Par. Degre) translate(10, 0) draw. Face() translate(10, 0) rotate(45*radians. Par. Degre) draw. Face()

Exemples de questions de quiz ou d’examen

Exemples de questions de quiz ou d’examen

À retenir! Pour chacun des cubes A, B, et C, quelle méthode sert à

À retenir! Pour chacun des cubes A, B, et C, quelle méthode sert à enlever la partie cachée du cube dans le rendu final? (Supposez que les cubes sont opaques. ) Réponses possibles: clipping, backface culling, tampon de profondeur, algorithme du peintre.

À retenir! Pourquoi utilise-t-on un tampon arrière ("backbuffer"), en plus d'un tampon avant, pour

À retenir! Pourquoi utilise-t-on un tampon arrière ("backbuffer"), en plus d'un tampon avant, pour faire le rendu de polygones avec Open. GL ? a) Ça permet de redessiner la scène plus souvent et d’augmenter le nombre de "frames per second". b) Ça permet d'utiliser moins de mémoire. c) Ça permet de faire du rendu en stéréo. d) Ça élimine le clignotement lors du redessinement. e) Aucune de ces réponses

class. . . { int index. Of. Rectangle. Under. Mouse = -1; // -1

class. . . { int index. Of. Rectangle. Under. Mouse = -1; // -1 pour aucune . . . Graphics my. Graphics = null; . . . // Cette méthode est appelée quand il faut redessiner la fenêtre. public void display( Graphics g ) { my. Graphics = g; // pour s'en rappeler draw. Rectangles(); } private void draw. Rectangles() { // Dessine les rectangles, mettant en surbrilliance // le rectangle dont l'indice est "index. Of. Rectangle. Under. Mouse". // Utilise my. Graphics pour choisir des couleurs et dessiner des rectangles. . . . } // Cette méthode est appelée quand la souris est déplacée. // Version 1: public void mouse. Moved( Mouse. Event e ) { index. Of. Rectangle. Under. Mouse = scene. get. Index. Of. Rectangle. Containing. Point( e. get. X(), e. get. Y() ); draw. Rectangles(); // redessine immédiatement } // Version 2: public void mouse. Moved( Mouse. Event e ) { index. Of. Rectangle. Under. Mouse = scene. get. Index. Of. Rectangle. Containing. Point( e. get. X(), e. get. Y() ); repaint(); // demande la génération d'un événement de redessinement } // Version 3: public void mouse. Moved( Mouse. Event e ) { int new. Index. Of. Rectangle = scene. get. Index. Of. Rectangle. Containing. Point( e. get. X(), e. get. Y() ); if ( new. Index. Of. Rectangle != index. Of. Rectangle. Under. Mouse ) { index. Of. Rectangle. Under. Mouse = new. Index. Of. Rectangle; repaint(); // demande la génération d'un événement de redessinement } } // Version 4: public void mouse. Moved( Mouse. Event e ) { int new. Index. Of. Rectangle = scene. get. Index. Of. Rectangle. Containing. Point( e. get. X(), e. get. Y() ); if ( new. Index. Of. Rectangle != index. Of. Rectangle. Under. Mouse ) { index. Of. Rectangle. Under. Mouse = new. Index. Of. Rectangle; draw. Rectangles(); // redessine immédiatement } } } À retenir! Imaginez une scène 2 D de rectangles où on veut dessiner le rectangle en dessous du curseur en surbrilliance ("highlighted"). La méthode mouse. Moved() dans la classe cidessous doit mettre à jour cet effet de surbrillance. Parmi les quatre (4) versions de la méthode mouse. Moved() données, laquelle est la meilleure ?

. . . // Cette méthode est appelée quand la souris est déplacée. //

. . . // Cette méthode est appelée quand la souris est déplacée. // Version 1: public void mouse. Moved( Mouse. Event e ) { index. Of. Rectangle. Under. Mouse = scene. get. Index. Of. Rectangle. Containing. Point( e. get. X(), e. get. Y() ); draw. Rectangles(); // redessine immédiatement } // Version 2: public void mouse. Moved( Mouse. Event e ) { index. Of. Rectangle. Under. Mouse = scene. get. Index. Of. Rectangle. Containing. Point( e. get. X(), e. get. Y() ); repaint(); // demande la génération d'un événement de redessinement } // Version 3: public void mouse. Moved( Mouse. Event e ) { int new. Index. Of. Rectangle = scene. get. Index. Of. Rectangle. Containing. Point( e. get. X(), e. get. Y() ); if ( new. Index. Of. Rectangle != index. Of. Rectangle. Under. Mouse ) { index. Of. Rectangle. Under. Mouse = new. Index. Of. Rectangle; repaint(); // demande la génération d'un événement de redessinement } } // Version 4: public void mouse. Moved( Mouse. Event e ) { int new. Index. Of. Rectangle = scene. get. Index. Of. Rectangle. Containing. Point( e. get. X(), e. get. Y() ); if ( new. Index. Of. Rectangle != index. Of. Rectangle. Under. Mouse ) { index. Of. Rectangle. Under. Mouse = new. Index. Of. Rectangle; draw. Rectangles(); // redessine immédiatement } }

À retenir! Soit les trois sommets p 1, p 2, p 3 d'un triangle,

À retenir! Soit les trois sommets p 1, p 2, p 3 d'un triangle, dans l’ordre antihoraire (c. -à-d. qu'un observateur qui regarde l'avant du triangle voit les sommets p 1, p 2, p 3 faire le tour du triangle dans un sens antihoraire). Quelle formule permet de trouver le vecteur normal n du triangle (vecteur perpendiculaire au plan du triangle)? Supposons que le vecteur n calculé n'a pas besoin d'être unitaire. a) n = (p 3 -p 1)|p 2 -p 1|/|p 3 -p 2| b) n = max( |p 2 -p 1|, |p 3 -p 2| ) c) n = (p 2 -p 1) • (p 3 -p 2) d) n = (p 2 -p 1) × (p 3 -p 2)

À retenir! Pour faire suite à la question précédente, soit le centre P=(p 1+p

À retenir! Pour faire suite à la question précédente, soit le centre P=(p 1+p 2+p 3)/3 du triangle, le centre C de la caméra, et le vecteur v de vue (orienté vers l'avant de la caméra). Quelle expression est vraie si le triangle est une face arrière ("back face")? a) n • v > 0 b) n • v = 0 c) n × v > 0 d) n × v = 0 e) n • (P-C) > 0 f) (n-v) • v > 0 g) max(|n|, |v|) > |n-v|

À retenir! • Soit un triangle avec sommets p 1 = (0, 0, 2),

À retenir! • Soit un triangle avec sommets p 1 = (0, 0, 2), p 2 = (2, 0, 0), p 3 = (1, 0, 2) dont l’extérieur se trouve du côté –y, et une caméra à la position p. C = (0, -10, 0) regardant dans la direction v. C = (0, 1, 0) • Trouvez la normale du triangle • Utilisez un produit scalaire pour montrer si le triangle est une face avant ou une face arrière

À retenir! Transformez le point p avec les coordonnées homogènes (a, b, c, 1)

À retenir! Transformez le point p avec les coordonnées homogènes (a, b, c, 1) en utilisant la matrice M indiquée. Donnez les coordonnées homogènes du point p' qui en résulte. [1 0 0 k] M = [0 1 0 0] [0 0 1 k] [0 0 0 1] [1 0 0 k] [a] p' = M p = [0 1 0 0] [b] = [0 0 1 k] [c] [0 0 0 1] [1] La matrice M dans la question précédente est quelle sorte de matrice ?