Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: 3D model

mika132 [15.05.2012 23:09:14]

#

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.

Spongi [16.05.2012 02:02:41]

#

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ää.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta