diff --git a/TP_Geom3D_2018/Projet_modeling/main.cpp b/TP_Geom3D_2018/Projet_modeling/main.cpp index 7946993cb0508dcd95d3caa604ff288469d5768d..401b12ae874c5210fe1b6ce1d3215b1b8817126e 100644 --- a/TP_Geom3D_2018/Projet_modeling/main.cpp +++ b/TP_Geom3D_2018/Projet_modeling/main.cpp @@ -1,4 +1,4 @@ - + #include <QApplication> #include <QGLViewer/simple_viewer.h> #include <matrices.h> @@ -19,9 +19,20 @@ const Vec3 NOIR = {0,0,0}; void draw_repere(const Primitives& prim, const Mat4& tr) { prim.draw_sphere(tr, BLANC); +<<<<<<< HEAD prim.draw_cylinder(tr*translate(1,0,0)* scale(2,0.5,0.5) * rotateY(90) , ROUGE); // X prim.draw_cylinder(tr*translate(0,1,0)* scale(0.5,2,0.5) * rotateX(90) , VERT); // Y prim.draw_cylinder(tr*translate(0,0,1) * scale(0.5,0.5,2) , BLEU); // Z +======= + prim.draw_cylinder(tr*translate(1,0,0)* scale(1,0.25,0.25) * rotateY(90) , ROUGE); // X + prim.draw_cylinder(tr*translate(0,1,0)* scale(0.25,1,0.25) * rotateX(90) , VERT); //Y + prim.draw_cylinder(tr*translate(0,0,1) * scale(0.25,0.25,1) , BLEU); //Z + + prim.draw_cone(tr*translate(0,1,0)* rotateX(-90), VERT); + prim.draw_cone(tr*translate(1,0,0)* rotateY(90), ROUGE); + prim.draw_cone(tr*translate(0,0,1), BLEU); +} +>>>>>>> 3eaf77e4b27a9ed06e64dda2d31ce444b5e0010f prim.draw_cone(tr*translate(2,0,0)* rotateY(90), ROUGE); prim.draw_cone(tr*translate(0,2,0)* rotateX(-90), VERT); @@ -44,9 +55,16 @@ void star(MeshQuad& m) } } +<<<<<<< HEAD void spirale(MeshQuad& m) { m.create_cube(); +======= + +void spirale(MeshQuad& m) +{ + m.create_cube(); +>>>>>>> 3eaf77e4b27a9ed06e64dda2d31ce444b5e0010f #pragma omp parallel for for(int i = 0 ; i < 250 ; i++) { @@ -54,6 +72,7 @@ void spirale(MeshQuad& m) m.extrude_quad(12) ; } +<<<<<<< HEAD } void inside_shape1(MeshQuad& m,int q, int count) @@ -73,10 +92,107 @@ void inside_shape1(MeshQuad& m,int q, int count) index = m.nb_quads()*4; inside_shape1(m,q, count-1); +======= +} + +void inside_shape(MeshQuad& m,int q, int count) +{ + int index; + if(count > 0) + { + m.extrude_quad(q); + m.extrude_quad(q); + m.shrink_quad(q,0.9f); + m.tourne_quad(q,5) ; + m.extrude_quad(q); + m.shrink_quad(q,0.5f); + m.extrude_quad(q); + m.decale_quad(q,1.2f); + + index = m.nb_quads()*4; + + inside_shape(m,q, count-1); + + inside_shape(m,index-4, count-1); + inside_shape(m,index-8, count-1); + + inside_shape(m,index-12, count-1); + inside_shape(m,index-16, count-1); + + } +} + +void inside_shape2(MeshQuad& m,int q, int count) +{ + int index; + if(count > 0) + { + m.extrude_quad(q) ; + m.extrude_quad(q) ; + m.shrink_quad(q,0.5f) ; + m.extrude_quad(q) ; + m.decale_quad(q,5); + + index = m.nb_quads()*4; + + inside_shape2(m,q, count-1); + + inside_shape2(m,index-4, count-1); + inside_shape2(m,index-8, count-1); + + inside_shape2(m,index-12, count-1); + inside_shape2(m,index-16, count-1); + } +} + +void inside_shape3(MeshQuad& m,int q, int count) +{ + if(count > 1){ + + #pragma omp parallel for + for(int i = 0 ; i < 17 ; i++) + { + m.extrude_quad(q) ; + m.transfo_quad(q,rotateX(20)) ; + + } + int index = count * 16 ; + inside_shape3(m,index,count -1) ; + + } + +} + +void shape1(MeshQuad& m ) +{ + m.create_cube() ; + #pragma omp parallel for + for(int i = 0 ; i < 6 ; i++) + inside_shape(m,4*i,3) ; + +} + +void shape2(MeshQuad& m ) +{ + m.create_cube() ; + + for(int i = 0 ; i < 8; i++) + { + m.extrude_quad(12) ; + m.transfo_quad(12,rotateY(18)) ; + m.extrude_quad(16) ; + m.transfo_quad(16,rotateY(-18)) ; + } + + + inside_shape2(m,12,3) ; + inside_shape2(m,16,3) ; +>>>>>>> 3eaf77e4b27a9ed06e64dda2d31ce444b5e0010f inside_shape1(m,index-4, count-1); inside_shape1(m,index-8, count-1); +<<<<<<< HEAD inside_shape1(m,index-12, count-1); inside_shape1(m,index-16, count-1); @@ -95,6 +211,16 @@ void inside_shape2(MeshQuad& m,int q, int count) m.decale_quad(q,5); index = m.nb_quads()*4; +======= +} + +void shape3(MeshQuad& m ) +{ + m.create_cube() ; + inside_shape3(m,12,18) ; + +} +>>>>>>> 3eaf77e4b27a9ed06e64dda2d31ce444b5e0010f inside_shape2(m,q, count-1); @@ -184,7 +310,11 @@ int main(int argc, char *argv[]) mesh.set_matrices(viewer.getCurrentModelViewMatrix(),viewer.getCurrentProjectionMatrix()); prim.set_matrices(viewer.getCurrentModelViewMatrix(),viewer.getCurrentProjectionMatrix()); +<<<<<<< HEAD mesh.draw(JAUNE); +======= + mesh.draw(BLANC); +>>>>>>> 3eaf77e4b27a9ed06e64dda2d31ce444b5e0010f if (selected_quad>=0) { @@ -241,8 +371,13 @@ int main(int argc, char *argv[]) break; case Qt::Key_1: +<<<<<<< HEAD shape1(mesh) ; break ; +======= + shape1(mesh) ; + break ; +>>>>>>> 3eaf77e4b27a9ed06e64dda2d31ce444b5e0010f case Qt::Key_2: shape2(mesh) ; @@ -251,8 +386,11 @@ int main(int argc, char *argv[]) case Qt::Key_3: shape3(mesh) ; break ; +<<<<<<< HEAD +======= +>>>>>>> 3eaf77e4b27a9ed06e64dda2d31ce444b5e0010f // .... // Attention au cas m_selected_quad == -1 diff --git a/TP_Geom3D_2018/Projet_modeling/meshquad.cpp b/TP_Geom3D_2018/Projet_modeling/meshquad.cpp index 9140825c9bbad248acd7c8f5fb8def350e311d55..be5a4a4baebb01b0cc7b7978527e125e946e9f6a 100644 --- a/TP_Geom3D_2018/Projet_modeling/meshquad.cpp +++ b/TP_Geom3D_2018/Projet_modeling/meshquad.cpp @@ -1,4 +1,4 @@ -#include "meshquad.h" + #include "meshquad.h" #include "matrices.h" #include <iostream> #include <vector> @@ -7,6 +7,11 @@ using namespace std; +<<<<<<< HEAD +======= +#define MAX 1000000000 +using namespace std ; +>>>>>>> 3eaf77e4b27a9ed06e64dda2d31ce444b5e0010f void MeshQuad::clear() { m_points.clear(); @@ -39,6 +44,7 @@ void MeshQuad::convert_quads_to_tris(const std::vector<int>& quads, std::vector< // Pour chaque quad on genere 2 triangles // Attention a repecter l'orientation des triangles +<<<<<<< HEAD #pragma omp parallel for for (size_t i=0; i< quads.size(); i+=4) { int v1 = quads.at(i); @@ -52,6 +58,21 @@ void MeshQuad::convert_quads_to_tris(const std::vector<int>& quads, std::vector< tris.push_back(v3); tris.push_back(v4); tris.push_back(v1); +======= + int index = 0 ; + + for(size_t i = 0 ; i < quads.size()/4 ; i++) + { + tris.push_back(quads[index]) ; + tris.push_back(quads[index+1]) ; + tris.push_back(quads[index+2]) ; + + tris.push_back(quads[index]) ; + tris.push_back(quads[index+2]) ; + tris.push_back(quads[index+3]) ; + + index += 4 ; +>>>>>>> 3eaf77e4b27a9ed06e64dda2d31ce444b5e0010f } } @@ -60,11 +81,15 @@ void MeshQuad::convert_quads_to_edges(const std::vector<int>& quads, std::vector { edges.clear(); edges.reserve(quads.size()); // ( *2 /2 !) +<<<<<<< HEAD +======= +>>>>>>> 3eaf77e4b27a9ed06e64dda2d31ce444b5e0010f // Pour chaque quad on genere 4 aretes, 1 arete = 2 indices. // Mais chaque arete est commune a 2 quads voisins ! // Comment n'avoir qu'une seule fois chaque arete ? +<<<<<<< HEAD size_t i, nb_quads = quads.size(); #pragma omp parallel for @@ -91,11 +116,43 @@ void MeshQuad::convert_quads_to_edges(const std::vector<int>& quads, std::vector edges.push_back(i1); } } +======= + int i ,i1,i2,i3,i4; + for(i = 0 ; i < quads.size()/4 ; i+=4) + { + i1 = quads.at(i) ; + i2 = quads.at(i+1) ; + i2 = quads.at(i+2) ; + i2 = quads.at(i+3) ; + + if(i1 < i2) + { + edges.push_back(i1); + edges.push_back(i2); + } + if(i2 < i3) + { + edges.push_back(i2); + edges.push_back(i3); + } + if(i3 < i4) + { + edges.push_back(i3); + edges.push_back(i4); + } + if(i4 < i1) + { + edges.push_back(i4); + edges.push_back(i1); + } + } +>>>>>>> 3eaf77e4b27a9ed06e64dda2d31ce444b5e0010f } void MeshQuad::bounding_sphere(Vec3& C, float& R) { +<<<<<<< HEAD size_t i , nb_points = m_points.size(); #pragma omp parallel for reduction(+:C) @@ -113,12 +170,28 @@ void MeshQuad::bounding_sphere(Vec3& C, float& R) } } R = max; +======= + + for (size_t i = 0; i < this->m_points.size(); i++) { + C += this->m_points.at(i); + } + C /= m_points.size(); + float max = glm::length(C - this->m_points.at(0)); + for (size_t i = 1; i < this->m_points.size(); i++) { + float tmp = glm::length(C - this->m_points.at(i)); + if (tmp > max) { + max = tmp; + } + } + R = max; +>>>>>>> 3eaf77e4b27a9ed06e64dda2d31ce444b5e0010f } void MeshQuad::create_cube() { clear(); +<<<<<<< HEAD float s = 0.5 ; // ajouter 8 sommets (-1 +1) @@ -140,12 +213,34 @@ void MeshQuad::create_cube() add_quad(i8,i7,i6,i5); gl_update(); +======= + // ajouter 8 sommets (-1 +1) + int i1 = add_vertex(Vec3(-1,1,1)); + int i2 = add_vertex(Vec3(-1,-1,1)); + int i3 = add_vertex(Vec3(1,-1,1)); + int i4 = add_vertex(Vec3(1,1,1)); + int i5 = add_vertex(Vec3(-1,1,-1)); + int i6 = add_vertex(Vec3(-1,-1,-1)); + int i7 = add_vertex(Vec3(1,-1,-1)); + int i8 = add_vertex(Vec3(1,1,-1)); + + // ajouter 6 faces (sens trigo) + add_quad(i1,i2,i3,i4); + add_quad(i4,i3,i7,i8); + add_quad(i8,i7,i6,i5); + add_quad(i5,i6,i2,i1); + add_quad(i2,i6,i7,i3); + add_quad(i1,i4,i8,i5); + + gl_update(); +>>>>>>> 3eaf77e4b27a9ed06e64dda2d31ce444b5e0010f } Vec3 MeshQuad::normal_of(const Vec3& A, const Vec3& B, const Vec3& C) { // Attention a l'ordre des points ! // le produit vectoriel n'est pas commutatif U ^ V = - V ^ U +<<<<<<< HEAD // ne pas oublier de normaliser le resultat. Vec3 normal = glm::cross(B - A, C - A); @@ -159,6 +254,18 @@ float MeshQuad::quad_aire(int q) v2 = m_quad_indices.at(q+1); v3 = m_quad_indices.at(q+2); v4 = m_quad_indices.at(q+3); +======= + // ne pas oublier de normcaliser le resultat. + + Vec3 n, nA, nB, nC; + nA = glm::cross(B-A, C-A); + nB = glm::cross(A-B, C-B); + nC = glm::cross(B-C, A-C); + n = (nA + nB + nC); + n /= 3; + return glm::normalize(n); +} +>>>>>>> 3eaf77e4b27a9ed06e64dda2d31ce444b5e0010f Vec3 A, B, C, D; A = m_points.at(v1); @@ -181,6 +288,7 @@ float MeshQuad::quad_aire(int q) bool MeshQuad::is_points_in_quad(const Vec3& P, const Vec3& A, const Vec3& B, const Vec3& C, const Vec3& D) { // On sait que P est dans le plan du quad. +<<<<<<< HEAD // P est-il au dessus des 4 plans contenant chacun la normale au quad et une arete AB/BC/CD/DA ? // si oui il est dans le quad @@ -210,13 +318,30 @@ bool MeshQuad::is_points_in_quad(const Vec3& P, const Vec3& A, const Vec3& B, co n4 = glm::cross(n, DA); if (glm::dot(n4, P) - glm::dot(n4, D)< 0) return false; +======= + + // P est-il au dessus des 4 plans contenant chacun la normale au quad et une arete AB/BC/CD/DA ? + // si oui il est dans le quad + + Vec3 n1 = glm::cross(B-A,C-B) ; + Vec3 n2 = glm::cross(C-B,D-C) ; + Vec3 n3 = glm::cross(D-C,A-D) ; + Vec3 n4 = glm::cross(A-D,B-A) ; + + float som1 = P.x*n1.x + P.y*n1.y + P.z*n1.z ; //dot + float som2 = P.x*n2.x + P.y*n2.y + P.z*n2.z ; + float som3 = P.x*n3.x + P.y*n3.y + P.z*n3.z ; + float som4 = P.x*n4.x + P.y*n4.y + P.z*n4.z ; + + return som1 > 0 && som2 >0 && som3 > 0 && som4 > 0 ; +>>>>>>> 3eaf77e4b27a9ed06e64dda2d31ce444b5e0010f - return true; } bool MeshQuad::intersect_ray_quad(const Vec3& P, const Vec3& Dir, int q, Vec3& inter) { // recuperation des indices de points +<<<<<<< HEAD int i1, i2, i3, i4; i1 = m_quad_indices.at(q); i2 = m_quad_indices.at(q+1); @@ -244,6 +369,38 @@ bool MeshQuad::intersect_ray_quad(const Vec3& P, const Vec3& Dir, int q, Vec3& i // I dans le quad ? return is_points_in_quad(inter, A, B, C, D); } +======= + // recuperation des points + int i1,i2,i3,i4 ; + Vec3 p1,p2,p3,p4 ; + + i1 = m_quad_indices.at(q) ; + i2 = m_quad_indices.at(q+1) ; + i3 = m_quad_indices.at(q+2) ; + i4 = m_quad_indices.at(q+3) ; + + p1 = m_points.at(i1) ; + p2 = m_points.at(i2) ; + p3 = m_points.at(i3) ; + p4 = m_points.at(i4) ; + + + // calcul de l'equation du plan (N+d) + + Vec3 N = glm::cross(p2-p1,p3-p1) ; + float d = -N.x*p4.x - N.y*p4.y - N.z*p4.z ; + Vec3 D ; + // calcul de l'intersection rayon plan + // I = P + alpha*Dir est dans le plan => calcul de alpha + + float alpha = (d - glm::dot(N, P)) / glm::dot(P,Dir); + // alpha => calcul de I + + inter = P + alpha * Dir ; + // I dans le quad ? + return is_points_in_quad(inter,p1,p2,p3,p4) ; + } +>>>>>>> 3eaf77e4b27a9ed06e64dda2d31ce444b5e0010f int MeshQuad::intersected_closest(const Vec3& P, const Vec3& Dir) @@ -251,6 +408,7 @@ int MeshQuad::intersected_closest(const Vec3& P, const Vec3& Dir) // on parcours tous les quads // on teste si il y a intersection avec le rayon // on garde le plus proche (de P) +<<<<<<< HEAD int i,inter = -1 ; @@ -274,6 +432,26 @@ int MeshQuad::intersected_closest(const Vec3& P, const Vec3& Dir) return inter; +======= + + int i,inter = -1 ; + float min = MAX ; + Vec3 inters = Vec3() ; + + for (i = 0 ; i < m_quad_indices.size()/4 ; i+=4) + { + if(intersect_ray_quad(P,Dir,i,inters)) + { + if(glm::length(P-inters) < min) + { + inter = i ; + min = glm::length(P-inters) ; + } + } + } + + return inter; +>>>>>>> 3eaf77e4b27a9ed06e64dda2d31ce444b5e0010f } @@ -282,6 +460,7 @@ Mat4 MeshQuad::local_frame(int q) // Repere locale = Matrice de transfo avec // les trois premieres colones: X,Y,Z locaux // la derniere colonne l'origine du repere +<<<<<<< HEAD // ici Z = N et X = AB // Origine le centre de la face @@ -375,6 +554,61 @@ void MeshQuad::extrude_quad(int q) add_quad(i4, i1, v1, v4); add_quad(i2, i3, v3, v2); +======= + + // ici Z = N et X = AB + // Origine le centre de la face + // longueur des axes : [AB]/2 + + // recuperation des indices de points + // recuperation des points + + int i1,i2,i3,i4 ; + Vec3 A,B,C,D ; + + i1 = m_quad_indices.at(q) ; + i2 = m_quad_indices.at(q+1) ; + i3 = m_quad_indices.at(q+2) ; + i4 = m_quad_indices.at(q+3) ; + + A = m_points.at(i1) ; + B = m_points.at(i2) ; + C = m_points.at(i3) ; + D = m_points.at(i4) ; + + // calcul de Z:N / X:AB -> Y + + Vec3 Z = glm::cross(B-A,C-A) ; + Vec3 X = B - A ; + Vec3 Y = Z / X ; + + // calcul du centre + C = normal_of(X,Y,Z) ; + // calcul de la taille + + float t = glm::length(B-A) ; + // calcul de la matrice + + Mat4 transfo = Mat4(Vec4(X,t),Vec4(Y,t),Vec4(Z,t),Vec4(C,t)) ; + return transfo; +} + +void MeshQuad::extrude_quad(int q) +{ + // recuperation des indices de points + + // recuperation des points + + // calcul de la normale + + // calcul de la hauteur + + // calcul et ajout des 4 nouveaux points + + // on remplace le quad initial par le quad du dessu + + // on ajoute les 4 quads des cotes +>>>>>>> 3eaf77e4b27a9ed06e64dda2d31ce444b5e0010f gl_update(); } @@ -382,6 +616,7 @@ void MeshQuad::extrude_quad(int q) void MeshQuad::transfo_quad(int q, const glm::mat4& tr) { // recuperation des indices de points +<<<<<<< HEAD int i1, i2, i3, i4; i1 = m_quad_indices.at(q); i2 = m_quad_indices.at(q+1); @@ -413,6 +648,14 @@ void MeshQuad::transfo_quad(int q, const glm::mat4& tr) D = Vec3(transfo * Vec4(D, 1)); gl_update(); +======= + // recuperation des (references de) points + + // generation de la matrice de transfo globale: + // indice utilisation de glm::inverse() et de local_frame + + // Application au 4 points du quad +>>>>>>> 3eaf77e4b27a9ed06e64dda2d31ce444b5e0010f } void MeshQuad::decale_quad(int q, float d) diff --git a/TP_Geom3D_2018/Projet_modeling/meshquad.h b/TP_Geom3D_2018/Projet_modeling/meshquad.h index c1494dad0c4df7d1d282f6d9ec15faf9af8c1f4c..b49fcdd78671a0c0b50f22bfc291b667b70c6c81 100644 --- a/TP_Geom3D_2018/Projet_modeling/meshquad.h +++ b/TP_Geom3D_2018/Projet_modeling/meshquad.h @@ -1,4 +1,4 @@ -#ifndef MESHTRI_H + #ifndef MESHTRI_H #define MESHTRI_H #include <vector>