// piramide ///////////////////////////////////////////// // /\. // / |\/. // / | \/ . // / | \/./ // /____|___\/ Model_Pyramid::Model_Pyramid(float size) { // Vertices vertices.push_back(_vertex3f(-size, -size, size)); vertices.push_back(_vertex3f(size, -size, size)); vertices.push_back(_vertex3f(size, size, size)); vertices.push_back(_vertex3f(-size, size, size)); vertices.push_back(_vertex3f(0, 0, size*3)); // punta de la piramide // Caras caras.push_back(_vertex3i(1, 0, 3)); caras.push_back(_vertex3i(1, 3, 2)); caras.push_back(_vertex3i(0, 1, 4)); caras.push_back(_vertex3i(0, 4, 3)); caras.push_back(_vertex3i(3, 4, 2)); caras.push_back(_vertex3i(1, 2, 4)); }
// piramide ///////////////////////////////////////////// // /\. // / |\/. // / | \/ . // / | \/./ // /____|___\/ Model_Pyramid::Model_Pyramid(float size) { vector<_vertex3f> vertices; vector<_vertex3i> caras; // Vertices vertices.push_back(_vertex3f(-size, -size, size)); vertices.push_back(_vertex3f(size, -size, size)); vertices.push_back(_vertex3f(size, size, size)); vertices.push_back(_vertex3f(-size, size, size)); vertices.push_back(_vertex3f(0, 0, size*3)); // punta de la piramide // Caras caras.push_back(_vertex3i(1, 0, 3)); caras.push_back(_vertex3i(1, 3, 2)); caras.push_back(_vertex3i(0, 1, 4)); caras.push_back(_vertex3i(0, 4, 3)); caras.push_back(_vertex3i(3, 4, 2)); caras.push_back(_vertex3i(1, 2, 4)); setVertices(vertices); setFaces(caras); }
// cubo ////////////////////////////////////////////////////////////// // v6----- v5 // /| /| // v1------v0| // | | | | // | |v7---|-|v4 // |/ |/ // v2------v3 Model_Cube::Model_Cube(float size) { setColor(0,1,0,1); vector<_vertex3f> vertices; vector<_vertex3i> caras; // Vertices vertices.push_back(_vertex3f(-size, -size, size)); vertices.push_back(_vertex3f(size, -size, size)); vertices.push_back(_vertex3f(size, size, size)); vertices.push_back(_vertex3f(-size, size, size)); vertices.push_back(_vertex3f(-size, -size, -size)); vertices.push_back(_vertex3f(size, -size, -size)); vertices.push_back(_vertex3f(size, size, -size)); vertices.push_back(_vertex3f(-size, size, -size)); // Caras caras.push_back(_vertex3i(0, 1, 4)); caras.push_back(_vertex3i(1, 5, 4)); caras.push_back(_vertex3i(1, 2, 5)); caras.push_back(_vertex3i(2, 6, 5)); caras.push_back(_vertex3i(2, 3, 6)); caras.push_back(_vertex3i(3, 7, 6)); caras.push_back(_vertex3i(3, 0, 7)); caras.push_back(_vertex3i(0, 4, 7)); caras.push_back(_vertex3i(4, 5, 7)); caras.push_back(_vertex3i(5, 6, 7)); caras.push_back(_vertex3i(3, 2, 0)); caras.push_back(_vertex3i(2, 1, 0)); setVertices(vertices); setFaces(caras); }
void Model_Revolution::generarPorPerfil(vector<_vertex3f> perfil, int steps) { double angle; vector<_vertex3i> caras; vector<_vertex3f> vertices(perfil); angle = (2.0*M_PI) / steps; // Generamos la parte principal for (int step = 0; step < steps; step++) { vector<_vertex3f> siguientePerfil(perfil.size()); // Generamos los puntos rodaso for (unsigned int k = 0; k < perfil.size(); k++) siguientePerfil[k] = rotateY(perfil[k], angle); // Añadimos los vertices al final del vector vertices.insert(vertices.end(), siguientePerfil.begin(), siguientePerfil.end() ); // Generamos las caras unsigned int inicioPerfil, finPerfil; inicioPerfil = step * perfil.size(); finPerfil = inicioPerfil + perfil.size(); for (unsigned int i = inicioPerfil+1, k = finPerfil+1; i < finPerfil; i++, k++) { caras.push_back(_vertex3i(i-1, k-1, k)); caras.push_back(_vertex3i(i-1, k, i)); } perfil = siguientePerfil; } // Generamos las tapas // Generamos la tapa de abajo if (vertices.front().x) { // Agregamos el punto central, aunque no es necesario porque solo pintamos las caras _vertex3f puntoCentral(0.0, vertices.front().y, 0.0); vertices.push_back(puntoCentral); for (int step = 0; step < steps; step++) { int perfilactual = step * perfil.size(); int siguientePerfil = perfilactual + perfil.size(); caras.push_back(_vertex3i(vertices.size()-1, siguientePerfil, perfilactual)); } } // Generamos la tapa de arriba if (vertices[perfil.size() - 1].x) { // Agregamos el punto central, aunque no es necesario porque solo pintamos las caras _vertex3f puntoCentral(0.0, vertices[perfil.size() - 1].y, 0.0); vertices.push_back(puntoCentral); for (int step = 0; step < steps; step++) { int perfilactual = (step+1) * perfil.size() -1; int siguientePerfil = perfilactual + perfil.size(); caras.push_back(_vertex3i(vertices.size()-1, perfilactual,siguientePerfil)); // Hay que ponerlos al revés que en la otra tapa para que calcule bien las normales } } setVertices(vertices); setFaces(caras); // Calcular coordenadas de textura calcular_coord_textura(steps, perfil.size()); }
_sup_par_triangles_object3D::_sup_par_triangles_object3D ( const unsigned long nu, const unsigned long nv, const FunPar & fp ) { assert( nu > 1 && nv > 1 ); const unsigned long nverts = (nu+1L)*(nv+1L) , // número total de vértices del modelo //naris = 3L*nverts + nu + nv , // número total de aristas del modelo ncaras = 2L*nu*nv ; // número de caras del modelo // crear tablas de vértices, normales y coordenadas de textura Vertices.resize( nverts ); Vertices_normals.resize( nverts ); Vertices_tex_coords.resize( nverts ); for( unsigned long iv = 0 ; iv <= nv ; iv++ ) for( unsigned long iu = 0 ; iu <= nu ; iu++ ) { const vector2d // coords. paramétricas cpar( double(iu)/double(nu) , double(iv)/double(nv) ); vector3d pos, nor ; // posicion y normal // evalua posición y normal a partir de las coordenadas paramétricas fp.eval( cpar.s,cpar.t, pos, nor ); // insertar vectores en las tablas const unsigned long inv = indice(nu,nv,iu,iv) ; // indice del vértice en la tabla Vertices[inv] = _vertex3f( pos.x, pos.y, pos.z ) ; Vertices_normals[inv] = _vertex3f( nor.x, nor.y, nor.z ) ; Vertices_tex_coords[inv] = _vertex2f( cpar.s, 1.0-cpar.t ); } Vertices_normals_computed = true ; Vertices_tex_coords_computed = true ; // crear tablas de aristas y caras Faces_vertices.resize( ncaras ); unsigned long co_car = 0L ; for( unsigned long iv = 0 ; iv < nv ; iv++ ) for( unsigned long iu = 0 ; iu < nu ; iu++ ) { const unsigned long // indices de los vértices en la tabla de v. inv0 = indice( nu,nv, iu ,iv ) , // inf.izq. inv1 = indice( nu,nv, iu+1,iv ) , // inf.der. inv2 = indice( nu,nv, iu ,iv+1 ) , // sup.izq. inv3 = indice( nu,nv, iu+1,iv+1 ) ; // sup.der. Faces_vertices[co_car++] = _vertex3i( inv0, inv1, inv3 ); Faces_vertices[co_car++] = _vertex3i( inv0, inv3, inv2 ); } // calcular la caja englobante y normales de caras //compute_bounding_box(); compute_faces_normals() ; }
// cubo ////////////////////////////////////////////////////////////// // v6----- v5 // /| /| // v1------v0| // | | | | // | |v7---|-|v4 // |/ |/ // v2------v3 Model_Cube::Model_Cube(float size) { // Vertices vertices.push_back(_vertex3f(-size, -size, size)); vertices.push_back(_vertex3f(size, -size, size)); vertices.push_back(_vertex3f(size, size, size)); vertices.push_back(_vertex3f(-size, size, size)); vertices.push_back(_vertex3f(-size, -size, -size)); vertices.push_back(_vertex3f(size, -size, -size)); vertices.push_back(_vertex3f(size, size, -size)); vertices.push_back(_vertex3f(-size, size, -size)); // Caras caras.push_back(_vertex3i(0, 1, 4)); caras.push_back(_vertex3i(1, 5, 4)); caras.push_back(_vertex3i(1, 2, 5)); caras.push_back(_vertex3i(2, 6, 5)); caras.push_back(_vertex3i(2, 3, 6)); caras.push_back(_vertex3i(3, 7, 6)); caras.push_back(_vertex3i(3, 0, 7)); caras.push_back(_vertex3i(0, 4, 7)); caras.push_back(_vertex3i(4, 5, 7)); caras.push_back(_vertex3i(5, 6, 7)); caras.push_back(_vertex3i(3, 2, 0)); caras.push_back(_vertex3i(2, 1, 0)); }