// Donde N es el numero de rotaciones void Model_Revolution::calcular_coord_textura(int N, int M) { int n_vertices = _vertices.size(); double d[M]; //vector de distancias d[0] = 0; for(unsigned int k=1; k<M; k++) d[k] = d[k-1] + distancia(_vertices[k-1], _vertices[k]); for(unsigned int i=0; i<N; i++) { for(unsigned int j=0; j<M; j++) { float si = (float)i/(N-1); float tj = d[j]/d[M-1]; _texturas.push_back(_vertex2f(si, tj)); } } }
_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() ; }