hmm.. Tälläinen tuli mieleen kun tein ohjelman mikä lataa 3D modeleja, niin mitenköhän mahtaa onnistua 3D modelin piirtäminen? En ole löytänyt sille mitään yksittäistä koodia.
.3ds muotoa käytän.
mietin, että kun tallennan verticlet ja niiden x,y,z tälläiseen muotoon:
Number of vertices: 8 Vertices list x: 0.837126 Vertices list y: 0.806374 Vertices list z: -0.806374 Vertices list x: 0.837126 Vertices list y: -0.806374 Vertices list z: -0.806374 Vertices list x: -0.775622 Vertices list y: -0.806374 Vertices list z: -0.806374 Vertices list x: -0.775621 Vertices list y: 0.806374 Vertices list z: -0.806374 Vertices list x: 0.837126 Vertices list y: 0.806373 Vertices list z: 0.806374 Vertices list x: 0.837125 Vertices list y: -0.806374 Vertices list z: 0.806374 Vertices list x: -0.775622 Vertices list y: -0.806374 Vertices list z: 0.806374 Vertices list x: -0.775622 Vertices list y: 0.806374 Vertices list z: 0.806374
mitenköhän se piirretään. Suunnittelin funktiota ja tein tälläisen:
void Muuttujat::drawModel(float x, float leveys, float y, float pituus, float z, float korkeus, int material){ //Front glBindTexture(GL_TEXTURE_2D, Muuttujat::texture[material]); glBegin(GL_QUADS); //Top glNormal3f( 0.0f, 1.0f, 0.0f); glTexCoord2f(0.0f, 0.3f); glVertex3f(x, y, z-korkeus); glTexCoord2f(0.0f, 0.0f); glVertex3f(x-leveys, y, z-korkeus); glTexCoord2f(0.3f, 0.0f); glVertex3f(x-leveys, y, z); glTexCoord2f(0.3f, 0.3f); glVertex3f(x, y, z); glNormal3f( 0.0f, 0.0f, 2.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(x, y, z); glTexCoord2f(1.0f, 0.0f); glVertex3f(x-leveys, y, z); glTexCoord2f(1.0f, 1.0f); glVertex3f(x-leveys, y-pituus, z); glTexCoord2f(0.0f, 1.0f); glVertex3f(x, y-pituus, z); //Bottom glNormal3f( 0.0f,-1.0f, 0.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(x, y-pituus, z); glTexCoord2f(0.0f, 1.0f); glVertex3f(x-leveys, y-pituus, z); glTexCoord2f(0.0f, 0.0f); glVertex3f(x-leveys, y-pituus, z-korkeus); glTexCoord2f(1.0f, 0.0f); glVertex3f(x, y-pituus, z-korkeus); //back glNormal3f( 0.0f, 0.0f,-2.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(x, y-pituus, z-korkeus); glTexCoord2f(1.0f, 1.0f); glVertex3f(x-leveys, y-pituus, z-korkeus); glTexCoord2f(0.0f, 1.0f); glVertex3f(x-leveys, y, z-korkeus); glTexCoord2f(0.0f, 0.0f); glVertex3f(x, y, z-korkeus); //left glNormal3f(-1.0f, 0.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(x-leveys, y, z); glTexCoord2f(1.0f, 0.0f); glVertex3f(x-leveys, y, z-korkeus); glTexCoord2f(1.0f, 1.0f); glVertex3f(x-leveys, y-pituus, z-korkeus); glTexCoord2f(0.0f, 1.0f); glVertex3f(x-leveys, y-pituus, z); //right glNormal3f( 1.0f, 0.0f, 0.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(x, y, z-korkeus); glTexCoord2f(1.0f, 1.0f); glVertex3f(x, y, z); glTexCoord2f(0.0f, 1.0f); glVertex3f(x, y-pituus, z); glTexCoord2f(0.0f, 0.0f); glVertex3f(x, y-pituus, z-korkeus); glEnd(); // tähän perään vielä loput viisi tahkoa.. }
ja koodia kutsuttaisi esim näin:
drawModel(2.0, vertex->x, 3.0, vertex->y, 1.0, vertex_z, 2) //viimeisellä ei merkitystä.. Se on vain käytettävän tekstuurin arvo.
for(int i=0; i<vertexCount; ++i) { glVertex2f(vertices[i].x, vertices[i].y, vertices[i].z); }
Normaalit ja tekstuurikoordinaatit menee samaan tapaan. Tähän on toki paljon parempiakin ratkaisuja, kuten esimerkiksi VertexBufferObjectin käyttö. Googlea saa käyttää.
Aihe on jo aika vanha, joten et voi enää vastata siihen.