diff --git a/TP_Geom3D_2018/Projet_modeling/main.cpp b/TP_Geom3D_2018/Projet_modeling/main.cpp index 84ecee0c5ef25638f68c9913f6f6212d9fbe0b8c..b1abfadd622d8a5f67957ac021850421a200e2ea 100644 --- a/TP_Geom3D_2018/Projet_modeling/main.cpp +++ b/TP_Geom3D_2018/Projet_modeling/main.cpp @@ -19,16 +19,36 @@ const Vec3 NOIR = {0,0,0}; void draw_repere(const Primitives& prim, const Mat4& tr) { + prim.draw_sphere(tr, BLANC); + 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_cone(tr*translate(2,0,0)* rotateY(90), ROUGE); + prim.draw_cone(tr*translate(0,2,0)* rotateX(-90), VERT); + prim.draw_cone(tr*translate(0,0,2), BLEU); } void star(MeshQuad& m) { m.create_cube(); - // ... + float rot = 0 ; + for (int i = 0 ; i < 10 ; i++) + for (int j = 0 ; j < 6 ; j++){ + rot = 20 + 2*i ; + m.extrude_quad(j*4) ; + m.shrink_quad(j*4,0.8) ; + m.tourne_quad(j*4,rot) ; + + } + } +void spirale(MeshQuad& m) +{ +} @@ -58,12 +78,16 @@ int main(int argc, char *argv[]) mesh.set_matrices(viewer.getCurrentModelViewMatrix(),viewer.getCurrentProjectionMatrix()); prim.set_matrices(viewer.getCurrentModelViewMatrix(),viewer.getCurrentProjectionMatrix()); - mesh.draw(CYAN); + mesh.draw(CYAN); - if (selected_quad>=0) - draw_repere(prim,selected_frame); + if (selected_quad>=0) + { + //draw_repere(prim,selected_frame); + //std::cout << "selected is N° "<< selected_quad << std::endl; + } }; + Mat4 transfo =translate(0,1,0) ; // to do when key pressed viewer.f_keyPress = [&] (int key, Qt::KeyboardModifiers mod) { @@ -75,17 +99,44 @@ int main(int argc, char *argv[]) break; // e extrusion - // +/- decale + case Qt::Key_E: + if (!(mod & Qt::ControlModifier)) + if (selected_quad >=0 ) mesh.extrude_quad(selected_quad) ; + break; + + // +/- decale + case Qt::Key_Plus: + if (!(mod & Qt::ControlModifier)) + if (selected_quad >=0 ) mesh.decale_quad(selected_quad,1) ; + + break ; + + case Qt::Key_Minus: + if (!(mod & Qt::ControlModifier)) + if (selected_quad + >=0 ) mesh.decale_quad(selected_quad,-1) ; + break ; // z/Z shrink + case Qt::Key_Z: + if (!(mod & Qt::ControlModifier)) + if (selected_quad >=0 ) mesh.shrink_quad(selected_quad,0.5) ; + break ; // t/T tourne - + case Qt::Key_T: + if (!(mod & Qt::ControlModifier)) + if (selected_quad >=0 ) mesh.tourne_quad(selected_quad,1) ; + break ; // Attention au cas m_selected_quad == -1 // generation d'objet case Qt::Key_S: star(mesh); break; - // .... + + case Qt::Key_P: + spirale(mesh) ; + break; + // .... default: @@ -107,7 +158,7 @@ int main(int argc, char *argv[]) selected_quad = mesh.intersected_closest(P,Dir); if (selected_quad>=0) selected_frame = mesh.local_frame(selected_quad); - std::cout << selected_quad << std::endl; + //std::cout << selected_quad << std::endl; }; viewer.clearShortcuts(); diff --git a/TP_Geom3D_2018/Projet_modeling/meshquad.cpp b/TP_Geom3D_2018/Projet_modeling/meshquad.cpp index 3d57c403aa4b1c6e0ff9405c18e1cd062cf1d66f..449640595f6be4eaf38125cd9d5df9f9812ff535 100644 --- a/TP_Geom3D_2018/Projet_modeling/meshquad.cpp +++ b/TP_Geom3D_2018/Projet_modeling/meshquad.cpp @@ -1,276 +1,421 @@ #include "meshquad.h" #include "matrices.h" +#include <iostream> +#include <vector> +#include <algorithm> -using namespace std ; +using namespace std; void MeshQuad::clear() { - this->m_points.clear() ; - this->m_quad_indices.clear() ; - this->m_nb_ind_edges = 0 ; + m_points.clear(); + m_quad_indices.clear(); + m_nb_ind_edges = 0; } -int MeshQuad::add_vertex(const Vec3& P){ - - this->m_points.push_back(P) ; - return this->m_points.size() -1 ; +int MeshQuad::add_vertex(const Vec3& P) +{ + m_points.push_back(P); + return m_points.size() - 1; } void MeshQuad::add_quad(int i1, int i2, int i3, int i4) { - this->m_quad_indices.push_back(i1) ; - this->m_quad_indices.push_back(i2) ; - this->m_quad_indices.push_back(i3) ; - this->m_quad_indices.push_back(i4) ; - - this->m_nb_ind_edges +=4 ; - + m_quad_indices.push_back(i1); + m_quad_indices.push_back(i2); + m_quad_indices.push_back(i3); + m_quad_indices.push_back(i4); + m_nb_ind_edges += 4; } void MeshQuad::convert_quads_to_tris(const std::vector<int>& quads, std::vector<int>& tris) { - tris.clear(); - tris.reserve(3*quads.size()/2); - - // Pour chaque quad on genere 2 triangles - // Attention a repecter l'orientation des triangles - - 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 ; + tris.clear(); + tris.reserve(3*quads.size()/2); + + // Pour chaque quad on genere 2 triangles + // Attention a repecter l'orientation des triangles + for (size_t i=0; i<quads.size(); i+=4) { + int v1 = quads.at(i); + int v2 = quads.at(i+1); + int v3 = quads.at(i+2); + int v4 = quads.at(i+3); + + tris.push_back(v1); + tris.push_back(v2); + tris.push_back(v3); + tris.push_back(v3); + tris.push_back(v4); + tris.push_back(v1); } - - } void MeshQuad::convert_quads_to_edges(const std::vector<int>& quads, std::vector<int>& edges) { - edges.clear(); - edges.reserve(quads.size()); // ( *2 /2 !) - // 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 ? - - - int index = 0 ; - unsigned int i ; - - for( i = 0 ; i < quads.size()/4 ; i++) - { - if (i == 0 ) - { - edges.push_back(quads[index]) ; - edges.push_back(quads[index+1]) ; + edges.clear(); + edges.reserve(quads.size()); // ( *2 /2 !) + // 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 ? + size_t i, max_quads = quads.size(); + for (i = 0; i < max_quads; i+=4) { + int i1 = quads.at(i); + int i2 = quads.at(i+1); + int i3 = quads.at(i+2); + int i4 = quads.at(i+3); + + if (i1 < i2) { + edges.push_back(i1); + edges.push_back(i2); } - edges.push_back(quads[index+1]) ; - edges.push_back(quads[index+2]) ; - edges.push_back(quads[index+2]) ; - edges.push_back(quads[index+3]) ; - edges.push_back(quads[index+3]) ; - edges.push_back(quads[index]) ; - - - index += 4 ; - } - + 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); + } + } } void MeshQuad::bounding_sphere(Vec3& C, float& R) { - // C= - // R= + size_t i; + for (i = 0; i < m_points.size(); i++) { + C += m_points.at(i); + } + C /= m_points.size(); + float max = glm::length(m_points.at(0) - C); + for (i = 1; i < m_points.size(); i++) { + float tmp = glm::length(m_points.at(i) - C); + if (tmp > max) { + max = tmp; + } + } + R = max; } void MeshQuad::create_cube() { clear(); - - // ajouter 8 sommets (-1 +1) - Vec3 p0, p1, p2, p3, p4, p5, p6, p7, p8; - - p0= Vec3(-0.5,-0.5,+0.5) ; // P0 - p1= Vec3(0.5,-0.5,+0.5); // P1 - p2= Vec3(0.5,+0.5,+0.5); // P2 - p3= Vec3(-0.5,+0.5,+0.5); // P3 - p4= Vec3(-0.5,-0.5,-0.5); // P4 - p5= Vec3(0.5,-0.5,-0.5); // P5 - p6= Vec3(0.5,+0.5,-0.5); // P6 - p7= Vec3(-0.5,+0.5,-0.5); // P7 - - - int i0, i1, i2, i3, i4, i5, i6, i7; - - i0 = add_vertex(p0); - i1 = add_vertex(p1); - i2 = add_vertex(p2); - i3 = add_vertex(p3); - i4 = add_vertex(p4); - i5 = add_vertex(p5); - i6 = add_vertex(p6); - i7 = add_vertex(p7); + // ajouter 8 sommets (-0.5 +0.5) + int i1 = add_vertex(Vec3(-0.35,0.35,0.35)); + int i2 = add_vertex(Vec3(-0.35,-0.35,0.35)); + int i3 = add_vertex(Vec3(0.35,-0.35,0.35)); + int i4 = add_vertex(Vec3(0.35,0.35,0.35)); + int i5 = add_vertex(Vec3(-0.35,0.35,-0.35)); + int i6 = add_vertex(Vec3(-0.35,-0.35,-0.35)); + int i7 = add_vertex(Vec3(0.35,-0.35,-0.35)); + int i8 = add_vertex(Vec3(0.35,0.35,-0.35)); // ajouter 6 faces (sens trigo) - add_quad(i1, i2, i3, i0); - add_quad(i3, i2, i6, i7); - add_quad(i1, i2, i6, i5); - add_quad(i0, i3, i7, i4); - add_quad(i5, i6, i7, i4); - add_quad(i1, i5, i4, i0); + 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(); } 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 - // ne pas oublier de normaliser le resultat. - - Vec3 AB = Vec3(B[0]-A[0],B[1]-A[1],B[2]-A[2]) ; - Vec3 BC = Vec3(C[0]-B[0],C[1]-B[1],C[2]-B[2]) ; - - float x = AB[1]*BC[2] - AB[1]*BC[2] ; - float y = AB[1]*BC[2] - AB[1]*BC[2] ; - float z = AB[1]*BC[2] - AB[1]*BC[2]; - - Vec3 N = Vec3(x,y,z) ; - float norme = sqrt(x*x+y*y+z*z) ; - - return N/norme; + // Attention a l'ordre des points ! + // le produit vectoriel n'est pas commutatif U ^ V = - V ^ U + // ne pas oublier de normaliser le resultat. + //Produit vectoriel(Vec(AB),Vec(BC)) + Vec3 AB, AC, total, n; + AB = B - A; + AC = C - A; + total = glm::cross(AB, AC); + n = glm::normalize(total); + return n; } - -float MeshQuad::calcul_aire(Vec3 p1,Vec3 p2,Vec3 p3,Vec3 p4) +float MeshQuad::calcul_aire(int q) { - float seg1=0.,seg2=0. ; - - seg1 = sqrt(pow(p2[0]-p1[0],2)+pow(p2[1]-p1[1],2)+pow(p2[2]-p1[2],2)) ; - seg2 = sqrt(pow(p3[0]-p2[0],2)+pow(p3[1]-p2[1],2)+pow(p3[2]-p2[2],2)) ; - - return seg1 * seg2 ; - + int v1, v2, v3, v4; + v1 = m_quad_indices.at(q); + v2 = m_quad_indices.at(q+1); + v3 = m_quad_indices.at(q+2); + v4 = m_quad_indices.at(q+3); + + Vec3 A, B, C, D; + A = m_points.at(v1); + B = m_points.at(v2); + C = m_points.at(v3); + D = m_points.at(v4); + + float triAire1, triAire2, aire; + //Aire triangle ABC et Aire triangle ACD + triAire1 = glm::length(glm::cross(B - A, C - A)); + triAire2 = glm::length(glm::cross(C - A, D - A)); + //L'aire du quad est la somme des 2 aires + aire = triAire1 + triAire2; + return aire; } + 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. + // On sait que P est dans le plan du quad. + // 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 + float res = -1, d = 0; + Vec3 n1, n2, n3, n4, n, AB, BC, CD, DA; + n = normal_of(A, B, C); + AB = B - A; + BC = C - B; + CD = D - C; + DA = A - D; + + //Plan AB + n1 = glm::cross(n, AB); + d = glm::dot(n1, A); + res = glm::dot(n1, P) - d; + if (res < 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 + //Plan BC + n2 = glm::cross(n, BC); + d = glm::dot(n2, B); + res = glm::dot(n2, P) - d; + if (res < 0) { + return false; + } + //Plan CD + n3 = glm::cross(n, CD); + d = glm::dot(n3, C); + res = glm::dot(n3, P) - d; + if (res < 0) { + return false; + } + + //Plan DA + n4 = glm::cross(n, DA); + d = glm::dot(n4, D); + res = glm::dot(n4, P) - d; + if (res < 0) { + return false; + } return true; } bool MeshQuad::intersect_ray_quad(const Vec3& P, const Vec3& Dir, int q, Vec3& inter) { - // recuperation des indices de points - // recuperation des points - - // calcul de l'equation du plan (N+d) + // recuperation des indices de points + int i1, i2, i3, i4; + 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); + // recuperation des points + Vec3 A, B, C, D; + A = m_points.at(i1); + B = m_points.at(i2); + C = m_points.at(i3); + D = m_points.at(i4); + // calcul de l'equation du plan (N+d) + Vec3 n = normal_of(A, B, C); + float d = glm::dot(n, A); //Produit scalaire normal et p1 pour trouver d // calcul de l'intersection rayon plan - // I = P + alpha*Dir est dans le plan => calcul de alpha - - // alpha => calcul de I - - // I dans le quad ? - - return false; + float alpha = (d - glm::dot(n, P)) / glm::dot(n, Dir); + // I = P + alpha*Dir est dans le plan => calcul de alpha + // alpha => calcul de I + inter = P + alpha*Dir; + // I dans le quad ? + return is_points_in_quad(inter, A, B, C, D); } 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) - - int inter = -1; - - return inter; + // on parcours tous les quads + // on teste si il y a intersection avec le rayon + // on garde le plus proche (de P) + int inter = -1; + Vec3 intersection = Vec3(); + bool first = true; + float temp; + int i; + int max_quads = static_cast<int>(m_quad_indices.size()); + for (i = 0; i < max_quads; i+=4) { + if (intersect_ray_quad(P, Dir, i, intersection)) { + if (first) { + temp = glm::length(P - intersection); + inter = i; + first = false; + } + else { + float test = glm::length(P - intersection); + if (test < temp) { + inter = i; + temp = test; + } + } + } + } + return inter; } 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 - - // 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 - - // calcul de Z:N / X:AB -> Y + // Repere locale = Matrice de transfo avec + // les trois premieres colones: X,Y,Z locaux + // la derniere colonne l'origine du repere + + // ici Z = N et X = AB + // Origine le centre de la face + // longueur des axes : [AB]/2 + + // recuperation des indices de points + int i1, i2, i3, i4; + 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); + + // recuperation des points + Vec3 A, B, C, D, AB, AC; + A = m_points.at(i1); + B = m_points.at(i2); + C = m_points.at(i3); + D = m_points.at(i4); + AB = B - A; + AC = C - A; + + // calcul de Z:N / X:AB -> Y + Vec3 X, Y, Z, nTri1, nTri2; + nTri1 = normal_of(A, B, C); + nTri2 = normal_of(A, C, D); + Z = glm::normalize((nTri1+nTri2)/2.0f); + X = glm::normalize(glm::cross(A - B, Z)); + Y = glm::normalize(glm::cross(X, Z)); + + // calcul du centre + Vec3 center = (A + B + C + D)/4.0f; + + // calcul de la taille + float taille = glm::length(AB)/2; + + // calcul de la matrice + Mat4 res = Mat4(Vec4(X, 0), Vec4(Y, 0), Vec4(Z, 0), Vec4(center, 1)); + res *= scale(taille); + return res; - // calcul du centre - - // calcul de la taille - - // calcul de la matrice - - return Mat4(); } 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 - - gl_update(); + // recuperation des indices de points + int i1, i2, i3, i4; + 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); + + // recuperation des points + Vec3 A, B, C, D, AB, AC; + A = m_points.at(i1); + B = m_points.at(i2); + C = m_points.at(i3); + D = m_points.at(i4); + AB = B - A; + AC = C - A; + // calcul de la normale + Vec3 n = normal_of(A, B, C); + // calcul de la hauteur + float longueur = sqrt(calcul_aire(q)); + // calcul et ajout des 4 nouveaux points + Vec3 p1, p2, p3, p4; + int v1, v2, v3, v4; + p1 = A + n * longueur; + p2 = B + n * longueur; + p3 = C + n * longueur; + p4 = D + n * longueur; + v1 = add_vertex(p1); + v2 = add_vertex(p2); + v3 = add_vertex(p3); + v4 = add_vertex(p4); + // on remplace le quad initial par le quad du dessu + m_quad_indices.at(q) = v1; + m_quad_indices.at(q+1) = v2; + m_quad_indices.at(q+2) = v3; + m_quad_indices.at(q+3) = v4; + // on ajoute les 4 quads des cotes + add_quad(i1, i2, v2, v1); + add_quad(i2, i3, v3, v2); + add_quad(i3, i4, v4, v3); + add_quad(i4, i1, v1, v4); + gl_update(); } void MeshQuad::transfo_quad(int q, const glm::mat4& tr) { - // recuperation des indices de points - // 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 + // recuperation des indices de points + int i1, i2, i3, i4; + 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); + + // recuperation des (references de) points + Vec3& A = m_points.at(i1); + Vec3& B = m_points.at(i2); + Vec3& C = m_points.at(i3); + Vec3& D = m_points.at(i4); + + + // generation de la matrice de transfo globale: + // indice utilisation de glm::inverse() et de local_frame + Mat4 pos = local_frame(q); + + float det = glm::determinant(pos); + if (det == 0) { + return; + } + Mat4 transfo = pos * tr * glm::inverse(pos); + // Application au 4 points du quad + Vec4 A_prime, B_prime, C_prime, D_prime; + A = Vec3(transfo * Vec4(A, 1)); + B = Vec3(transfo * Vec4(B, 1)); + C = Vec3(transfo * Vec4(C, 1)); + D = Vec3(transfo * Vec4(D, 1)); + gl_update(); } void MeshQuad::decale_quad(int q, float d) { - + Mat4 transfo = translate(0, 0, d); + transfo_quad(q, transfo); + gl_update(); } void MeshQuad::shrink_quad(int q, float s) { - + Mat4 transfo = scale(s); + transfo_quad(q, transfo); + gl_update(); } void MeshQuad::tourne_quad(int q, float a) { - + Mat4 transfo = rotateZ(a) ; + transfo_quad(q, transfo); + gl_update(); } @@ -278,99 +423,99 @@ void MeshQuad::tourne_quad(int q, float a) MeshQuad::MeshQuad(): - m_nb_ind_edges(0) + m_nb_ind_edges(0) {} void MeshQuad::gl_init() { - m_shader_flat = new ShaderProgramFlat(); - m_shader_color = new ShaderProgramColor(); - - //VBO - glGenBuffers(1, &m_vbo); - - //VAO - glGenVertexArrays(1, &m_vao); - glBindVertexArray(m_vao); - glBindBuffer(GL_ARRAY_BUFFER, m_vbo); - glEnableVertexAttribArray(m_shader_flat->idOfVertexAttribute); - glVertexAttribPointer(m_shader_flat->idOfVertexAttribute, 3, GL_FLOAT, GL_FALSE, 0, 0); - glBindVertexArray(0); - - glGenVertexArrays(1, &m_vao2); - glBindVertexArray(m_vao2); - glBindBuffer(GL_ARRAY_BUFFER, m_vbo); - glEnableVertexAttribArray(m_shader_color->idOfVertexAttribute); - glVertexAttribPointer(m_shader_color->idOfVertexAttribute, 3, GL_FLOAT, GL_FALSE, 0, 0); - glBindVertexArray(0); - - //EBO indices - glGenBuffers(1, &m_ebo); - glGenBuffers(1, &m_ebo2); + m_shader_flat = new ShaderProgramFlat(); + m_shader_color = new ShaderProgramColor(); + + //VBO + glGenBuffers(1, &m_vbo); + + //VAO + glGenVertexArrays(1, &m_vao); + glBindVertexArray(m_vao); + glBindBuffer(GL_ARRAY_BUFFER, m_vbo); + glEnableVertexAttribArray(m_shader_flat->idOfVertexAttribute); + glVertexAttribPointer(m_shader_flat->idOfVertexAttribute, 3, GL_FLOAT, GL_FALSE, 0, 0); + glBindVertexArray(0); + + glGenVertexArrays(1, &m_vao2); + glBindVertexArray(m_vao2); + glBindBuffer(GL_ARRAY_BUFFER, m_vbo); + glEnableVertexAttribArray(m_shader_color->idOfVertexAttribute); + glVertexAttribPointer(m_shader_color->idOfVertexAttribute, 3, GL_FLOAT, GL_FALSE, 0, 0); + glBindVertexArray(0); + + //EBO indices + glGenBuffers(1, &m_ebo); + glGenBuffers(1, &m_ebo2); } void MeshQuad::gl_update() { - //VBO - glBindBuffer(GL_ARRAY_BUFFER, m_vbo); - glBufferData(GL_ARRAY_BUFFER, 3 * m_points.size() * sizeof(GLfloat), &(m_points[0][0]), GL_STATIC_DRAW); - glBindBuffer(GL_ARRAY_BUFFER, 0); - - std::vector<int> tri_indices; - convert_quads_to_tris(m_quad_indices,tri_indices); - - //EBO indices - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ebo); - glBufferData(GL_ELEMENT_ARRAY_BUFFER,tri_indices.size() * sizeof(int), &(tri_indices[0]), GL_STATIC_DRAW); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); - - std::vector<int> edge_indices; - convert_quads_to_edges(m_quad_indices,edge_indices); - m_nb_ind_edges = edge_indices.size(); - - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ebo2); - glBufferData(GL_ELEMENT_ARRAY_BUFFER,m_nb_ind_edges * sizeof(int), &(edge_indices[0]), GL_STATIC_DRAW); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); + //VBO + glBindBuffer(GL_ARRAY_BUFFER, m_vbo); + glBufferData(GL_ARRAY_BUFFER, 3 * m_points.size() * sizeof(GLfloat), &(m_points[0][0]), GL_STATIC_DRAW); + glBindBuffer(GL_ARRAY_BUFFER, 0); + + std::vector<int> tri_indices; + convert_quads_to_tris(m_quad_indices,tri_indices); + + //EBO indices + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ebo); + glBufferData(GL_ELEMENT_ARRAY_BUFFER,tri_indices.size() * sizeof(int), &(tri_indices[0]), GL_STATIC_DRAW); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); + + std::vector<int> edge_indices; + convert_quads_to_edges(m_quad_indices,edge_indices); + m_nb_ind_edges = edge_indices.size(); + + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ebo2); + glBufferData(GL_ELEMENT_ARRAY_BUFFER,m_nb_ind_edges * sizeof(int), &(edge_indices[0]), GL_STATIC_DRAW); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); } void MeshQuad::set_matrices(const Mat4& view, const Mat4& projection) { - viewMatrix = view; - projectionMatrix = projection; + viewMatrix = view; + projectionMatrix = projection; } void MeshQuad::draw(const Vec3& color) { - glEnable(GL_CULL_FACE); - glEnable(GL_POLYGON_OFFSET_FILL); - glPolygonOffset(1.0f, 1.0f); - - m_shader_flat->startUseProgram(); - m_shader_flat->sendViewMatrix(viewMatrix); - m_shader_flat->sendProjectionMatrix(projectionMatrix); - glUniform3fv(m_shader_flat->idOfColorUniform, 1, glm::value_ptr(color)); - glBindVertexArray(m_vao); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,m_ebo); - glDrawElements(GL_TRIANGLES, 3*m_quad_indices.size()/2,GL_UNSIGNED_INT,0); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0); - glBindVertexArray(0); - m_shader_flat->stopUseProgram(); - - glDisable(GL_POLYGON_OFFSET_FILL); - - m_shader_color->startUseProgram(); - m_shader_color->sendViewMatrix(viewMatrix); - m_shader_color->sendProjectionMatrix(projectionMatrix); - glUniform3f(m_shader_color->idOfColorUniform, 0.0f,0.0f,0.0f); - glBindVertexArray(m_vao2); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,m_ebo2); - glDrawElements(GL_LINES, m_nb_ind_edges,GL_UNSIGNED_INT,0); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0); - glBindVertexArray(0); - m_shader_color->stopUseProgram(); - glDisable(GL_CULL_FACE); + glEnable(GL_CULL_FACE); + glEnable(GL_POLYGON_OFFSET_FILL); + glPolygonOffset(1.0f, 1.0f); + + m_shader_flat->startUseProgram(); + m_shader_flat->sendViewMatrix(viewMatrix); + m_shader_flat->sendProjectionMatrix(projectionMatrix); + glUniform3fv(m_shader_flat->idOfColorUniform, 1, glm::value_ptr(color)); + glBindVertexArray(m_vao); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,m_ebo); + glDrawElements(GL_TRIANGLES, 3*m_quad_indices.size()/2,GL_UNSIGNED_INT,0); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0); + glBindVertexArray(0); + m_shader_flat->stopUseProgram(); + + glDisable(GL_POLYGON_OFFSET_FILL); + + m_shader_color->startUseProgram(); + m_shader_color->sendViewMatrix(viewMatrix); + m_shader_color->sendProjectionMatrix(projectionMatrix); + glUniform3f(m_shader_color->idOfColorUniform, 0.0f,0.0f,0.0f); + glBindVertexArray(m_vao2); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,m_ebo2); + glDrawElements(GL_LINES, m_nb_ind_edges,GL_UNSIGNED_INT,0); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0); + glBindVertexArray(0); + m_shader_color->stopUseProgram(); + glDisable(GL_CULL_FACE); } diff --git a/TP_Geom3D_2018/Projet_modeling/meshquad.h b/TP_Geom3D_2018/Projet_modeling/meshquad.h index e550906ca08762472afef8c820f3289ee39b66a9..20943fceb174fbb0b285fcf707c544cca8ae9601 100644 --- a/TP_Geom3D_2018/Projet_modeling/meshquad.h +++ b/TP_Geom3D_2018/Projet_modeling/meshquad.h @@ -29,7 +29,9 @@ public: */ void clear(); - /** + float triAire(const Vec3& P, const Vec3& A, const Vec3& B) ; + float calcul_aire(int q) ; +/** * @brief ajoute un sommet * @param P sommet * @return l'indice du sommet @@ -89,7 +91,7 @@ public: * @return l'aire du quad */ - float calcul_aire(Vec3 p1,Vec3 p2,Vec3 p3,Vec3 p4); + //float calcul_aire(Vec3 p1,Vec3 p2,Vec3 p3,Vec3 p4); /** * @brief Determine si P est dans le quad A,B,C,D (P considéré ~ dans le plan ABCD) diff --git a/TP_Geom3D_2018/Transfos/main.cpp b/TP_Geom3D_2018/Transfos/main.cpp index a5fd6cfbe8458fa2c39d02720166531b8c70f53e..6e1ec5b707e9b2d4161ec54604f81f6d792306f5 100644 --- a/TP_Geom3D_2018/Transfos/main.cpp +++ b/TP_Geom3D_2018/Transfos/main.cpp @@ -105,16 +105,16 @@ int main(int argc, char *argv[]) prim.draw_cylinder(translate(0,0,2), BLEU);*/ - /*draw_repere(m2) ; - for (int i = 0 ; i< 10 ; i++) + draw_repere(m2) ; + /* for (int i = 0 ; i< 10 ; i++) { draw_repere(m2*rotateY(45*i)*translate(10,0,0)*scale(0.5)*m2*rotateY(-90)); - }*/ + } prim.draw_cube(translate(0,1,0)*scale(5,1,10),BLANC); for (int i = 1 ; i< 4 ; i++){ articulations(translate(0,0,2*i)* rotateX(130)); - } + }*/ }; diff --git a/TP_Geom3D_2018/bin/proj_model.exe b/TP_Geom3D_2018/bin/proj_model.exe index 35f19c72abde1f867efeb1af14e7df9368cf0725..7185bce1b5d402675a4fe23fada2694ba8843058 100644 Binary files a/TP_Geom3D_2018/bin/proj_model.exe and b/TP_Geom3D_2018/bin/proj_model.exe differ diff --git a/TP_Geom3D_2018/bin/proj_model.ilk b/TP_Geom3D_2018/bin/proj_model.ilk index 11a1997837da16cbd2ded29f8e6273c478b164e9..911f7b4df0a72ae7716e96ddce6edb0bf2ce3f4a 100644 Binary files a/TP_Geom3D_2018/bin/proj_model.ilk and b/TP_Geom3D_2018/bin/proj_model.ilk differ diff --git a/TP_Geom3D_2018/bin/proj_model.pdb b/TP_Geom3D_2018/bin/proj_model.pdb index 73cde45d83d04400e42a3ae1f9ee244626a280ac..e5bf9da95bbd5ab05b0635c3d3ea4897f82ede7f 100644 Binary files a/TP_Geom3D_2018/bin/proj_model.pdb and b/TP_Geom3D_2018/bin/proj_model.pdb differ diff --git a/TP_Geom3D_2018/bin/tp_transfos.exe b/TP_Geom3D_2018/bin/tp_transfos.exe index 621f249c951826f6883638a6dab694e118adf397..b388ac9d1b72b6fe316dd9577a990f891fc17ca4 100644 Binary files a/TP_Geom3D_2018/bin/tp_transfos.exe and b/TP_Geom3D_2018/bin/tp_transfos.exe differ diff --git a/TP_Geom3D_2018/bin/tp_transfos.ilk b/TP_Geom3D_2018/bin/tp_transfos.ilk index b34fb86320da534651248bc5e0240a42fc81c30f..fb97aa6ca6eb327ff0375b0b5b27d3d4603390b1 100644 Binary files a/TP_Geom3D_2018/bin/tp_transfos.ilk and b/TP_Geom3D_2018/bin/tp_transfos.ilk differ diff --git a/TP_Geom3D_2018/bin/tp_transfos.pdb b/TP_Geom3D_2018/bin/tp_transfos.pdb index 3614ab508cb9bdaecfe451338fd1514435237fe6..76501bb6a8d3fd4647c4731854294d05cd912d7a 100644 Binary files a/TP_Geom3D_2018/bin/tp_transfos.pdb and b/TP_Geom3D_2018/bin/tp_transfos.pdb differ diff --git a/TP_Geom3D_2018/geom3D.pro.user b/TP_Geom3D_2018/geom3D.pro.user index d4de96d76c34e96c82489b88c9e8024dfe39500f..ddceba7f6bcdac6e3126c08ece2f4926c155f9de 100644 --- a/TP_Geom3D_2018/geom3D.pro.user +++ b/TP_Geom3D_2018/geom3D.pro.user @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE QtCreatorProject> -<!-- Written by QtCreator 4.11.1, 2020-03-13T12:42:16. --> +<!-- Written by QtCreator 4.11.1, 2020-03-17T00:37:07. --> <qtcreator> <data> <variable>EnvironmentId</variable> diff --git a/build-geom3D-Desktop_Qt_5_14_1_MSVC2017_32bit-Debug/Projet_modeling/debug/main.obj b/build-geom3D-Desktop_Qt_5_14_1_MSVC2017_32bit-Debug/Projet_modeling/debug/main.obj index 03bbaca7132be9e452fa10b0a7b24a3893368ba6..0140e409764d7fb98b34bd669a727595c14428cd 100644 Binary files a/build-geom3D-Desktop_Qt_5_14_1_MSVC2017_32bit-Debug/Projet_modeling/debug/main.obj and b/build-geom3D-Desktop_Qt_5_14_1_MSVC2017_32bit-Debug/Projet_modeling/debug/main.obj differ diff --git a/build-geom3D-Desktop_Qt_5_14_1_MSVC2017_32bit-Debug/Projet_modeling/debug/meshquad.obj b/build-geom3D-Desktop_Qt_5_14_1_MSVC2017_32bit-Debug/Projet_modeling/debug/meshquad.obj index 5cabb604744811fa7d02429fc7ea2df03407e033..e2e24ec4cfe52c531d7bc732f29138725c9d577d 100644 Binary files a/build-geom3D-Desktop_Qt_5_14_1_MSVC2017_32bit-Debug/Projet_modeling/debug/meshquad.obj and b/build-geom3D-Desktop_Qt_5_14_1_MSVC2017_32bit-Debug/Projet_modeling/debug/meshquad.obj differ diff --git a/build-geom3D-Desktop_Qt_5_14_1_MSVC2017_32bit-Debug/Projet_modeling/debug/primitives.obj b/build-geom3D-Desktop_Qt_5_14_1_MSVC2017_32bit-Debug/Projet_modeling/debug/primitives.obj index b0e7adbaea66116a3ab1a272bea13f1ddb023aab..a2ac973988516b8bd606eaa7d8016debe8a1f700 100644 Binary files a/build-geom3D-Desktop_Qt_5_14_1_MSVC2017_32bit-Debug/Projet_modeling/debug/primitives.obj and b/build-geom3D-Desktop_Qt_5_14_1_MSVC2017_32bit-Debug/Projet_modeling/debug/primitives.obj differ diff --git a/build-geom3D-Desktop_Qt_5_14_1_MSVC2017_32bit-Debug/Projet_modeling/debug/proj_model.vc.pdb b/build-geom3D-Desktop_Qt_5_14_1_MSVC2017_32bit-Debug/Projet_modeling/debug/proj_model.vc.pdb index 1ab1b11e3af0ef15362e24e1f66392683346b029..7994324ade10a3efec18c4ec27a30c5e0f9ded5f 100644 Binary files a/build-geom3D-Desktop_Qt_5_14_1_MSVC2017_32bit-Debug/Projet_modeling/debug/proj_model.vc.pdb and b/build-geom3D-Desktop_Qt_5_14_1_MSVC2017_32bit-Debug/Projet_modeling/debug/proj_model.vc.pdb differ diff --git a/build-geom3D-Desktop_Qt_5_14_1_MSVC2017_32bit-Debug/Transfos/debug/main.obj b/build-geom3D-Desktop_Qt_5_14_1_MSVC2017_32bit-Debug/Transfos/debug/main.obj index 45d2f9e057d2d4609d50ad632fa7928d565772f5..92c658773818aee8a9cb4f1b0792de274dcc5bd3 100644 Binary files a/build-geom3D-Desktop_Qt_5_14_1_MSVC2017_32bit-Debug/Transfos/debug/main.obj and b/build-geom3D-Desktop_Qt_5_14_1_MSVC2017_32bit-Debug/Transfos/debug/main.obj differ diff --git a/build-geom3D-Desktop_Qt_5_14_1_MSVC2017_32bit-Debug/Transfos/debug/tp_transfos.vc.pdb b/build-geom3D-Desktop_Qt_5_14_1_MSVC2017_32bit-Debug/Transfos/debug/tp_transfos.vc.pdb index eccf86a95ba62dc2c3bcba6196a51ac325b9a9f7..12bbb121b0f2082cc699bc1d010ed1e81d8aeade 100644 Binary files a/build-geom3D-Desktop_Qt_5_14_1_MSVC2017_32bit-Debug/Transfos/debug/tp_transfos.vc.pdb and b/build-geom3D-Desktop_Qt_5_14_1_MSVC2017_32bit-Debug/Transfos/debug/tp_transfos.vc.pdb differ