Herramientas de usuario

Herramientas del sitio


fw:lib3ds

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anterior Revisión previa
Próxima revisión
Revisión previa
fw:lib3ds [2008/07/09 09:17]
alfred
fw:lib3ds [2020/05/09 09:25] (actual)
Línea 33: Línea 33:
 </​code>​ </​code>​
 ''​lib3ds_file_free''​ libera de memoria el ''​Lib3dsFile''​ pasado por parámetro. ''​lib3ds_file_free''​ libera de memoria el ''​Lib3dsFile''​ pasado por parámetro.
 +
 +
 +
  
  
 ==== Dibujar un modelo de la escena ==== ==== Dibujar un modelo de la escena ====
 Los modelos están guardados como una linked list en la variable ''​meshes''​ del ''​Lib3dsFile''​ del tipo ''​Lib3dsMesh''​enlazadas por la variable //next//, que corresponde a la siguiente dentro del fichero. \\  Los modelos están guardados como una linked list en la variable ''​meshes''​ del ''​Lib3dsFile''​ del tipo ''​Lib3dsMesh''​enlazadas por la variable //next//, que corresponde a la siguiente dentro del fichero. \\ 
-Una mesh tiene un nombre\id (//name//) y un número de caras (//​faces//​). Una cara es un triangulo de tres vértices (o puntostodos los vértices de la mesh se encuentran en su variable //pointL//, que es un array de ''​Lib3dsPoint''​. Para dibujar una cara debemos acceder al array de caras de la mesh (en //faceL//), escoger la cara deseada (tipo ''​Lib3dsFace''​).+Una mesh tiene un nombre\id (//name//) y un número de caras (//​faces//​). Una cara es un triangulo de tres vértices (o puntostodos los vértices de la mesh se encuentran en su variable //pointL//, que es un array de ''​Lib3dsPoint''​. Para dibujar una cara debemos acceder al array de caras de la mesh (en //faceL//), escoger la cara deseada (tipo ''​Lib3dsFace''​) ​y acceder a sus tres vertices que están en //points//, un array de tres integers correspondientes a los índices del array de vertices de la mesh. Cada ''​Lib3dsPoint''​ contiene una variable //pos// que es un array con tres números que son las tres coordenadas xyz de un vértice. 
 +<code c> 
 +Lib3dsMesh* mesh = file->​meshes;​ 
 +Lib3dsPoint ptmp; 
 + 
 +glBegin(GL_TRIANGLES);​ 
 +for (int i=0; i<​mesh->​faces;​ i++) { 
 + Lib3dsFace face = mesh->​faceL[i];​ 
 + for (int i=0; i<3; i++) { 
 + ptmp = mesh->​pointL[face.points[i]];​ 
 + glVertex3f(ptmp.pos[0],​ ptmp.pos[1],​ ptmp.pos[2]);​ 
 +
 +
 +glEnd(); 
 +</​code>​ 
 + 
 +==== Cálculo de normales ==== 
 +Lib3ds dispone de una función llamada ''​lib3ds_mesh_calculate_normals''​ que calcula las normales para una mesh, se le pasa la mesh de la cual queremos calcular las normales y tantos arrays de 3 floats como normales tenga esta mesh (número de caras multiplicado por 3, que son los vértices). Para más comodidad podemos utilizar la estructura ''​Lib3dsVector''​. 
 +<code c> 
 +Lib3dsVector* normals = new Lib3dsVector[mesh->​faces * 3]; 
 +lib3ds_mesh_calculate_normals(mesh,​ normals); 
 +</​code>​ 
 +Ahora dentro del vector de normales tendremos las normales por cada vértice. 
 + 
 + 
 + 
 +==== Cargar las coordenadas de textura ==== 
 +Las coordenadas de textura las tratamos desde la instancia a ''​Lib3dsMesh''​. Esta contiene dos variables:  
 +  * //texels// que contiene el número de coordenadas almacenadas. 
 +  * //texelL// que contiene las coordenadas en un array de arrays de dos números (x e y) de la coordenada. Para saber que coordenada que le toca a cada vértice iremos a la cara con la que estemos trabajando y en su variable //points// encontraremos los tres indices del array de vértices correspondientes a sus tres vértices, ese índice también coincide con el vértice para las coordenadas de textura. 
 +<code c> 
 +for (int i=0; i<​mesh->​faces;​ i++) { 
 + Lib3dsFace face = mesh->​faceL[i];​ 
 + for (int i=0; i<3; i++) { 
 + glTexCoord2f (mesh->​texelL[face.points[i]][0],​ mesh->​texelL[face.points[i]][1]);​ 
 +... 
 +</​code>​ 
 +Para saber qué textura tiene aplicada una cara accederemos a su variable //​material//,​ esta contiene un string con el identificador.
fw/lib3ds.1215595061.txt.gz · Última modificación: 2020/05/09 09:24 (editor externo)