// 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());

}
예제 #5
0
_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));


}