¿cómo pongo texturas a un modelo 3d?

Hola a todos :)

Soy incapaz de hacer que aparezcan las texturas que le aplico al modelo.

El modelo lo hice con el Blender, luego le apliqué un mapeado UV con un bmp hecho en el Paint (256x256, 24 bits). Para convertirlos, usé NDS_Mesh_Converter. El caso, es que el modelo se ve pero sin texturas. [buuuaaaa] ¿Alguien podría ayudarme?

Aquí os vá el código, gracias

#include <nds.h>
#include "casita_x_bin.h"
#include "casatextura_bmp_bin.h"

int main() {

float rotateX = 0.0;
float rotateY = 0.0;
float moverz = 0.0;
int textureID;

//set mode 0, enable BG0 and set it to 3D
videoSetMode(MODE_0_3D);

// inicializa gl
glInit();
vramSetBankA(VRAM_A_TEXTURE);
glGenTextures(1, &textureID); // reservamos sitio para las textura
glBindTexture(0, textureID); // activamos la textura
glTexImage2D(0, 0, GL_RGB, TEXTURE_SIZE_256 , TEXTURE_SIZE_256, 0, TEXGEN_TEXCOORD, (u8*)casatextura_bmp_bin);
glEnable(GL_TEXTURE_2D | GL_ANTIALIAS); // Activa texturas y Antialias
// setup the rear plane
glClearColor(0,0,0,31); // BG must be opaque for AA to work
glClearPolyID(63); // BG must have a unique polygon ID for AA to work
glClearDepth(0x7FFF);

//this should work the same as the normal gl call
glViewport(0,0,255,191);

//any floating point gl call is being converted to fixed prior to being implemented
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(70, 256.0 / 192.0, 0.1, 100);

gluLookAt( 0.0, 0.0, 3.5, //posición cámara
0.0, 0.0, 0.0, //a dónde mira la cámara
0.0, 1.0, 0.0); //up

glLight(0, RGB15(31,31,31),0,floattov10(-1.0),0);
glLight(1, RGB15(31,0,31), 0,floattov10(1) - 1,0);
glLight(2, RGB15(0,31,0),floattov10(-1.0),0,0);
glLight(3, RGB15(0,0,31),floattov10(1.0) - 1,0,0);

//not a real gl function and will likely change
glPolyFmt(POLY_ALPHA(31) | POLY_CULL_BACK | POLY_FORMAT_LIGHT0 | POLY_FORMAT_LIGHT1 | POLY_FORMAT_LIGHT2 | POLY_FORMAT_LIGHT3 ) ;

while(1)
{
glPushMatrix();

glRotateX(rotateX); //rota figura en eje x
glRotateY(rotateY); //rota figura en eje y
glTranslatef(0,0,moverz);

scanKeys();
u16 keys = keysHeld();
if(!(keys & KEY_UP)) rotateX += 3;
if(!(keys & KEY_DOWN)) rotateX -= 3;
if(!(keys & KEY_LEFT)) rotateY += 3;
if(!(keys & KEY_RIGHT)) rotateY -= 3;
if(!(keys & KEY_R)) moverz ++;
if(!(keys & KEY_L)) moverz --;
// glBindTexture(0, textureID);
glRotateX(90.0);
glCallList((u32*)casita_x_bin);

glPopMatrix(1);

glFlush(0);
}

return 0;
}//end main
Pues no se qué será, pero usar una textura de 256x256 en formato RGB es una burrada. Eso ocupa un banco de vram entero.
Me limité a usar una textura similar a la de un ejemplo que me bajé de aquí de una casa con texturas. :-?
Vale, pero una textura así ocupa 128 KB, así que cuando tu vayas a hacer algo, ni se te ocurra usar texturas tan grandes. O por lo menos, si usas texturas así, que sean de las que usan paletas.

De todos modos, no se como están los comandos en esa display list, que es lo que me parece que está mal. ¿Has probado a mirar si hay para pasarle opciones al conversor? Igual hay que decirle que guarde las coordenadas de la textura.

PD: Prueba también poniendo vramSetBankB(VRAM_B_TEXTURE); por si acaso.
Ya he reducido la textura a 128, pero sigue igual.

Este es un display list de un cubo, que me hace lo mismo [buuuaaaa]

xof 0303txt 0032


template VertexDuplicationIndices {
<b8d65549-d7c9-4995-89cf-53a9a8b031e3>
DWORD nIndices;
DWORD nOriginalVertices;
array DWORD indices[nIndices];
}
template XSkinMeshHeader {
<3cf169ce-ff7c-44ab-93c0-f78f62d172e2>
WORD nMaxSkinWeightsPerVertex;
WORD nMaxSkinWeightsPerFace;
WORD nBones;
}
template SkinWeights {
<6f0d123b-bad2-4167-a0d0-80224f25fabb>
STRING transformNodeName;
DWORD nWeights;
array DWORD vertexIndices[nWeights];
array float weights[nWeights];
Matrix4x4 matrixOffset;
}

Frame RootFrame {

FrameTransformMatrix {
1.000000,0.000000,0.000000,0.000000,
0.000000,1.000000,0.000000,0.000000,
0.000000,0.000000,-1.000000,0.000000,
0.000000,0.000000,0.000000,1.000000;;
}
Frame Mesh {

FrameTransformMatrix {
1.000000,0.000000,0.000000,0.000000,
0.000000,1.000000,0.000000,0.000000,
0.000000,0.000000,1.000000,0.000000,
0.000000,0.000000,0.000000,1.000000;;
}
Mesh {
24;
1.000000; 1.000000; -1.000000;,
1.000000; -1.000000; -1.000000;,
-1.000000; -1.000000; -1.000000;,
-1.000000; 1.000000; -1.000000;,
1.000000; 1.000000; 1.000000;,
-1.000000; 1.000000; 1.000000;,
-1.000000; -1.000000; 1.000000;,
1.000000; -1.000000; 1.000000;,
1.000000; 1.000000; -1.000000;,
1.000000; 1.000000; 1.000000;,
1.000000; -1.000000; 1.000000;,
1.000000; -1.000000; -1.000000;,
1.000000; -1.000000; -1.000000;,
1.000000; -1.000000; 1.000000;,
-1.000000; -1.000000; 1.000000;,
-1.000000; -1.000000; -1.000000;,
-1.000000; -1.000000; -1.000000;,
-1.000000; -1.000000; 1.000000;,
-1.000000; 1.000000; 1.000000;,
-1.000000; 1.000000; -1.000000;,
1.000000; 1.000000; 1.000000;,
1.000000; 1.000000; -1.000000;,
-1.000000; 1.000000; -1.000000;,
-1.000000; 1.000000; 1.000000;;
6;
4; 0, 3, 2, 1;,
4; 4, 7, 6, 5;,
4; 8, 11, 10, 9;,
4; 12, 15, 14, 13;,
4; 16, 19, 18, 17;,
4; 20, 23, 22, 21;;
MeshMaterialList {
4;
6;
3,
3,
3,
3,
3,
3;;
Material Material {
0.800000; 0.800000; 0.800000;1.0;;
0.500000;
1.000000; 1.000000; 1.000000;;
0.0; 0.0; 0.0;;
} //End of Material
Material Material_001 {
1.000000; 1.000000; 1.000000;1.0;;
0.500000;
1.000000; 1.000000; 1.000000;;
0.0; 0.0; 0.0;;
} //End of Material
Material Material_002 {
1.000000; 1.000000; 1.000000;1.0;;
0.500000;
1.000000; 1.000000; 1.000000;;
0.0; 0.0; 0.0;;
} //End of Material
Material Mat1 {
1.0; 1.0; 1.0; 1.0;;
1.0;
1.0; 1.0; 1.0;;
0.0; 0.0; 0.0;;
TextureFilename { "texture.bmp"; }
} // End of Material
} //End of MeshMaterialList
MeshNormals {
24;
0.000000; 0.000000; 0.000000;,
0.000000; 0.000000; 0.000000;,
0.000000; 0.000000; 0.000000;,
0.000000; 0.000000; 0.000000;,
0.000000; 0.000000; 0.000000;,
0.000000; 0.000000; 0.000000;,
0.000000; 0.000000; 0.000000;,
0.000000; 0.000000; 0.000000;,
0.000000; 0.000000; 0.000000;,
0.000000; 0.000000; 0.000000;,
0.000000; 0.000000; 0.000000;,
0.000000; 0.000000; 0.000000;,
0.000000; 0.000000; 0.000000;,
0.000000; 0.000000; 0.000000;,
0.000000; 0.000000; 0.000000;,
0.000000; 0.000000; 0.000000;,
0.000000; 0.000000; 0.000000;,
0.000000; 0.000000; 0.000000;,
0.000000; 0.000000; 0.000000;,
0.000000; 0.000000; 0.000000;,
0.000000; 0.000000; 0.000000;,
0.000000; 0.000000; 0.000000;,
0.000000; 0.000000; 0.000000;,
0.000000; 0.000000; 0.000000;;
6;
4; 0, 3, 2, 1;,
4; 4, 7, 6, 5;,
4; 8, 11, 10, 9;,
4; 12, 15, 14, 13;,
4; 16, 19, 18, 17;,
4; 20, 23, 22, 21;;
} //End of MeshNormals
MeshTextureCoords {
24;
0.001019;-1.000000;,
0.000000;-0.501529;,
0.332314;-0.500000;,
0.333333;-0.998471;,
1.000000;-0.501529;,
0.998981;-1.000000;,
0.666667;-0.998471;,
0.667686;-0.500000;,
0.665647;-0.500000;,
0.666667;-0.998471;,
0.334353;-1.000000;,
0.333333;-0.501529;,
0.998981;-0.000000;,
1.000000;-0.498471;,
0.667686;-0.500000;,
0.666667;-0.001529;,
0.333333;-0.498471;,
0.334353;-0.000000;,
0.666667;-0.001529;,
0.665647;-0.500000;,
0.333333;-0.498471;,
0.001020;-0.500000;,
0.000000;-0.001529;,
0.332314;-0.000000;;
} //End of MeshTextureCoords
}
}
}
mikethunder escribió:Este es un display list de un cubo, que me hace lo mismo [buuuaaaa]

No, ese es el archivo .x. La display list es el archivo .bin que se genera. De todos modos, creo recordar que ese programa aceptaba más formatos... ¿por qué no pruebas con esos? Yo cuando usaba ese programa convertía mis modelos a .3ds.
Ya he probado con 3ds y md2 y nada. [buuuaaaa]
Pues ni idea, como no sea algo mal en las opciones del conversor...
Todo parece que está bien... No se, ¿qué se ve en la pantalla, el modelo en blanco?
si no le pongo la textura sí, pero sino, no se ve nada. ¡Bueno miento!. Al exportarlo a .3ds ó .md2 se ve una cara alineada al suelo. :-?, y si lo exporto a .x entonces es cuando está noche cerrada :)
Pues entonces seguramente sea por algún problema con las coordenadas UV. Prueba a poner glClearColor(15,15,15,31); en lugar de glClearColor(0,0,0,31); y dime que ves.
Lo he hecho y ha aparecido cual agujero negro; es decir, la figura está (negra) y sin textura claro.

Imagen

Muchas gracias por la atención que me estás prestando.
Vale, creo que ya se cual puede ser el problema... Entra aquí y descárgate el "Display List Fixer":

http://antoniond.drunkencoders.com/nds.html

Tienes que renombrar tu archivo a "model.bin", copiar el "DLFixer.exe" a la misma carpeta que el modelo y desde la línea de comandos tienes que escribir "DLFixer.exe c". Prueba con el archivo que genera a ver si se sigue viendo negro.
[triston] ¡nada, sigue apareciendo sin texturas!. Seguiré probando y sino probaré con el 3D Studio!. Ya te contaré.
Gracias

P.D.: Quedas invitado a un pulpo si vienes a Orense ;)
Lo raro es que se vea negro... Ya solo se me ocurre que no tenga comandos de normal y tengas que hacer glColor3f(1,1,1) antes de dibujarlo, pero ni idea. Francamente, nunca he tenido tantos problemas para hacer que se vea un modelo bien. Pues nada, a ver si consigues solucionarlo. xD
Al final, usando el formato md2 y trasladando el objeto :-? he conseguido verlo con texturas.
Gracias por tu ayuda :)
Para la próxima vez intenta usar el [code][/code]
17 respuestas