Upload
others
View
0
Download
0
Embed Size (px)
Citation preview
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
Cours 9 : Introduction à la 3D
Vincent GuigueUPMC - LIP6
Vincent Guigue 2i013 - Course de Voiture 1/45
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
Stratégies complexes : plusieurs solutions
1 Composite : Liste de Selector/Strategy- Composite dans Composite = Arbre de strategy- Partage d’informations entre Selector et Strategy : 1 objetimplémente les 2 interfaces (attributs communs)
2 Héritage : une stratégie fille plus fine que la stratégie parente- getCommande() = parent.getCommande() + spécificitésclasse fille
3 Decorator/Délégation : une Strategy attribut d’une autre- Comportement partiel (ex : donner une accélération franchelorsque la vitesse de la voiture est à 0)
- Surcouche sur n’importe quelle stratégie- Fonctionnement :
· Possède une stratégie en attribut· Renvoie tous les ordres vers l’attribut (Délégation)· Fait quelques modifications dans certains cas particuliers
Vincent Guigue 2i013 - Course de Voiture 2/45
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
Intérêt et Usage de la décoration
◦ Une stratégie décorée EST UNE stratégie◦ Pouvoir étendre/spécialiser n’importe quelle stratégie (plus
général que l’héritage)Forme générale :
1 pub l i c c l a s s St r a t egyP ruden t e implements S t r a t e g y {2 p r i v a t e S t r a t e g y sBase ;34 pub l i c St r a t egyP ruden t e ( S t r a t e g y sBase ) {5 super ( ) ;6 t h i s . sBase = sBase ;7 }89 pub l i c Commande getCommande ( ) {
10 Commande c = sBase . getCommande ( ) ; // d é l é g a t i o n11 // mod i f i c a t i o n de c12 // [ . . . ]1314 re tu rn c ;15 }16 }
Vincent Guigue 2i013 - Course de Voiture 3/45
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
Rappel sur les filtres
◦ Filtre = cahier des charges = interface1 pub l i c vo id f i l t r e ( Te r r a i n [ ] [ ] mat )
◦ Les filtres parcourent et modifient la matrice Terrain[][]◦ La CircuitFactory change (ou il en faut une nouvelle)
- Aucune méthode static (l’appel depuis le main change aussi)- La classe a un attribut ArrayList<Filtre> instancié dans leconstructeur
- La classe contient une méthode void add(Filtre f)- Avant de construire le CircuitImpl, la classe applique lesfiltres sur la matrice Terrain[][]
1 f o r ( F i l t r e f : l i s t e )2 f . f i l t r e (mat ) ;
Vincent Guigue 2i013 - Course de Voiture 4/45
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
Filtre simpleDans la version simple, un filtre est rapide à développer :
◦ Pas d’attribut◦ Pas de constructeur (Implicite)
1 pub l i c c l a s s F i l t r e D i a g implements F i l t r e {23 pub l i c vo id f i l t r e ( Te r r a i n [ ] [ ] mat ) {4 f o r ( i n t i =0; i<mat . l e n g t h -1 ; i++)5 f o r ( i n t j =0; i<mat [ 0 ] . l e n g t h -1 ; j++){6 i f ( [QUADRUPLE CLAUSE ] ) {7 mat [ i ] [ j ] = Te r r a i n . Herbe ;8 mat [ i +1] [ j +1] = Te r r a i n . Herbe ;9 }
10 e l s e i f ( [QUADRUPLE CLAUSE ] ) {11 mat [ i +1] [ j ] = Te r r a i n . Herbe ;12 mat [ i ] [ j +1] = Te r r a i n . Herbe ;13 }14 }15 }16 }
Vincent Guigue 2i013 - Course de Voiture 5/45
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
Filtre générique
◦ Détection d’un pattern (Utiliser isRunnable, ⇒ filtre booléen)◦ Remplacement
...
...
...
Vincent Guigue 2i013 - Course de Voiture 6/45
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
Proposition de codage1 pub l i c c l a s s F i l t r e G e n e r i q u e implements F i l t r e {2 p r i v a t e boolean [ ] [ ] window ;3 pub l i c F i l t r e G e n e r i q u e ( boolean [ ] [ ] window ){ t h i s . window = window ; }45 pub l i c vo id f i l t r e ( Te r r a i n [ ] [ ] mat ){6 f o r ( i n t i =0; i<mat . l eng th−window . l eng th −1; i++)7 f o r ( i n t j =0; i<mat [ 0 ] . l eng th−window [ i ] . l eng th −1; j++){8 i f ( matching ( mat , i , j ) ) { // t e s t9 f o r ( i n t m=0; m<window . l e n g t h ; m++)
10 f o r ( i n t n=0; n<window [ 0 ] . l e n g t h ; n++)11 mat [ i+m] [ j+n ] = Te r r a i n . Herbe ; // remplacement12 }13 }14 }1516 p r i v a t e boolean matching ( Te r r a i n [ ] [ ] mat , i n t i , i n t j ) {17 f o r ( i n t m=0; m<window . l e n g t h ; m++)18 f o r ( i n t n=0; n<window [ 0 ] . l e n g t h ; n++)19 i f ( Too l sTe r r a i n . i sRunnab l e (mat [ i+m] [ j+n ] ) != window [m] [ n ] )20 re tu rn f a l s e ;21 re tu rn t rue ;22 }23 }
Vincent Guigue 2i013 - Course de Voiture 7/45
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
Rappels sur l’évaluation
◦ CC : 70%- Partiel (0.25) : Annales en ligne + cours 91er avril 10h45-12h30 (et ce n’est pas une blague)
· Sur feuille, vérification de la maitrise du projet· Développement propre de nouvelles fonctions/strategy
- Rapport et performance de votre code (binôme) (0.6)· Nombre de fonctionnalités développées (Strategy,Optimisation, IHM)
· Propreté du code· Performance des stratégies (bonus/malus dans la compétition)
- Participation (0.15) : retard/présence, jalons manqués
◦ Exam : 30%
- Soutenances orale et modification de code individuelExam le 15/04, Soutenances le 17/04
Vincent Guigue 2i013 - Course de Voiture 8/45
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
Quelques explications sur le fonctionnement
◦ Slides en partie tirés du cours de A. Meyer, Lyon 1◦ Beaucoup de calcul matriciel (d’où les nouveaux usages des
cartes graphiques)
Vincent Guigue 2i013 - Course de Voiture 9/45
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
Cours de synthèse d’images 4
2 approches duales en SI
Impossible d'a!cher l'image. Votre ordinateur manque peut-être de mémoire pour ouvrir l'image ou l'image est endommagée. Redémarrez l'ordinateur, puis ouvrez à nouveau le fichier. Si le x rouge est
Impossible d'a!cher l'image. Votre ordinateur
Oeil Image (pixels)
Impossible d'a!cher l'image. Votre ordinateur manque peut-être de mémoire pour ouvrir l'image ou l'image est endommagée. Redémarrez l'ordinateur, puis ouvrez à nouveau le fichier. Si le x rouge est
Impossible d'a!cher l'image. Votre ordinateur
Oeil Image (pixels)
Des rayons sont lancés
depuis l’œil vers la scène
en passant par un pixel
Les objets sont projetés sur
l’écran dans la direction de l’œil.
Ray-tracing •!Image réaliste
•!Lent
Rendu projectif (cablé sur les
cartes graphiques modernes -> temps réel)
Vincent Guigue 2i013 - Course de Voiture 10/45
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
Cours de synthèse d’images 6
Pipeline
1. Clipping des polygones en 3D suivant la pyramide de vue
2. Projection des points sur le plan image
3.! Remplissage des triangles (Rasterizing) dans l’image
a.! Suppression des parties cachées : Z-Buffer
b.! Calcul de la couleur : illumination
Ap oeil
Plan image
A
Rendu projectif : PIPELINE
Vincent Guigue 2i013 - Course de Voiture 10/45
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
Cours de synthèse d’images 19
Projection perspective
!!Besoin de perspective
!!Configuration simple :
CDP
Q P(x,y,z)
A O
Plan image
-Z
Y
d
Si et
C
d=distance focale
Vincent Guigue 2i013 - Course de Voiture 10/45
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
Cours de synthèse d’images 20
Matrice de projection : MI!C
!! Soit un point dans l’espace de la camera
!! Résultat : un point dans l’espace Image
Vincent Guigue 2i013 - Course de Voiture 10/45
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
Cours de synthèse d’images 42
1. Projection des points sur le plan image
2. Clipping
3.! Remplissage des triangles (rasterisation) dans l’image 5.! Suppression des parties cachées
6.! Calcul de la couleur : illumination
Ap CDP
Plan image
(viewport)
d h
l A
Rendu projectif
Vincent Guigue 2i013 - Course de Voiture 10/45
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
Cours de synthèse d’images 49
1ere idée : algo du peintre
Ambiguïtés
Vincent Guigue 2i013 - Course de Voiture 10/45
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
Cours de synthèse d’images 56
12 13 14
11 12 12 13
10 12 12 13
10 10 11 12
5 4
Z-Buffer
+inf +inf +inf +inf +inf +inf +inf +inf +inf +inf +inf +inf
+inf +inf 4 4 4 +inf +inf +inf +inf +inf +inf +inf
+inf +inf 4 4 5 5 5 +inf +inf +inf
+inf +inf +inf 4 4 5 5 5 +inf +inf +inf +inf
+inf +inf +inf 3 3 4 4 +inf +inf
+inf +inf +inf 3 3 3 +inf +inf
+inf +inf +inf +inf 3 +inf +inf +inf
+inf +inf +inf +inf +inf +inf +inf +inf
4 5
z=11>5 donc caché
Vincent Guigue 2i013 - Course de Voiture 10/45
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
Cours de synthèse d’images 64
OpenGL : par exemple
!! Effacer le buffer et le zbuffer entre chaque image
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
!! Active le test des Z avec le Z-buffer
glEnable(GL_DEPTH_TEST) ; activé
non
activé
Vincent Guigue 2i013 - Course de Voiture 10/45
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
JAVA et 3D
◦ On propose d’utiliser lwjGL- http://lwjgl.org/
◦ La puissance de l’architecture vient du fait qu’il n’y a pasgrand chose à modifier pour faire de la 3D...◦ Le modèle ne change pas, seule la manière de l’afficher est
modifiée.◦ IHMSwing devient
- public class IHM3D extends AWTGLCanvas- void paint(Graphics g) devient public void paintGL()
Vincent Guigue 2i013 - Course de Voiture 11/45
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
Coté main...
... pas de modification ! (logique on a prévu ce cas figure dans leMVC)
1 S imu l a t i o n simu = new S imu l a t i o n ( t rack , v , s t r a t e g y ) ;23 JFrame f en = new JFrame ( ) ;4 f en . s e tD e f a u l t C l o s eOp e r a t i o n ( JFrame .EXIT_ON_CLOSE) ;5 IHM3D ihm = new IHM3D ( ) ;67 simu . add ( ihm ) ;
Vincent Guigue 2i013 - Course de Voiture 12/45
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
Qu’est ce qu’une IHM3D?
◦ Proposition : utiliser le AWTGLCanvas qui ouvre un panelOpenGL dans l’univers SWING
1 pub l i c c l a s s IHM3D extends AWTGLCanvas2 implements KeyL i s t ene r , Upda t eEven tL i s t en e r {3 p r i v a t e Ar r a yL i s t <Observeur3D> toDraw ;45 pub l i c IHM3D( ) throws LWJGLException {6 toDraw = new Ar r a yL i s t <Observeur3D >() ;7 t h i s . addKeyL i s t ene r ( t h i s ) ; // j e m’ auto−ecoute pour l e s touche s8 }9 pub l i c vo id paintGL ( ) {
10 // su r c h a r g e11 }12 pub l i c vo id add ( Observeur3D d ){ toDraw . add ( d ) ; }13 pub l i c vo id keyPre s s ed ( KeyEvent e ) {}14 pub l i c vo id keyRe l e a s ed ( KeyEvent e ) {}15 pub l i c vo id keyTyped ( KeyEvent e ) { }1617 pub l i c vo id manageUpdate ( ) {}18 }
Vincent Guigue 2i013 - Course de Voiture 13/45
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
Spécificités de la 3D
◦ Pas de mise à jour explicite : la 3D se refraichît en boucle◦ Nouveaux observeurs :1 pub l i c i n t e r f a c e Observeur3D {2 pub l i c vo id drawGL ( ) ;3 }
◦ Beaucoup de paramètres à régler pour l’affichage :- Surcharge de l’initialisation (AWTGLCanvas ) :
1 protected vo id i n i tGL ( ) {2 g lEnab l e (GL_TEXTURE_2D) ; // a c t i v a t i o n des t e x t u r e s3 g lEnab l e (GL_DEPTH_TEST) ; // g e s t i o n de l a p r o f ondeu r4 }
- Dans paintGL() ... On appelle glsettings()
Vincent Guigue 2i013 - Course de Voiture 14/45
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
PaintGL
◦ RAZ du buffer◦ Définition d’une scène
1 p r i v a t e vo id g l s e t t i n g s ( ){2 g l C l e a r (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ) ;3 g lV i ewpo r t (0 , 0 , getWidth ( ) , g e tHe i gh t ( ) ) ; // 100% de l a f e n ê t r e4 g l C l e a r C o l o r ( 0 . f , 0 . f , 0 . f , 1 . 0 f ) ;5 glMatr ixMode (GL_PROJECTION) ;67 g l L o a d I d e n t i t y ( ) ; // RAZ t r a n s f o rma t i o n s89 // d e f i n i t i o n de l a t a i l l e de l a f e n e t r e 3D où l ’ on r e ga r d e
1011 g lOr tho ( ( f l o a t ) −getWidth ( )∗ zoom , ( f l o a t ) getWidth ( )∗ zoom ,12 ( f l o a t ) −ge tHe i gh t ( )∗ zoom ∗0 . 5 , ( f l o a t ) ge tHe i gh t ( )∗ zoom ∗1 . 5 , −2000 , 2000 ) ;1314 glMatr ixMode (GL_MODELVIEW) ;15 . . .
Vincent Guigue 2i013 - Course de Voiture 15/45
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
Définition de la fenêtre
Vincent Guigue 2i013 - Course de Voiture 16/45
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
PaintGL
◦ Définition des lumières/matériaux
1 p r i v a t e vo id g l s e t t i n g s ( ){2 [ . . . ]3 i n i t L i g h t A r r a y s ( ) ; // code f o u r n i s u r l e s i t e web45 glShadeModel (GL_SMOOTH) ; // mode de rendu67 g lMa t e r i a l (GL_FRONT, GL_SPECULAR, matSpecu la r ) ;8 g l M a t e r i a l f (GL_FRONT, GL_SHININESS , 50 .0 f ) ;9
10 g l L i g h t (GL_LIGHT0 , GL_POSITION , l i g h t P o s i t i o n ) ;11 g l L i g h t (GL_LIGHT0 , GL_SPECULAR, wh i t e L i g h t ) ;12 g l L i g h t (GL_LIGHT0 , GL_DIFFUSE , wh i t e L i g h t ) ;13 g lL i gh tMode l (GL_LIGHT_MODEL_AMBIENT, lModelAmbient ) ;1415 g lEnab l e (GL_LIGHTING ) ; // a c t i v a t i o n16 g lEnab l e (GL_LIGHT0 ) ;17 g lEnab l e (GL_COLOR_MATERIAL) ;18 g l C o l o rMa t e r i a l (GL_FRONT, GL_AMBIENT_AND_DIFFUSE) ;1920 g l L o a d I d e n t i t y ( ) ;
Vincent Guigue 2i013 - Course de Voiture 17/45
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
Modes de rendu
Synthè!"#$%&'()"! 6
Texture
Fil de fer Faces cachées (objet) Rendu Gouraud
Rendu Phong
HistoriqueVincent Guigue 2i013 - Course de Voiture 18/45
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
PaintGL
◦ Et enfin... On peut dessiner !
1 pub l i c vo id paintGL ( ) {2 t r y {3 g l s e t t i n g s ( ) ;4 // d é f i n i t i o n de l a camera5 GLU. g luLookAt ( x , y , z , 500 , 500 , −500, 0 , 0 , 1 ) ;6 // MVC c l a s s i q u e7 f o r ( Observeur3D d : toDraw ){8 g lPushMat r i x ( ) ;9 d . drawGL ( ) ;
10 g lPopMatr i x ( ) ;11 }12 swapBu f f e r s ( ) ;1314 r e p a i n t ( ) ;15 } catch ( LWJGLException e ) { throw new Runt imeExcept ion ( e ) ; }16 }
Vincent Guigue 2i013 - Course de Voiture 19/45
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
Fonctionnement de la caméra :1 GLvoid g luLookAt ( GLdouble eyex , GLdouble eyey ,2 GLdouble eyez , GLdouble c en t e r x , GLdouble3 cen t e r y , GLdouble c en t e r z , GLdouble upx ,4 GLdouble upy , GLdouble upz )
Vincent Guigue 2i013 - Course de Voiture 20/45
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
Rendre un objet en 3D
Dans l’idée, c’est simple : on multiplie les dessins de formesbasiques (triangle/carré) dans l’espace :Sur un exemple dans :
12 pub l i c c l a s s C i r cu i tOb s e r v eu r 3D implements Observeur3D{3 [ . . . ]45 pub l i c vo id drawGL ( ) {67 GL11 . g lBeg i n (GL11 .GL_QUADS) ;8 {9 GL11 . g l V e r t e x 3 f (0 , 0 , 0 ) ;
10 GL11 . g l V e r t e x 3 f (0 , he ightR , 0 ) ;11 GL11 . g l V e r t e x 3 f ( widthR , he ightR , 0 ) ;12 GL11 . g l V e r t e x 3 f ( widthR , 0 , 0 ) ;13 }14 GL11 . g lEnd ( ) ;15 }
Vincent Guigue 2i013 - Course de Voiture 21/45
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
Utilisation de volumes préfédinis
Dessiner la voiture sous forme de sphère est assez simple :1 pub l i c c l a s s Voi tu reObse rveur3D implements Observeur3D{2 p r i v a t e org . l w j g l . u t i l . g l u . Sphere sphe r e = new Sphere ( ) ;3 p r i v a t e Vo i t u r e v o i t u r e ;45 pub l i c Voi tu reObse rveur3D ( Vo i t u r e v o i t u r e ) {6 t h i s . v o i t u r e = v o i t u r e ;7 }89 pub l i c f l o a t getX ( ){ re tu rn ( f l o a t ) v o i t u r e . g e t P o s i t i o n ( ) . getX ( ) ; }
10 pub l i c f l o a t getY ( ){ re tu rn ( f l o a t ) v o i t u r e . g e t P o s i t i o n ( ) . getY ( ) ; }1112 pub l i c vo id drawGL ( ) {13 g l C o l o r 3 f (1 , 0 , 1 ) ; // code RGB en t r e 0 e t 114 g l T r a n s l a t e f ( getX ( ) , getY ( ) , 0 ) ;15 s phe r e . draw (20 , 10 , 1 0 ) ; // rayon + r é s o l u t i o n16 g l T r a n s l a t e f (−getX ( ) , −getY ( ) , 0 ) ;17 g l C o l o r 3 f (1 , 1 , 1 ) ;18 }19 }
Vincent Guigue 2i013 - Course de Voiture 22/45
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
TexturesPour des rendus plus agréables et pour le terrain, il faut gérer lesimages en plus de la 3D :
Cours de synthè!"#$%&'()"! 5
Plaquage de la texture
! A chaque sommet de la face! Coordonnées textures (u,v)
! *+,-.#/011"!203$#4#+3"#20!&5&03#$(3!#6%&'()"#*$(3!#6(#5"75+1".
!"#$%"&'
()*%'+,'-,./'
0-12$1231450.12614
0-72$7237450.72674(0,0)
(1,1)(0,1)
(1,0)
Vincent Guigue 2i013 - Course de Voiture 23/45
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
Texture : application sur le circuit
◦ La classe possède un attribut Texture◦ Une texture est stockée dans la mémoire graphique et possède
un identifiant◦ Texture = contrainte : souvent des images carrées, toujours en
puissance de 2
1 pub l i c vo id drawGL ( ) {2 // chargement l o r s du p r em i e r appe l3 i f ( t e x t u r e == nu l l ){4 Buf f e r ed Image im = Too l sTe r r a i n . imageFromCi r cu i t ( t r a c k ) ; // c r e a t i o n5 t r y {6 ImageIO . w r i t e ( im , "PNG" , new F i l e ( " t e r r a i n . png" ) ) ;7 t e x t u r e = Textu reLoade r . g e tTex tu r e ( "PNG" , ResourceLoade r . getResourceAsSt ream ( " t e r r a i n . png" ) ) ;8 } catch ( IOExcept i on e ) {9 e . p r i n t S t a c kT r a c e ( ) ;
10 }11 width = t e x t u r e . getTextureWidth ( ) ;12 h e i g h t = t e x t u r e . g e tTex tu r eHe i gh t ( ) ;13 }14 . . .
Vincent Guigue 2i013 - Course de Voiture 24/45
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
Texture : application sur le circuit (suite)
1 . . .2 GL11 . g lB i ndTex tu r e (GL11 .GL_TEXTURE_2D, t e x t u r e . ge tTex tu re ID ( ) ) ;3 GL11 . g l P i x e l S t o r e i ( GL11 .GL_UNPACK_ALIGNMENT, 1 ) ;45 // draw a quad t e x t u r e d to match the s p r i t e6 GL11 . g lBeg i n (GL11 .GL_QUADS) ;7 {8 GL11 . g lTexCoord2 f (0 , 0 ) ; GL11 . g l V e r t e x 3 f (0 , 0 , 0 ) ;9 GL11 . g lTexCoord2 f (0 , 1 ) ; GL11 . g l V e r t e x 3 f (0 , he i gh t , 0 ) ;
10 GL11 . g lTexCoord2 f (1 , 1 ) ; GL11 . g l V e r t e x 3 f ( width , he i gh t , 0 ) ;11 GL11 . g lTexCoord2 f (1 , 0 ) ; GL11 . g l V e r t e x 3 f ( width , 0 , 0 ) ;12 }13 GL11 . g lEnd ( ) ;14 GL11 . g lB i ndTex tu r e (GL11 .GL_TEXTURE_2D, 0 ) ;1516 }
Vincent Guigue 2i013 - Course de Voiture 25/45
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
Exemple de résultat
Vincent Guigue 2i013 - Course de Voiture 26/45
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
Exemples de circuit d’examen
Gestion d’un labyrinthe :
Vincent Guigue 2i013 - Course de Voiture 27/45
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
Exemples de circuit d’examen
Gestion d’un nouveau type de terrain :
Vincent Guigue 2i013 - Course de Voiture 27/45
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
Exemples de circuit d’examenJouer un circuit de 2 manières
Vincent Guigue 2i013 - Course de Voiture 27/45
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
Circuit mystère
◦ Construire un circuit mystère à partir d’un algorithme, parexemple :
- 500x500 pixels, bordure d’herbe de 10 pixels- Départ en ... Arrivée en ...- ...
Questions◦ Dans quel objet le développer ?◦ Implémenter l’algorithme
Vincent Guigue 2i013 - Course de Voiture 28/45
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
Module LI260 – Licence 2 page 2
Exercice 3 – Circuit analytique mystere (6 pts)
Nous proposons dans cet exercice de construire un circuit de maniere analytique, en respectant a la lettrel’algorithme fourni ci-dessous. Vous creerez la classe CircuitFactoryFromAlgo, sans argument.Attributs/Constructeur :Dans le constructeur, vous initialiserez les attributs int sizeX=600 ; int sizeY=600 ; int bordure=20 ; Laclasse possede egalement les attributs :
private Vecteur depart;
private Vecteur dirDepart = new Vecteur(0,1); // comme d’habitude
private Vecteur dirArrivee = new Vecteur(0,1); // comme d’habitude
Methode build :Dans la methode public Circuit build() de cette classe, on commencera par instancier un tableau track deTerrain de 600x600 cases.Goudron partout sauf sur les bords :En parcourant toutes les cases a l’aide d’une double boucle for, vous mettrez toutes les cases en Route, sauf lescases dont l’une des coordonnees est inferieure a bordure ou superieure a sizeX/Y-bordure.Depart :Le point de depart se situe en (bordure+10, bordure+10). Mettez a jour la matrice de Terrain ainsi que l’attributdepart de la classe.Arrivee :La ligne d’arrivee est definie par le code suivant :
for(int i= 0; i<20; i++){
track[300-i][300] = Terrain.EndLine;
}
Coeur du circuit :Definition de double : a=0, b=1Definition de int : nbPas = 10000Pour i allant de 1 a nbPas faire :
– ✓ = i⇡10nbPas
NB : ⇡ est defini dans Math.PI. Suivant votre implementation du calcul, il faut mieux convertir nbPas endouble pour eviter les problemes de division.
– ⇢ = a✓ + b;– x = ⇢ cos(✓)8 + 300
NB : x doit etre un entier, il faut donc convertir le resultat ci-dessus a l’aide de (int).– y = ⇢ ⇤ sin(✓)8 + 300 (meme conversion en int)– Ajouter le code suivant pour convertir les cases autour de (x,y) en herbe :track[x][y] = Terrain.Herbe;
for(int j=0; j<2; j++){
track[x+j][y] = Terrain.Herbe;
track[x][y+j] = Terrain.Herbe;
}
Retour :return new CircuitImpl(track, depart, dirDepart, dirArrivee) ;
Q 3.1 Creer ce circuit, jouer le et sauver le resultat dans les fichiers mystere.com/mystere.pngVincent Guigue 2i013 - Course de Voiture 29/45
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
Départ manuel
Vincent Guigue 2i013 - Course de Voiture 30/45
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
Héritage vs Décoration1 pub l i c i n t e r f a c e C i r c u i t {2 pub l i c double g e tD i s t ( i n t i , i n t j ) ; // Pour i n t e r r o g e r d i j k s t r a3 pub l i c Te r r a i n g e tT e r r a i n ( i n t i , i n t j ) ;4 pub l i c Te r r a i n g e tT e r r a i n ( Vecteu r v ) ;5 pub l i c Vecteu r ge tPo in tDepa r t ( ) ;6 pub l i c Vecteu r g e tD i r e c t i o nDepa r t ( ) ;7 pub l i c Vecteu r g e t D i r e c t i o n A r r i v e e ( ) ;8 pub l i c i n t getWidth ( ) ;9 pub l i c i n t ge tHe i gh t ( ) ;
10 pub l i c Ar r a yL i s t <Vecteur> g e t A r r i v e e s ( ) ;11 }
◦ On veut créer un système générique pour ajouter des obstacles dansle circuit (possibilité d’ajouter des obstacles rectangles, ronds...).
◦ Un obstacle permettra donc de coder la définition d’un zone del’espace (pour une coordonnée il est nécessaire de savoir si on estsur l’obstacle ou pas).
◦ On construira ensuite une nouvelle implémentation de circuit gérantles obstacles.
Vincent Guigue 2i013 - Course de Voiture 31/45
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
Obstacle
1 Cahier des chargesQu’est qu’un obstacle du point de vue du cahier des charges ?(expliquer en une ou deux phrases) Utiliseriez vous uneinterface ou une classe abstraite pour l’implémenter ?(expliquer en une ou deux phrases) Donner le code de laclasse/interface Obstacle.
2 ConcrétisationDonner le code d’un obstacle rectangle et d’un obstacle rond(en accord avec la question précédente).
Vincent Guigue 2i013 - Course de Voiture 32/45
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
Prise en compte des obstacles dans le Circuit
L’idée de base est simple : on veut prendre en compte les obstacles sanschanger le code de la classe circuit On souhaite pouvoir ajouter plusieursobstacles (nombre indéterminé) de n’importe quel type (rectangle, rondou autres définis dans le futur).
1 Par héritageDonner le code de la classe CircuitAvecObstacleHeritage quiimplémente l’idée ci-dessus en utilisant l’héritage.
2 Par décorationDonner le code de la classe CircuitAvecObstacleDecoration quiréalise exactement les mêmes opérations que dans la questionprécédente mais en prenant un attribut Circuit à décorer.
3 Exemples d’usage
Vincent Guigue 2i013 - Course de Voiture 33/45
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
Approfondissement
1 Réflexions sur les deux solutionsQuels sont les avantages et inconvénient des deux solutions ?Pistes de réponse : - comparer le type de l’objet qui est étendu parhéritage avec le type de l’attribut qui est décoré dans la secondesolution. - comparer comment sont instanciés les deux objets. -comparer le nombre d’indirection (c’est à dire le nombre d’appels defonctions pour effectuer une même opération dans les deuxarchitectures).
2 Pérénisation : sauvegarde/chargementQuels sont les enjeux et les choix à faire au niveau de lasauvegarde des circuits avec obstacles ? Proposer une ouplusieurs architecture de sauvegarde chargement des circuitsavec obstacles.
Vincent Guigue 2i013 - Course de Voiture 34/45
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
Algorithmique : radar parabolique
Prédiction
Réglage de l’avance
Mesure de la force du virage à venir
(x_max,y_max)
35
30
25
20
15
10
5
0
40
−20 −10 0 2010
0
5
10
15
20
25
30
35
40
-25 -20 -15 -10 -5 0
Les faisceaux ont pour équation y = ax2 + bx + c . Le paramétragedu radar se fait en donnant :◦ ymax : la hauteur du maximum (ymax = 40)◦ xmax : la déviation en x du point max de la parabole (xmax
prend les valeurs :[−12.5, −10, −7.5, −5, 5, 7.5, 10, 12.5]).
Les équations des faisceaux correspondent à :b = 2ymax/xmax , a = −b/(2xmax), c = 0.
Vincent Guigue 2i013 - Course de Voiture 35/45
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
Algorithme d’analyse sur un faisceau :
A partir de la position et de la direction de la voiture, nous voulonsextraire les coordonnées de 100 points répartis le long d’un faisceau.On calcule 100 valeurs de x entre 0 et 2xmax . Pour chaque valeur,on calcule la valeur y associée. Il faut ensuite faire un changementde repère pour obtenir des coordonnées dans l’espace du circuit.
◦ Calculer l’angle α entre la direction de la voiture et la direction(0, 1). Vous supposerez que vous disposez de la fonctionadéquat, soit dans la classe Vecteur, soit dans une classe Tools.
◦ Appliquer une rotation α sur les coordonnées (x , y).◦ Appliquer la translation suivante : x ← x + voiture.x ,
y ← y + voiture.y
Une fois les points dans le bon espace, l’algorithme est très prochedu radar Dijkstra : on parcours les points tant que l’on n’est pasdans l’herbe et on note le score le plus intéressant.
Vincent Guigue 2i013 - Course de Voiture 36/45
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
Implémentation
1 Quels sont les attributs du radar parabolique ?2 Donner la signature du constructeur ainsi qu’un exemple de
construction d’un tel radar depuis le main.3 Donner le code de la méthode doublescoreFaisceau(double xmax) qui prend en argument xmaxet qui retourne le meilleur score dijkstra rencontré.NB1 : ymax devra évidemment être accessible, ainsi que les données de la voiture.NB2 : question (un peu) difficile qui nécessite sans doute un peu de réflexion au brouillon.NB3 : on partira de x=0 pour aller vers xmax. Si on rencontre de l’herbe, on s’arrête.
NB4 : il peut être utile de coder le changement de repère dans une méthode privée à part pour
faciliter la lecture du code.
4 Donner le reste du code de la classe RadarParabolique.NB1 : vous pourrez choisir de faire de l’héritage par rapport au radar classique ou pas.NB2 : vous mettrez quelques commentaires pour que je m’y retrouve si vous faites appel à desméthodes/attributs issus de la classe mère
1 pub l i c i n t e r f a c e Radar {2 pub l i c double [ ] s c o r e s ( ) ; // s c o r e de chaque branche3 pub l i c double [ ] d i s t a n c e s I n P i x e l s ( ) ; // pour l ’ o b s e r v e r4 pub l i c i n t ge tBe s t I nd e x ( ) ; // m e i l l e u r i n d i c e5 pub l i c double [ ] t h e t a s ( ) ; // a ng l e s de chaque f a i s c e a u6 }
Vincent Guigue 2i013 - Course de Voiture 37/45
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
Approfondissement
1 ObservationProposer une technique d’observation du radar parabolique.Expliquer votre approche en quelques phrases. S’il vous restedu temps à la fin, proposez un code réalisant l’opération.
2 StratégieProposer une stratégie à partir du radar parabolique (enquelques phrases, pas de code).NB : vous pouvez évidemment ajouter d’autres radars.
3 (Un peu de) mathématiquesMontrer que les paramètres de la parabole sont bien :b = 2ymax/xmax , a = −b/(2xmax), c = 0
Vincent Guigue 2i013 - Course de Voiture 38/45
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
Partie commune + personnalisation
◦ Algorithmes suffisamment efficaces pour jouer toutes lescourses◦ ... Et d’autre lors de l’examen sur machine◦ Architecture très propre, MVC fonctionnel◦ Interface temps-réel de base (une fenêtre)◦ Niveau de performance minimal : 1/3 des courses en vert
(10% du meilleur temps)
La personnalisation peut prendre diverse formes... Quelquesexemples dans les slides suivants.
Vincent Guigue 2i013 - Course de Voiture 39/45
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
Editeurs de circuits :
Vincent Guigue 2i013 - Course de Voiture 40/45
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
Editeurs de circuits :
Vincent Guigue 2i013 - Course de Voiture 40/45
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
Gestion 3D
Vincent Guigue 2i013 - Course de Voiture 41/45
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
Gestion 3D
Vincent Guigue 2i013 - Course de Voiture 41/45
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
Editeurs de stratégies :
Vincent Guigue 2i013 - Course de Voiture 42/45
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
Editeurs de stratégies :
Vincent Guigue 2i013 - Course de Voiture 42/45
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
Editeurs de stratégies :
Vincent Guigue 2i013 - Course de Voiture 42/45
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
IHM diverses
Vincent Guigue 2i013 - Course de Voiture 43/45
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
IHM diverses
Pause Zoom Détails !
Vincent Guigue 2i013 - Course de Voiture 43/45
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
IHM diverses
Visualisation de stratégies
Vincent Guigue 2i013 - Course de Voiture 43/45
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
Implémentation de stratégies complexes
Algorithme Génétique
Vincent Guigue 2i013 - Course de Voiture 44/45
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
Implémentation de stratégies complexes
Point à point
Vincent Guigue 2i013 - Course de Voiture 44/45
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
Implémentation de stratégies complexes
Fin de courses
Vincent Guigue 2i013 - Course de Voiture 44/45
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
Implémentation de stratégies complexes
Raccourci de trajectoire itératif
Vincent Guigue 2i013 - Course de Voiture 44/45
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
Implémentation de stratégies complexes (2)
Franchissement de diagonales
Vincent Guigue 2i013 - Course de Voiture 45/45
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
Implémentation de stratégies complexes (2)
Point à point
Vincent Guigue 2i013 - Course de Voiture 45/45
Strategy 3D Implem. Observeurs Examen Partiel Personnalisations
Implémentation de stratégies complexes (2)
Détection des chemins impossibles
Vincent Guigue 2i013 - Course de Voiture 45/45