-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathskeleton.c
More file actions
2245 lines (2051 loc) · 86.2 KB
/
Copy pathskeleton.c
File metadata and controls
2245 lines (2051 loc) · 86.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
/*
----------------------------------------------------------------------------------------------------------------------------------
---------- Nom: LO13_correia.cpp
------ Objetif: Créer un programme pour réproduire graphiquement un objet défini par la matrice objet
-- Application: Creation d'un cube et d'un maillage (tigre/tour eiffel/cube) et ses parametres graphiques
------- Auteur: Andre Mormul Correia
--------- Date: 15/06/2023
------ Version: 9.0
----------------------------------------------------------------------------------------------------------------------------------
*/
//==================================================================================================================
// LISTE DES BIBLIOTHEQUES ET DEFINITION DES VARIABLES GLOBALES
//==================================================================================================================
#include <stdlib.h> // allocation dynamique de mémoire et la manipulation de variables d'environnement
#include "GUI.h" // le code utilise une bibliothèque ou un module spécifique
#include <math.h> // utilisé pour les opérations mathématiques
#include <malloc.h> // allouer et libérer dynamiquement de la mémoire
#include <stdio.h> // fournit des fonctions d'entrée et de sortie de données
#define ZOOMSEUIL 10.0 // Valeur max/min de zoom possible
#define FZOOM 0.95 // Taux de zoom - fluidité d'agrandissement
#define SROTATION 0.3 // Taux de sensibilite de rotation
#define DIM 3 // Nombre de coordonees par triangle
//----------------------------------------------------------------------------------------------------------------------------------
//==================================================================================================================
// INITIALISATION DES PARAMETRES
//==================================================================================================================
/*
----- Nom: material
---- Type: typedef struct
- Objetif: Il s’agit la d’affecter un matériau au modèle discret afin d’effectuer un ombrage de ce modèle
-- Autres: -
*/
typedef struct material
{
float ambient[4]; // ka -> Reflection partie ambient
float diffuse[4]; // kd -> Reflection partie diffuse
float specular[4]; // kd -> Reflection partie specular
float shininess; // ns -> Coefficient matériau caractérisant la diminution de l’intensité autour de la réflexion parfaite
} Material ;
/*
----- Nom: source
---- Type: typedef struct
- Objetif: Pour attribuer les spécifications de la source lumineuse
-- Autres: source est appele par source
*/
typedef struct source
{
float position[4]; // Coordonees homogenes de la source
float ambient[4]; // Intensite partie ambient
float diffuse[4]; // Intensite partie diffuse
float specular[4]; // Intensite partie specular
} Source;
/*
----- Nom: opengl
---- Type: typedef struct
- Objetif: Definiton de structuree OpenGl afin de definir les variables et
parametres de vue et graphiques (source, materieaux)
-- Autres: opengl est appele par ogl
*/
typedef struct opengl
{
int fox, foy, fdx, fdy; // Le positionnement de la fenetre graphique et ses dimensions
float obsx, obsy, obsz; // Les coordonnes de l'observateur 1
float focalx, focaly, focalz; // Les coordonnes du point focal (centre du cube)
float verticalx, verticaly, verticalz; // Le vecteur vertical du repere de vue
float umin, umax, vmin, vmax, dmin, dmax; // Le paralepipede de visualisation
float fu, fv; // Taux pour ajuster la fenetre graphique
float fzoom; // Valeur du zoom
int flagrotation, flagtranslation; // 1 ou 0 button
float cx, cy, vx, vy; // Les coordonnees de la souris
float rotationV, rotationU, translationV, translationU; // Vecteur pour ratationer l'objet selon les les coordonnees de la souris
float tg[16]; // Matrice historique des transformations
float focalu, focalv, OvF; // Distance point focal
int mode; // Type de display pour le objet
float lfg, hfg; // Dimension de la fenetre
int ligne, matchoix; // Variable pour le choix du materiaux
Source src; // Variable pour la lumiere
float couleurfond[3]; // Valeurs pour la couleur du fond
float couleurligne[3]; // Valeurs pour la couleur de la ligne
Material steel, cooper, plastic, shadow, *mat; // Materiaux
char *file_name_open; // Dossier (Cube - Tiger - Eiffel)
char *shrinkonoff;
int shrinkok;
float fshrink, fexpand; // Variable pour shrink
float obsx3d, obsy3d, obsz3d; // Les coordonnes de l'observateur 2
float shadowx, shadowy, shadowz; // Les coordonnes pour le shadow
}Opengl;
Opengl ogl;
/*
----- Nom: mesh
---- Type: typedef struct
- Objetif: Definiton de structuree mesh afin de definir les variables et des parametres des triangles
-- Autres: Mesh est appele par msh
*/
typedef struct mesh
{
int number_of_vertices; // nombre de sommets
float *vertices; // liste des coordonnees des sommets
float *normal_v; // liste des normales aux sommets
int number_of_triangles; // nombre de triangles
int *triangles; // liste des sommets des triangles
float *alpha_t; // liste des angles aux sommets
float *normal_t; // liste des normales aux faces triangulaires
float ccenter[3]; // coordonnees du centre de la boite englobante
float cmin[3], cmax[3]; // coordonnees min et max de la boite englobante
float delta; // taille maximale de la boite englobante suivant les axes
int memory; // memoire allouee pour la structure mesh
int error; // arret du programme si error est non nul
int dirc[5]; // permutation cyclique des indices
float *planscarre; // liste des coordonnees des plans
}Mesh;
Mesh msh;
/*
----- Nom: InitialiserLibrairieGraphique
---- Type: function
- Objetif: Il est utilisé pour initialiser la bibliothèque GLUT
-- Autres: -
-- Return: Void
*/
void InitialiserLibrairieGraphique(int *argc, char **argv)
{
glutInit(argc, argv);
}
/*
----- Nom: InitialiserParametresGraphiques
---- Type: function
- Objetif: Quantification des variables et des parametres des triangles
-- Autres: Initialisation de la matrice 4x4 unité (matrice identite)
Proprietes des materiaux -> http://devernay.free.fr/cours/opengl/materials.html
-- Return: Void
*/
void InitialiserParametresGraphiques()
{
ogl.fox = 100; // Position par rapport a l'ecran de l'ordinateur
ogl.foy = 100;
//ogl.fdx = 500;
//ogl.fdy = 500;
ogl.lfg = 500; // Dimension de la fenetre graphique
ogl.hfg = 500;
ogl.obsx = 4; // Position observateur principal
ogl.obsy = 6;
ogl.obsz = 3;
ogl.obsx3d = ogl.obsx + 0.05; // Position observateur 3D
ogl.obsy3d = ogl.obsy + 0.05;
ogl.obsz3d = ogl.obsz + 0.05;
ogl.shadowx = ogl.obsx - 0.2; // Position observateur ombre
ogl.shadowy = ogl.obsy + 0.0;
ogl.shadowz = ogl.obsz + 0.8;
ogl.focalx = 0.5; //Les coordonnes du point focal
ogl.focaly = 0.5;
ogl.focalz = 0.5;
ogl.verticalx = 0; // Le vecteur vertical du repere de vue
ogl.verticaly = 0;
ogl.verticalz = 1.0;
ogl.fu = 1.0; // Taux pour ajuster la fenetre graphique
ogl.fv = 1.0;
ogl.umin = -0.5; // Le paralepipede de visualisation, où l'obejet est placé
ogl.umax = 0.5;
ogl.vmin = -0.5;
ogl.vmax = 0.5;
ogl.dmin = 5.0;
ogl.dmax = 100.0;
ogl.fzoom = 1.0; // Valeur du zoom
ogl.flagrotation = 0.0;
ogl.flagtranslation = 0.0;
ogl.cx = 0.0; // Les coordonnees de la souris
ogl.cy = 0.0;
ogl.mode = 1; // Type de display pour le objet, initialise en 1
ogl.matchoix = 0; // Type de materiau pour le objet, initialise avec 0
ogl.ligne = 0; // Variable pour le choix du materiaux
ogl.focalu = 0.0; // Distances point focal (observateur et paralepipede)
ogl.focalv = 0.0;
ogl.OvF = pow( pow(ogl.focalx - ogl.obsx, 2) + pow(ogl.focaly - ogl.obsy, 2) + pow(ogl.focalz - ogl.obsz, 2), 0.5);
for( int r = 0; r < 16; r++ ){ // Matrice unité 4x4 (matrice identite)
ogl.tg[r] = 0.0;
if( r == 0 || r == 5 || r == 10 || r == 15 ){
ogl.tg[r] = 1.0;
}
}
// Couleur space
ogl.couleurfond[0] = 0.0;
ogl.couleurfond[1] = 0.0;
ogl.couleurfond[2] = 0.0;
// Couleur ligne
ogl.couleurligne[0] = 1.0;
ogl.couleurligne[1] = 1.0;
ogl.couleurligne[2] = 1.0;
// Coordonees homogenes de la source
ogl.src.position[0] = 1.0;
ogl.src.position[1] = 1.0;
ogl.src.position[2] = 1.0;
ogl.src.position[3] = 0.0;
// Source general ambient qui affecte uniformément tous les objets de la scène
ogl.src.ambient[0] = 1.0;
ogl.src.ambient[1] = 1.0;
ogl.src.ambient[2] = 1.0;
ogl.src.ambient[3] = 1.0;
// Source general diffuse est la couleur d'un objet lorsqu'il est éclairé par cette source de lumière
ogl.src.diffuse[0] = 1.0;
ogl.src.diffuse[1] = 1.0;
ogl.src.diffuse[2] = 1.0;
ogl.src.diffuse[3] = 1.0;
// Source general specular est la couleur qu'acquiert un objet lorsqu'il réfléchit la lumière
ogl.src.specular[0] = 1.0;
ogl.src.specular[1] = 1.0;
ogl.src.specular[2] = 1.0;
ogl.src.specular[3] = 1.0;
// Proprietes des materiaux -> http://devernay.free.fr/cours/opengl/materials.html
// Materiaux couvre
ogl.cooper.ambient[0] = 0.19125;
ogl.cooper.ambient[1] = 0.0735;
ogl.cooper.ambient[2] = 0.0225;
ogl.cooper.ambient[3] = 1.0;
ogl.cooper.diffuse[0] = 0.7038;
ogl.cooper.diffuse[1] = 0.27048;
ogl.cooper.diffuse[2] = 0.0828;
ogl.cooper.diffuse[3] = 1.0;
ogl.cooper.specular[0] = 0.256777;
ogl.cooper.specular[1] = 0.137622;
ogl.cooper.specular[2] = 0.086014;
ogl.cooper.specular[3] = 1.0;
ogl.cooper.shininess = 0.1;
// Materiaux plastique
ogl.plastic.ambient[0] = 0.1;
ogl.plastic.ambient[1] = 0.25;
ogl.plastic.ambient[2] = 0.1;
ogl.plastic.ambient[3] = 1.0;
ogl.plastic.diffuse[0] = 0.1;
ogl.plastic.diffuse[1] = 0.35;
ogl.plastic.diffuse[2] = 0.1;
ogl.plastic.diffuse[3] = 1.0;
ogl.plastic.specular[0] = 0.45;
ogl.plastic.specular[1] = 0.55;
ogl.plastic.specular[2] = 0.45;
ogl.plastic.specular[3] = 1.0;
ogl.plastic.shininess = 0.25;
// Materiaux acier
ogl.steel.ambient[0] = 0.25;
ogl.steel.ambient[1] = 0.25;
ogl.steel.ambient[2] = 0.25;
ogl.steel.ambient[3] = 1.0;
ogl.steel.diffuse[0] = 0.4;
ogl.steel.diffuse[1] = 0.4;
ogl.steel.diffuse[2] = 0.4;
ogl.steel.diffuse[3] = 1.0;
ogl.steel.specular[0] = 0.774597;
ogl.steel.specular[1] = 0.774597;
ogl.steel.specular[2] = 0.774597;
ogl.steel.specular[3] = 1.0;
ogl.steel.shininess = 0.6;
//Materiaux
ogl.mat = &(ogl.plastic); // choix du materiau
ogl.file_name_open = ("Tiger.mesh");
ogl.shrinkonoff = ("Trace Filaire");
ogl.fshrink = 1.0; // Variable initiale pour commencer le shrink
ogl.shrinkok = 0;
}
/*
----- Nom: InitializeMesh
---- Type: function
- Objetif: Initialisation de la struture mesh (elle initialise tous les champs d’une variable de type Mesh)
Les valeurs dependent du fichier ouvert, ici on les initialise
-- Autres: FUNCTION QUI FAIT L'ATTRIBUITION: READMESH
-- Return: Void
*/
void InitializeMesh()
{
msh.number_of_vertices = 0.0;
msh.number_of_triangles = 0.0;
msh.vertices = NULL;
msh.normal_v = NULL;
msh.triangles = NULL;
msh.alpha_t = NULL;
msh.normal_t = NULL;
for (int j = 0; j < DIM; j++)
{
msh.ccenter[j] = 0.0;
msh.cmin[j] = 0.0;
msh.cmax[j] = 0.0;
}
msh.delta = 0.0;
msh.memory = 0.0;
msh.error = 0.0;
for (int j = 0; j < 2*DIM-1; j++)
msh.dirc[j] = j % DIM;
}
/*
----- Nom: ReadMesh
---- Type: function
- Objetif: Les instructions utiles pour l’ouverture d’un fichier (fopen)au format mesh et la
lecture (fscanf) des informations concernant la triangulation sous-jacente
-- Autres: Lecture du fichier au format mesh INRIA Gamma3 -> IL FAIT L'ATTRIBUITION POUR LES VARIABLE MSH
-- Return: Void
*/
void ReadMesh()
{
FILE *file;
char file_name[264], keyword[80];
int i, j, ii, dimension;
// Ouvre le fichier de maillage en lecture
if ((file = fopen( ogl.file_name_open , "r")) == NULL)
{
printf("file %s not found\n", file_name);
msh.error = 100;
return;
}
// boucle de lecture du fichier principal
for (;;)
{
fscanf(file, "%s", keyword);
// Vérifie si c'est la fin du fichier
if (strcmp(keyword, "EOF") == 0 || strcmp(keyword, "End") == 0 || strcmp(keyword, "end") == 0) // fin du fichier
break;
// Vérifier la taille du maillage
else if (strcmp(keyword, "Dimension") == 0 || strcmp(keyword, "dimension") == 0) // mot cle dimension
fscanf(file, "%d", &dimension);
// Lire les sommets du maillage
else if (strcmp(keyword, "Vertices") == 0 || strcmp(keyword, "vertices") == 0) // mot cle Vertices
{
fscanf(file, "%d", &(msh.number_of_vertices));
// Allouer de la mémoire pour les sommets
msh.vertices = (float *)malloc((DIM * msh.number_of_vertices) * sizeof(float));
if (!msh.vertices)
{
printf("not enough memory for %d vertices (%ld bytes)\n", msh.number_of_vertices, DIM * msh.number_of_vertices * sizeof(float));
msh.error = 200;
return;
}
else
msh.memory += (DIM * msh.number_of_vertices) * sizeof(float);
// Lit les coordonnées des sommets
if (dimension == 2)
{
for (i = 0; i < msh.number_of_vertices; i++)
{
ii = DIM * i;
fscanf(file, "%f %f %d", &(msh.vertices[ii]), &(msh.vertices[ii + 1]), &j);
msh.vertices[ii + 2] = 0.0;
}
}
else if (dimension == 3)
{
for (i = 0; i < msh.number_of_vertices; i++)
{
ii = DIM * i;
fscanf(file, "%f %f %f %d", &(msh.vertices[ii]), &(msh.vertices[ii + 1]), &(msh.vertices[ii + 2]), &j);
}
}
}
// Lire les triangles du maillage
else if (strcmp(keyword, "Triangles") == 0 || strcmp(keyword, "triangles") == 0) // mot cle Triangles
{
fscanf(file, "%d", &(msh.number_of_triangles));
// Allouer de la mémoire pour les triangles
msh.triangles = (int*)malloc((DIM * msh.number_of_triangles) * sizeof(int));
if (!msh.triangles)
{
printf("not enough memory for %d triangles (%ld bytes)\n", msh.number_of_triangles, DIM * msh.number_of_triangles * sizeof(int));
msh.error = 200;
return;
}
else
msh.memory += (DIM * msh.number_of_triangles) * sizeof(int);
// Lire les indices des sommets des triangles
for (i = 0; i < msh.number_of_triangles; i++)
{
ii = DIM * i;
fscanf(file, "%d %d %d %d", &(msh.triangles[ii]), &(msh.triangles[ii + 1]), &(msh.triangles[ii + 2]), &j);
// Définit les indices de sommet pour qu'ils commencent à 0
for (j = 0; j < DIM; j++)
msh.triangles[ii + j]--;
}
}
}
fclose(file);
// Affichage a l'ecran des infos sur le maillage
printf("mesh : %d vertices -- %d triangles (%ld kbytes)\n", msh.number_of_vertices, msh.number_of_triangles, msh.memory / 1024);
}
/*
----- Nom: NormalizeMesh
---- Type: function
- Objetif: Cette procedure effectue une mise à l’echelle des coordonnées des sommets dans le cube unite
-- Autres: (1) Elle utilise une translation et une homothetie pour faire entrer et
centrer le modele dans le cube unite
(2) Normalisation des coordonnees des sommets entre 0 et 1 et centrage
-- Return: Void
*/
void NormalizeMesh()
{
int i, ii, j;
// Initialise les valeurs minimum et maximum des bornes (cmin et cmax) avec les valeurs du premier sommet
for (j = 0; j < DIM; j++)
{
msh.cmin[j] = msh.vertices[j];
msh.cmax[j] = msh.vertices[j];
}
// Boucle sur les sommets restants et met à jour les valeurs minimale et maximale des limites
for (i = 1; i < msh.number_of_vertices; i++)
{
ii = DIM * i;
for (j = 0; j < DIM; j++)
{
if (msh.cmin[j] > msh.vertices[ii + j])
msh.cmin[j] = msh.vertices[ii + j];
if (msh.cmax[j] < msh.vertices[ii + j])
msh.cmax[j] = msh.vertices[ii + j];
}
}
// Calcule le centre du maillage (ccenter) comme la moyenne des limites
for (j = 0; j < DIM; j++)
msh.ccenter[j] = (float)(0.5 * (msh.cmin[j] + msh.cmax[j]));
msh.delta = msh.cmax[0] - msh.cmin[0];
// Calcule la valeur delta comme la différence entre le maximum et le minimum dans chaque dimension
for (j = 1; j < DIM; j++)
if (msh.delta < msh.cmax[j] - msh.cmin[j])
msh.delta = msh.cmax[j] - msh.cmin[j];
// Normalise les coordonnées des sommets à une échelle de 0 à 1
for (i = 0; i < msh.number_of_vertices; i++)
{
ii = DIM * i;
for (j = 0; j < DIM; j++)
msh.vertices[ii + j] = (float)(0.5 + (msh.vertices[ii + j] - msh.ccenter[j]) / msh.delta); // met les coordonnées a l'échelle
}
}
/*
----- Nom: InitialiserGeometrie
---- Type: function
- Objetif:
(1) Creer toutes les coordonnes dans une list de chaquee sommet (8 sommets chaqu'un avec 3 coordonnes)
(2) Creer matrice 4x4 identite -> tg
(3) Creer 2 triangules pour chaque face et leur atribuir pour chaque sommet ses coordonnes
-- Autres: -
-- Return: Void
*/
void InitialiserGeometrie()
{
msh.number_of_triangles = 12;
msh.number_of_vertices = 8;
msh.vertices = (float*)malloc((DIM*msh.number_of_vertices)*sizeof(float));
msh.triangles = (int*)malloc((DIM*msh.number_of_triangles)*sizeof(int));
for( int e = 0; e < 24; e++ ){
msh.vertices[e] = 0.0;
if(e == 3 || e == 6 || e == 7 || e == 10 || e == 14 || e == 15 || e == 17 || e == 18 || e == 19 || e == 20 || e == 22 || e == 23 ){
msh.vertices[e] = 1.0;
}
}
// Triangles de la FACE
msh.triangles[0] = 5;
msh.triangles[1] = 1;
msh.triangles[2] = 2;
msh.triangles[3] = 6;
msh.triangles[4] = 5;
msh.triangles[5] = 2;
// Triangles du SOMMET
msh.triangles[6] = 4;
msh.triangles[7] = 5;
msh.triangles[8] = 6;
msh.triangles[9] = 4;
msh.triangles[10] = 6;
msh.triangles[11] = 7;
// Triangles de la DROITE
msh.triangles[12] = 7;
msh.triangles[13] = 6;
msh.triangles[14] = 2;
msh.triangles[15] = 7;
msh.triangles[16] = 2;
msh.triangles[17] = 3;
// Triangles de la GAUCHE
msh.triangles[18] = 1;
msh.triangles[19] = 5;
msh.triangles[20] = 0;
msh.triangles[21] = 5;
msh.triangles[22] = 4;
msh.triangles[23] = 0;
// Triangles du BAS
msh.triangles[24] = 0;
msh.triangles[25] = 2;
msh.triangles[26] = 1;
msh.triangles[27] = 0;
msh.triangles[28] = 3;
msh.triangles[29] = 2;
// Triangles d'ARRIERE
msh.triangles[30] = 7;
msh.triangles[31] = 3;
msh.triangles[32] = 4;
msh.triangles[33] = 4;
msh.triangles[34] = 3;
msh.triangles[35] = 0;
}
//----------------------------------------------------------------------------------------------------------------------------------
//==================================================================================================================
// INITIALISATION DE LA FENETRE
//==================================================================================================================
/*
----- Nom: BasePourMatriceModelVue
---- Type: function
- Objetif: Base pour MatriceModelVue(), MatriceModelVue3D() et MatriceModelVueShadow()
-- Autres: -
-- Return: Void
*/
void BasePourMatriceModelVue(){
glMatrixMode(GL_MODELVIEW); // definit la matrice de transformation actuelle en tant que modèle et matrice de vue
glLoadIdentity(); // réinitialise la matrice actuelle à la matrice d'identité
if ( ogl.flagrotation == 1 ){
Rotation();
} else if ( ogl.flagtranslation == 1 ){
Translation();
}
glMultMatrixf(ogl.tg); // Appliquer toutes les transformations geometriques antecedentes
glGetFloatv(GL_MODELVIEW_MATRIX, ogl.tg); // Mettre a jour l’historique des transformations geometriques
}
/*
----- Nom: MatriceModelVue
---- Type: function
- Objetif: Pour appliquer une transformation geométrique donnée, on doit non seulement composer
cette transformation mais aussi toutes les transformations antecédentes pour la continuite
des transformations. La function definit tous les parametres utilises dans l'ecran
-- Autres: -
-- Return: Void
*/
void MatriceModelVue(){
BasePourMatriceModelVue();
gluLookAt(ogl.obsx, ogl.obsy, ogl.obsz,
ogl.focalx, ogl.focaly, ogl.focalz,
ogl.verticalx, ogl.verticaly, ogl.verticalz); // Appliquer le changement de repere avec les coordenees d'observateur, centre et hauteur
}
/*
----- Nom: MatriceModelVue3d
---- Type: function
- Objetif: Pour appliquer une transformation geométrique donnée, on doit non seulement composer
cette transformation mais aussi toutes les transformations antecédentes pour la continuite
des transformations. La function definit tous les parametres utilises dans l'ecran
-- Autres: -
-- Return: Void
*/
void MatriceModelVue3d(){
BasePourMatriceModelVue();
gluLookAt(ogl.obsx3d, ogl.obsy3d, ogl.obsz3d,
ogl.focalx, ogl.focaly, ogl.focalz,
ogl.verticalx, ogl.verticaly, ogl.verticalz); // Appliquer le changement de repere avec les coordenees d'observateur, centre et hauteur
}
/*
----- Nom: MatriceModelVueShadow
---- Type: function
- Objetif: Pour appliquer une transformation geométrique donnée, on doit non seulement composer
cette transformation mais aussi toutes les transformations antecédentes pour la continuite
des transformations. La function definit tous les parametres utilises dans l'ecran
-- Autres: -
-- Return: Void
*/
void MatriceModelVueShadow(){
BasePourMatriceModelVue();
gluLookAt(ogl.shadowx, ogl.shadowy, ogl.shadowz,
ogl.focalx, ogl.focaly, ogl.focalz,
ogl.verticalx, ogl.verticaly, ogl.verticalz); // Appliquer le changement de repere avec les coordenees d'observateur, centre et hauteur
}
/*
----- Nom: MatriceProjection
---- Type: function
- Objetif: Creer le paralellepipede autour de tout (champs de vision) -> Tpers
-- Autres: -
-- Return: Void
*/
void MatriceProjection()
{
glMatrixMode(GL_PROJECTION); // définit la matrice de transformation actuelle comme matrice de projection
glLoadIdentity(); // réinitialise la matrice actuelle à la matrice d'identité
glFrustum(ogl.fzoom*ogl.fu*ogl.umin,
ogl.fzoom*ogl.fu*ogl.umax,
ogl.fzoom*ogl.fv*ogl.vmin,
ogl.fzoom*ogl.fv*ogl.vmax,
ogl.dmin,
ogl.dmax); // Creer le paralellepipede autour de tout (champs de vision) volume d'affichage
}
/*
----- Nom: EffacerEcran
---- Type: function
- Objetif: Effacer tous qu'il y a sur la fennetre graphique
-- Autres: -
-- Return: Void
*/
void EffacerEcran()
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); // efface le contenu des tampons de couleur et de profondeur
}
/*
----- Nom: InitialiserEnvironnementGraphique
---- Type: function
- Objetif: Spécifier des valeurs claires pour les tampons de couleur et après définir la couleur actuelle
-- Autres: -
-- Return: Void
*/
void InitialiserEnvironnementGraphique()
{
glClearColor(ogl.couleurfond[0], ogl.couleurfond[1], ogl.couleurfond[2], 0.0); // Definition de la couleur du fond
glColor3f(ogl.couleurligne[0], ogl.couleurligne[1], ogl.couleurligne[2]); // Definition de la couleur courante de la ligne
MatriceProjection(); // Champs de vision ou volume d'affichage
}
/*
----- Nom: CreationFenetreGraphique
---- Type: function
- Objetif: Creer l'ecran et sa taille, le coordonne de l'ecran
-- Autres: -
-- Return: Void
*/
void CreationFenetreGraphique()
{
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH); // définit le mode d'affichage de la fenêtre OpenGL
glutInitWindowSize(ogl.lfg, ogl.hfg); // space ocupe par la fenetre
glutInitWindowPosition(ogl.fox, ogl.foy); // position du point focal
glutCreateWindow("Projet_LO13_CORREIA_Andre"); // creation dela fenetre graphique et le nome d'affichage
}
//----------------------------------------------------------------------------------------------------------------------------------
//==================================================================================================================
// TRACE DES OBJETS
//==================================================================================================================
/*
----- Nom: TracerObjet
---- Type: function
- Objetif: Pour chaque ensemble de point on crée un triangle (chaque 'i' est le sommet d'un triangle
-- Autres: -
-- Return: Void
*/
void TracerObjet()
{
// début de la définition des triangles pour le rendu
glBegin(GL_TRIANGLES);
// Boucle à travers les triangles du maillage
for(int i = 0; i < msh.number_of_triangles; i++)
{
int i1 = 3*(i);
for ( int j = 0 ; j <= 2; j++)
{
int s = msh.triangles[i1+j];
int s1 = DIM*(s);
// Définit les coordonnées du sommet actuel et l'ajoute au tampon de rendu
glVertex3f(msh.vertices[s1], msh.vertices[s1+1], msh.vertices[s1+2]);
}
}
// Terminer la définition des triangles
glEnd();
}
/*
----- Nom: TracerObjetDegrade
---- Type: function
- Objetif: Pour chaque ensemble de point on cree un triangle degradee (chaque 'i' est le sommet d'un triangle)
-- Autres: -
-- Return: Void
*/
void TracerObjetDegrade()
{
glBegin(GL_TRIANGLES);
int i, j, i1, s;
float A, B, C, A1, B1,C1;
double Aw[3], Bw[3], Cw[3], G[3]; // Point A, B et C initial et P
float A_ligne[3], B_ligne[3], C_ligne[3], GA[3],GB[3],GC[3];
for(i=0;i<msh.number_of_triangles;i++)
{
glColor3f((float)(msh.number_of_triangles-i)/msh.number_of_triangles,0.0,(float)i/msh.number_of_triangles);
i1= 3*i; //triângulo i
s=3*msh.triangles[i1+0]; // s é a coordenada zero do primeiro sommet do triângulo i
Aw[0] = msh.vertices[s];
Aw[1] = msh.vertices[s + 1];
Aw[2] = msh.vertices[s + 2];
s=3*msh.triangles[i1+1]; //coord do 2o sommet do triangulo i
Bw[0] = msh.vertices[s];
Bw[1] = msh.vertices[s + 1];
Bw[2] = msh.vertices[s+ 2];
s=3*msh.triangles[i1+2]; //coord do 3o sommet do triângulo i
Cw[0] = msh.vertices[s];
Cw[1] = msh.vertices[s + 1];
Cw[2] = msh.vertices[s + 2];
G[0] = Aw[0]/3.0 + Bw[0]/3.0 + Cw[0]/3.0; //Projection de changement
G[1] = Aw[1]/3.0 + Bw[1]/3.0 + Cw[1]/3.0;
G[2] = Aw[2]/3.0 + Bw[2]/3.0 + Cw[2]/3.0;
int s1;
for(j=0;j<=2;j++)
{
s=msh.triangles[i1+j];
s1=3*(s);
glNormal3f(msh.normal_v[s1], msh.normal_v[s1+1], msh.normal_v[s1+2]);
A1 = msh.vertices[s1]*ogl.fshrink +(1.0 - ogl.fshrink)*G[0];
B1 = msh.vertices[s1+1]*ogl.fshrink +(1.0 - ogl.fshrink)*G[1];
C1 = msh.vertices[s1+2]*ogl.fshrink +(1.0 - ogl.fshrink)*G[2];
glVertex3f(A1 ,B1, C1);
}
}
glEnd();
}
/*
----- Nom: TraceTriangle
---- Type: function
- Objetif: Pour chaque ensemble de point on cree un triangle unique (chaque 'i' est le sommet d'un triangle)
-- Autres: -
-- Return: Void
*/
void TraceTriangle()
{
int i, j, s;
// début de la définition des triangles pour le rendu
glBegin(GL_TRIANGLES);
// Boucle à travers les triangles du maillage // delimiter les sommet
for (i=0 ; i < msh.number_of_triangles ; i++)
{
// groupe des trois sommets du triangles i pour former un triangle
for (j=0 ; j<3 ; j++)
{
// s est le numéro du sommet j du triangle i
s = msh.triangles[3*i+j] ;
glVertex3f(msh.vertices[3*s], msh.vertices[3*s+1], msh.vertices[3*s+2]) ; //Specifier un vertice
}
}
// delimiter les sommets
glEnd();
}
/*
----- Nom: TracerCarre
---- Type: function
- Objetif: Pour chaque ensemble de point on crée un carre pour avoir les plans de projection OXYZ
-- Autres: -
-- Return: Void
*/
void TracerCarre()
{
glBegin(GL_TRIANGLES);
//for(int i = 0; i < 36; i++)
//{
//int i1 = 3*(i);
//for ( int j = 0 ; j <= 2; j++)
//{
// int s = msh.triangles[i1+j];
//int s1 = DIM*(s);
//glVertex3f(msh->planscarre[0], 0, 1);
//glVertex3f(0, 0, 0);
//glVertex3f(0, 0, 1);
//}
//}
glEnd();
}
/*
----- Nom: ObjetOmbrageConstant
---- Type: fonction
- Objetif: L’ombrage du modele discret peut etre vu comme choisir une couleur pour chaque
element (triangle). Le choix de la couleur est effectue au moment ou l’on balaye
les elements pour les dessiner.
-- Autres: La procedure comprend l’activation de la source et l’affectation du materiau
-- Return: Void
*/
void ObjetOmbrageConstant()
{
int i, j, s;
ActivationZBuffer();
ActivationSource();
AffectationMateriau();
glShadeModel(GL_FLAT); // mode ombrage constant
TracerShrink();
DesactivationSource();
DesactivationZBuffer();
}
/*
----- Nom: ObjetOmbragePhong
---- Type: fonction
- Objetif: C’est une procedure similaire a l’ombrage constant sauf que le mode est different (GL_SMOOTH)
-- Autres: La procedure comprend l’activation de la source et l’affectation du materiau
-- Return: Void
*/
void ObjetOmbragePhong()
{
int i, j, s;
ActivationZBuffer();
ActivationSource();
AffectationMateriau();
glShadeModel(GL_SMOOTH); // Mode ombrage de Phong
TracerShrink();
DesactivationSource();
DesactivationZBuffer();
}
/*
----- Nom: ActivationZBuffer
---- Type: function
- Objetif: Le traitement des parties cachees permet d’eliminer les parties de
l’objet qui ne sont pas visibles de l’observateur
-- Autres: L’activation du z-buffer
-- Return: Void
*/
void ActivationZBuffer()
{
glEnable(GL_DEPTH_TEST); // activer le test de profondeur
}
/*
----- Nom: DesactivationZBuffer
---- Type: function
- Objetif: Le traitement des parties cachees permet d’eliminer les parties de
l’objet qui ne sont pas visibles de l’observateur
-- Autres: La desactivation du z-buffer
-- Return: Void
*/
void DesactivationZBuffer()
{
glDisable(GL_DEPTH_TEST); // desactiver le test de profondeur
}
/*
----- Nom: DecalageAvantActivation
---- Type: function
- Objetif: Decalage avant pour le contour (Tracer en mode remplissage,
avancer l’objet d’un petit pas vers l’observateur)
-- Autres: Eviter polygones superposés
-- Return: Void
*/
void DecalageAvantActivation(){
glPolygonOffset(1.0, 1.0); // Décalage de polygone
glEnable(GL_POLYGON_OFFSET_FILL); // Decalage avant pour le contour
}
void DecalageAvantActivationLine(){
glPolygonOffset(1.0, 1.0); // Décalage de polygone
glEnable(GL_POLYGON_OFFSET_LINE); // Decalage avant pour le contour
}
/*
----- Nom: DecalageAvantDesactivation
---- Type: function
- Objetif: Apres tracer en mode contour, remettre l’objet a sa position d’origine
-- Autres: -
-- Return: Void
*/
void DecalageAvantDesactivation()
{
glDisable(GL_POLYGON_OFFSET_FILL);
}
/*
----- Nom: Shrink
---- Type: Ensemble de function
- Objetif: Pour detecter facilement visuellement certains defauts dans un maillage,
il peut etre utile de reduire la taille des elements
-- Autres: -
-- Return: Void
*/
//----------------------------------------------------------------------------------------------------------------------------------
/*
----- Nom: Shrink
---- Type: Ensemble de function
- Objetif: Pour detecter facilement visuellement certains defauts dans un maillage,
il peut etre utile de reduire la taille des elements
-- Autres: -
-- Return: Void
*/
void TracerShrink()
{
glBegin(GL_TRIANGLES); // début de la définition des triangles pour le rendu
int j, i1, s;
float A, B, C, A1, B1,C1;
double Aw[3], Bw[3], Cw[3], G[3]; // Point A, B et C initial et P
float A_ligne[3], B_ligne[3], C_ligne[3], GA[3],GB[3],GC[3];
for(int i = 0; i < msh.number_of_triangles; i++)
{
i1= 3*i; //triângulo i
s=3*msh.triangles[i1+0]; // s é a coordenada zero do primeiro sommet do triângulo i
Aw[0] = msh.vertices[s]; //X Premier triangle
Aw[1] = msh.vertices[s + 1]; //Y Premier triangle
Aw[2] = msh.vertices[s + 2]; //Z Premier triangle
s=3*msh.triangles[i1+1]; //coord do 2o sommet do triangulo i
Bw[0] = msh.vertices[s]; //X Deuxieme triangle
Bw[1] = msh.vertices[s + 1]; //Y Deuxieme triangle
Bw[2] = msh.vertices[s + 2]; //Z Deuxieme triangle
s=3*msh.triangles[i1+2]; //coord do 3o sommet do triângulo i
Cw[0] = msh.vertices[s]; //X Troisieme triangle
Cw[1] = msh.vertices[s + 1]; //Y Troisieme triangle
Cw[2] = msh.vertices[s + 2]; //Z Troisieme triangle
G[0] = Aw[0]/3.0 + Bw[0]/3.0 + Cw[0]/3.0; //Projection de changement pour le baricentre
G[1] = Aw[1]/3.0 + Bw[1]/3.0 + Cw[1]/3.0; //Projection de changement pour le baricentre
G[2] = Aw[2]/3.0 + Bw[2]/3.0 + Cw[2]/3.0; //Projection de changement pour le baricentre
int s1;
for( int j = 0; j <= 2; j++)
{
s = msh.triangles[i1+j];
s1 = 3 * (s);
glNormal3f(msh.normal_v[s1], msh.normal_v[s1+1], msh.normal_v[s1+2]);
A1 = msh.vertices[s1] * ogl.fshrink + ( 1.0 - ogl.fshrink) * G[0]; // decalage du point
B1 = msh.vertices[s1+1] * ogl.fshrink + ( 1.0 - ogl.fshrink) * G[1]; // decalage du point
C1 = msh.vertices[s1+2] * ogl.fshrink + ( 1.0 - ogl.fshrink) * G[2]; // decalage du point
glVertex3f(A1 ,B1, C1); // Les coordonnees du nouveau triangle
}
}
glEnd(); // Terminer la définition des triangles
}
//----------------------------------------------------------------------------------------------------------------------------------
//==================================================================================================================
// LES MODES DES TRACE
//==================================================================================================================
/*
----- Nom: TracerFilaire
---- Type: function
- Objetif: Structure trace standard
-- Autres: Mode 1