コード例 #1
0
// 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));


}
コード例 #2
0
// 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));

}
コード例 #3
0
// 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);

}
コード例 #4
0
void Model_Revolution::generarNormalesVertices()
{

    // Generamos las normales de los vertices

    vector<_vertex3f> normales_vertices;


    // Recorremos los vertices
    for(int i = 0; i < _vertices.size(); i++)
    {

        _vertex3f verticeactual = _vertices[i];
        _vertex3f normal(0,0,0);

        // Recorremos las caras
        for(int h = 0; h < _caras.size(); h++)
        {
            // Comprobamos si el vertice esta en otra cara (por la posicion)
            if (_caras[h]._0 == i || _caras[h]._1 == i || _caras[h]._2 == i)
            {
                normal = _vertex3f(normal.x + _normales_caras[h].x,
                                    normal.y + _normales_caras[h].y,
                                    normal.z + _normales_caras[h].z);
            }

        }

        // Antonio para normalizar
        float modulo=sqrt(normal.x*normal.x+normal.y*normal.y+normal.z*normal.z);
        normal.x=normal.x/modulo;
        normal.y=normal.y/modulo;
        normal.z=normal.z/modulo;
        // Fin Antonio

        // La agregago al vector
        normales_vertices.push_back(normal);
    }

    setNormalesVertices(normales_vertices);

}
コード例 #5
0
// 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);

}
コード例 #6
0
_multiple_meshes::_multiple_meshes() 
{
   fesc = _vertex3f(1.0,1.0,1.0);
   despl = _vertex3f( 0.0,0.0,0.0);
}
コード例 #7
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() ;
}
コード例 #8
0
ファイル: revolutiongenerator.cpp プロジェクト: burflip/IG
void RevolutionGenerator::generate(unsigned int steps, vector<float> &vertices_vertex, Object3d & obj)
{
    double angulo =  (PI*2)/steps;

    vector<float>::iterator
    it = vertices_vertex.begin(),
    vertices_vertex_end = vertices_vertex.end();
    _vertex3f aux;

    //Vértice tapa abajo
    obj.addVertex(_vertex3f(0,vertices_vertex[1],0));

    while(it != vertices_vertex_end) {

        aux.x = (*it);
        ++it;
        aux.y = (*it);
        ++it;
        aux.z = (*it);
        ++it;

        obj.addVertex(aux);

        for(unsigned int i=0; i<steps; i++) {
            double anguloR = angulo * i;
            obj.addVertex(_vertex3f(
                              aux.x* cos(anguloR) + aux.z * sin(anguloR),
                              aux.y,
                              aux.z * cos(anguloR) - aux.x * sin(anguloR)));
        }
    }

    //Vértice tapa arriba
    obj.addVertex(_vertex3f(0,vertices_vertex[vertices_vertex.size()-2],0));

    vector<int> faces_vertex;
    int vertices_number = obj.getVerticesNumber();

    //Caras tapa abajo
    for(unsigned int i=1; i<=steps; i++) {
        if(i==steps) {
            //obj.addFace(_vertex3ui(0,i,(i+1)%steps));
        } else {
            obj.addFace(_vertex3ui(0,i,i+1));
        }
    }

    for(unsigned int i=0; i<=steps; i++) {
        if(i==steps) {
            for(unsigned int j=i; j<(vertices_number-steps-1); j=j+steps) {
                obj.addFace(_vertex3ui(j,j+1-steps,j+steps));
                obj.addFace(_vertex3ui(j+steps,j+1,j+1-steps));
            }
        } else {
            for(unsigned int j=i; j<(vertices_number-steps-1); j=j+steps) {
                obj.addFace(_vertex3ui(j,j+1,j+1+steps));
                obj.addFace(_vertex3ui(j+steps,j,j+1+steps));
            }
        }
    }

    //Tapa de arriba

    for (unsigned int i=steps; i>=1; i--) {
        if(i == 1) {
            obj.addFace(_vertex3ui(
                            vertices_number-1,
                            vertices_number-i-1,
                            vertices_number-steps-1));
        } else {
            obj.addFace(_vertex3ui(vertices_number-1,
                                   vertices_number-i-1,
                                   vertices_number-i));
        }

    }

}