Historique des modifications - Message

Message #11475

Sujet: Ombre portée qui se comporte "mal"


Type Date Auteur Contenu
Création du message 16-12-2013 19:05:20 yata
Ouais, en fait pour chaque face j'ai 4 fois le même, perpendiculaire à la face ( ce qui à l'air différent sur ton schéma :s )

du coups, si je comprend bien j'ai :
Face HAUT:
vertice1 -> normal : 0, 1, 0
vertice2 -> normal : 0, 1, 0
vertice3 -> normal : 0, 1, 0
vertice4 -> normal : 0, 1, 0

mais je devrais avoir un truc comme :
Face HAUT:
vertice1 -> normal : 0, 1, 0
vertice2 -> normal : 1, 1, 0
vertice3 -> normal : 1, 1, 1
vertice4 -> normal : 0, 1, 1


Et un p'tit bout de code en prime (méthode qui ajoute 1 cube au buffer)

void chunk::createCube ( u16 size, vector3df pos, SColor cubeColor, bool ftFace, bool bkFace, bool rtFace, bool ltFace, bool tpFace, bool bmFace )
{
    u32 i=0;

    u32 v1=0;
    u32 v2=0;
    u32 v3=0;
    u32 v4=0;

    vector3df norm;
    vector2d<f32> tcoords(0.0f, 0.0f);

    f32 halfSise = (f32)size/2;

    vector3df p1(pos.X-halfSise, pos.Y-halfSise, pos.Z+halfSise);
    vector3df p2(pos.X+halfSise, pos.Y-halfSise, pos.Z+halfSise);
    vector3df p3(pos.X+halfSise, pos.Y+halfSise, pos.Z+halfSise);
    vector3df p4(pos.X-halfSise, pos.Y+halfSise, pos.Z+halfSise);
    vector3df p5(pos.X+halfSise, pos.Y-halfSise, pos.Z-halfSise);
    vector3df p6(pos.X-halfSise, pos.Y-halfSise, pos.Z-halfSise);
    vector3df p7(pos.X-halfSise, pos.Y+halfSise, pos.Z-halfSise);
    vector3df p8(pos.X+halfSise, pos.Y+halfSise, pos.Z-halfSise);

    for (u16 face=0; face<6; face++)
    {
        // FRONT ( => Vertices )
        if (face==0 && ftFace)
        {
            norm = vector3df(0.0f, 0.0f, 1.0f);
            v1=vCount++;  buffer->Vertices.push_back( S3DVertex(p1, norm, cubeColor, tcoords) );
            v2=vCount++;  buffer->Vertices.push_back( S3DVertex(p2, norm, cubeColor, tcoords) );
            v3=vCount++;  buffer->Vertices.push_back( S3DVertex(p3, norm, cubeColor, tcoords) );
            v4=vCount++;  buffer->Vertices.push_back( S3DVertex(p4, norm, cubeColor, tcoords) );
        }

        // BACK ( => Vertices )
        if (face==1 && bkFace)
        {
            norm = vector3df(0.0f, 0.0f, -1.0f);
            v1=vCount++;  buffer->Vertices.push_back( S3DVertex(p5, norm, cubeColor, tcoords) );
            v2=vCount++;  buffer->Vertices.push_back( S3DVertex(p6, norm, cubeColor, tcoords) );
            v3=vCount++;  buffer->Vertices.push_back( S3DVertex(p7, norm, cubeColor, tcoords) );
            v4=vCount++;  buffer->Vertices.push_back( S3DVertex(p8, norm, cubeColor, tcoords) );
        }

        // RIGHT ( => Vertices )
        if (face==2 && rtFace)
        {
            norm = vector3df(1.0f, 0.0f, 0.0f);
            v1=vCount++;  buffer->Vertices.push_back( S3DVertex(p2, norm, cubeColor, tcoords) );
            v2=vCount++;  buffer->Vertices.push_back( S3DVertex(p5, norm, cubeColor, tcoords) );
            v3=vCount++;  buffer->Vertices.push_back( S3DVertex(p8, norm, cubeColor, tcoords) );
            v4=vCount++;  buffer->Vertices.push_back( S3DVertex(p3, norm, cubeColor, tcoords) );
        }

        // LEFT ( => Vertices )
        if (face==3 && ltFace)
        {
            norm = vector3df(-1.0f, 0.0f, 0.0f);
            v1=vCount++;  buffer->Vertices.push_back( S3DVertex(p6, norm, cubeColor, tcoords) );
            v2=vCount++;  buffer->Vertices.push_back( S3DVertex(p1, norm, cubeColor, tcoords) );
            v3=vCount++;  buffer->Vertices.push_back( S3DVertex(p4, norm, cubeColor, tcoords) );
            v4=vCount++;  buffer->Vertices.push_back( S3DVertex(p7, norm, cubeColor, tcoords) );
        }

        // TOP ( => Vertices )
        if (face==4 && tpFace)
        {
            norm = vector3df(0.0f, 1.0f, 0.0f);
            v1=vCount++;  buffer->Vertices.push_back( S3DVertex(p4, norm, cubeColor, tcoords) );
            v2=vCount++;  buffer->Vertices.push_back( S3DVertex(p3, norm, cubeColor, tcoords) );
            v3=vCount++;  buffer->Vertices.push_back( S3DVertex(p8, norm, cubeColor, tcoords) );
            v4=vCount++;  buffer->Vertices.push_back( S3DVertex(p7, norm, cubeColor, tcoords) );
        }

        // BOTTOM ( => Vertices )
        if (face==5 && bmFace)
        {
            norm = vector3df(0.0f, -1.0f, 0.0f);
            v1=vCount++;  buffer->Vertices.push_back( S3DVertex(p6, norm, cubeColor, tcoords) );
            v2=vCount++;  buffer->Vertices.push_back( S3DVertex(p5, norm, cubeColor, tcoords) );
            v3=vCount++;  buffer->Vertices.push_back( S3DVertex(p2, norm, cubeColor, tcoords) );
            v4=vCount++;  buffer->Vertices.push_back( S3DVertex(p1, norm, cubeColor, tcoords) );
        }

        // ALL ( => Indices )
        if (ftFace||bkFace||rtFace||ltFace||tpFace||bmFace)
        {
            i = buffer->getIndexCount();
            buffer->Indices.set_used( i+6 );

            buffer->Indices[i++] = v1;   buffer->Indices[i++] = v2;   buffer->Indices[i++] = v3;
            buffer->Indices[i++] = v1;   buffer->Indices[i++] = v3;   buffer->Indices[i++] = v4;
        }
    }
}

Retour

Options Liens officiels Caractéristiques Statistiques Communauté
Préférences cookies
Corrections
irrlicht
irrklang
irredit
irrxml
Propulsé par Django
xhtml 1.0
css 2.1
884 membres
1440 sujets
11337 messages
Dernier membre inscrit: Saidov17
115 invités en ligne
membre en ligne: -
RSS Feed