#0 

14-12-2013 02:20:03

yata
Petit nouveau
Date d'inscription: 08-12-2013
Messages: 8

Bonjour,

Après plusieurs jours de casse tête, je reviens vers vous pour un nouveau problème sad

J'ai une classe qui fait des IAnimatedMesh à partir d'un tableau à 3 dimensions.
En gros, si pour mapcube[1] [2] [1] y'a true, ca me fait un cube a la position 1,2,1.
Chaque cube est généré avec 4 vertices, 1 normal et 2 triangles.
Si l'on génère une map ou il y à 2 cubes l'un à coté de l'autre, les faces consécutives ne sont pas crées.

Mais je viens de remarquer qu'en essayant d'afficher des ombre portées ça coince.

Un p'tit screen et j'explique:


=> Sur l'image "1" on voit qu'avec un seul cube l'ombre se comporte normalement

=> Sur l'image "2", j'ai généré un mesh avec deux cubes consécutifs et la le résultat est pour le moins déconcertant ...
     plusieurs ombres au sol (avec certaines qui s'annulent on dirais) et une ombre sur une face du mesh lui même

=> Sur l'image "3", j'ai généré 2 mesh séparés de 1 cube (donc avec toutes leurs faces contrairement à l'image 2)
     et la, tout à l'air normal

... Avez vous une explication à ce "bug"? ... pitié, je désespère smile


Ce que j'ai cru comprendre nécessaire en farfouillant à droite à gauche et que j'ai respecté dans l'exemple ci-dessus:
- Stencilbuffer à true
- IAnimatedMesh uniquement
- node->addShadowVolumeSceneNode( mesh->getMesh(0,255,-1,-1) );

Dernière modification par yata (14-12-2013 02:25:10)

Hors ligne


#1 

15-12-2013 10:33:54

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 908
Corrections: 2
Site web

Pour commencer il y a déjà un soucis avec le cube lorsque tu merges les deux (outre le shadown).
Il te manque une face sur le dessus et probablement en dessous.
Ensuite, tu as forcement un problème avec tes normales qui va impacter tes ombres.
Tu dois avoir dans ton cas 4 normales distinctes pour un cube.

Ensuite je sais pas si tu considères "triangle = polygone" mais dans ce cas tu n'en as plus que 2 smile

"addShadowVolumeSceneNode" disponible sur "IAnimatedMeshSceneNode" et "ImeshSceneNode",
prennent tout deux des "IMesh", donc pas nécessairement "IAnimatedMesh".

Hors ligne


#2 

15-12-2013 13:03:37

yata
Petit nouveau
Date d'inscription: 08-12-2013
Messages: 8

Salut Magun et merci a toi pour ce p'tit coup d'pouce smile

Magun :

pour commencer il y a déjà un soucis avec le cube l'orsque tu merge les deux (outre le shadown)


On est d'accord :p

Magun :

il te manque une face sur le dessus et probablement en dessous


He bien non, toutes les faces sont présentes.
J'ai fait un essais en changement uniquement la couleur de la face du dessus par du bleu (alors que le reste des cubes est rouge.
Et on voit bien la face supérieure. (d’ailleurs, si il n'y avais pas de faces supérieure on verrais "à travers les autres faces quand on regarde par l'intérieur". vu que je ne définit que 6 indices par faces, j'ai remarqué que les faces ne sont visibles que de l'extérieur) ... Je ne sait pas si j'ai été très clair :s
Screen à l'appui:


Magun :

en suite tu a forcement un problème avec t'est normal qui va impacter t'est ombres
tu doit avoir dans ton cas 4 normal distinct pour un cube


En fait j'en ai 6, toujours les mêmes et différents pour chaque faces. Ceux la:
front: vector3df(0.0f, 0.0f, 1.0f);
back: vector3df(0.0f, 0.0f, -1.0f);
right: vector3df(1.0f, 0.0f, 0.0f);
left: vector3df(-1.0f, 0.0f, 0.0f);
top: vector3df(0.0f, 1.0f, 0.0f);
bottom: vector3df(0.0f, -1.0f, 0.0f);

Magun :

en suite je sais pas si tu considère triangle = polygone mais dans ce cas tu en n'a plus que 2 smile


J'comprend pas. Quand je dit triangle, j' entend "3 indices"

Magun :

addShadowVolumeSceneNode disponible sur IAnimatedMeshSceneNode et ImeshSceneNode,
prenne tout deux des IMesh donc non pas nécessairement IAnimatedMesh


Cool, j'avais pas vu ca. Ca va me permettre de simplifier un peu ma classe smile

Si t'as besoin d'une partie du code pour comprendre, hésite pas. Je l’enverrais direct ^^

Hors ligne


#3 

16-12-2013 19:26:40

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 908
Corrections: 2
Site web

En fait j'en ai 6, toujours les mêmes et différents pour chaque faces. Ceux la...


ok, au niveaux rendue, mais au niveaux données tu devraient en avoir 8 (et non pas 4 je penssais a une seul face)

au pire post un bout de code si tu peut, ce seras plus explicite

Hors ligne


#4 

16-12-2013 20:05:20

yata
Petit nouveau
Date d'inscription: 08-12-2013
Messages: 8

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)

Code:

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;
        }
    }
}

Hors ligne


#5 

16-12-2013 21:17:58

yata
Petit nouveau
Date d'inscription: 08-12-2013
Messages: 8

Bon, beh j'viens d'essayer d'affecter mes normaux comme sur ton schéma (les p'tits traits bleus)

Le résultat est pas très concluant :p (même chose qu'avant pour les ombres et merdique pour la lumière huhu):


En gros j'ai changé les "norm" du code précédent par
vector3df n1(-1.0f, -1.0f, 1.0f);
vector3df n2(1.0f, -1.0f, 1.0f);
vector3df n3(1.0f, 1.0f, 1.0f);
vector3df n4(-1.0f, 1.0f, 1.0f);
vector3df n5(1.0f, -1.0f, -1.0f);
vector3df n6(-1.0f, -1.0f, -1.0f);
vector3df n7(-1.0f, 1.0f, -1.0f);
vector3df n8(1.0f, 1.0f, -1.0f);

avec n1 allant toujours avec p1, n2 avec p2 ... etc


HAAAAAAAAAAAAAAAAAAAAAAAAA :'(

Hors ligne


#6 

16-12-2013 21:40:50

yata
Petit nouveau
Date d'inscription: 08-12-2013
Messages: 8

En repartant sur le premier code et en désactivant le zfail, ca me donne ca:

... Si ca peux aider à comprendre :s

Dernière modification par yata (16-12-2013 21:41:14)

Hors ligne


#7 

16-12-2013 21:40:52

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 908
Corrections: 2
Site web

donc au final t'a pas 8 vertex mais 24, cela dit je ne voie pas trop l'utiliter d'une boucle dans le cas présent
tu pourrais n'en avoir que 8 et agir sur les indices pour définir s'il y a une face ou non, faut voir ce qui est le plus lourd au rendu
ton code semble bien, probablement un peut lourd pour un simple cube

pour ce qui est du premier message tu a surment un soucis dans l'ordenenement des t'est indices
clockwise/counter-clockwise qui définir le "sens" du polygone d'ou le fait que j'usse vue l'absence de face

Code c++ :


IMesh* CGeometryCreator::createCubeMesh(const core::vector3df& size) const
{
    SMeshBuffer* buffer = new SMeshBuffer();

    // Create indices
    const u16 u[36] = {   0,2,1,   0,3,2,   1,5,4,   1,2,5,   4,6,7,   4,5,6,
            7,3,0,   7,6,3,   9,5,2,   9,8,5,   0,11,10,   0,10,7};

    buffer->Indices.set_used(36);

    for (u32 i=0; i<36; ++i)
        buffer->Indices[i] = u[i];


    // Create vertices
    video::SColor clr(255,255,255,255);

    buffer->Vertices.reallocate(12);

    buffer->Vertices.push_back(video::S3DVertex(0,0,0, -1,-1,-1, clr, 0, 1));
    buffer->Vertices.push_back(video::S3DVertex(1,0,0,  1,-1,-1, clr, 1, 1));
    buffer->Vertices.push_back(video::S3DVertex(1,1,0,  1, 1,-1, clr, 1, 0));
    buffer->Vertices.push_back(video::S3DVertex(0,1,0, -1, 1,-1, clr, 0, 0));
    buffer->Vertices.push_back(video::S3DVertex(1,0,1,  1,-1, 1, clr, 0, 1));
    buffer->Vertices.push_back(video::S3DVertex(1,1,1,  1, 1, 1, clr, 0, 0));
    buffer->Vertices.push_back(video::S3DVertex(0,1,1, -1, 1, 1, clr, 1, 0));
    buffer->Vertices.push_back(video::S3DVertex(0,0,1, -1,-1, 1, clr, 1, 1));
    buffer->Vertices.push_back(video::S3DVertex(0,1,1, -1, 1, 1, clr, 0, 1));
    buffer->Vertices.push_back(video::S3DVertex(0,1,0, -1, 1,-1, clr, 1, 1));
    buffer->Vertices.push_back(video::S3DVertex(1,0,1,  1,-1, 1, clr, 1, 0));
    buffer->Vertices.push_back(video::S3DVertex(1,0,0,  1,-1,-1, clr, 0, 0));

    // Recalculate bounding box
    buffer->BoundingBox.reset(0,0,0);

    for (u32 i=0; i<12; ++i)
    {
        buffer->Vertices[i].Pos -= core::vector3df(0.5f, 0.5f, 0.5f);
        buffer->Vertices[i].Pos *= size;
        buffer->BoundingBox.addInternalPoint(buffer->Vertices[i].Pos);
    }

    SMesh* mesh = new SMesh;
    mesh->addMeshBuffer(buffer);
    buffer->drop();

    mesh->recalculateBoundingBox();
    return mesh;
}

Hors ligne


#8 

17-12-2013 01:12:56

yata
Petit nouveau
Date d'inscription: 08-12-2013
Messages: 8

j'ai trouvé ... et j'suis un peu honteux du coup ^^

j'ai fait une erreur dans le test la:

Code:

if (ftFace||bkFace||rtFace||ltFace||tpFace||bmFace)

qui devais être équivalent à ceux du dessus soit:

Code:

if ((face==0 && ftFace)||(face==1 && bkFace)||(face==2 && rtFace)||(face==3 && ltFace)||(face==4 && tpFace)||(face==5 && bmFace))

Merci de m'avoir aider, même indirectement; et de m'avoir évité un suicide quasiment inévitable :p

PS: ouaip, j'connaissait la méthode createCubeMesh c'est de la que je suis parti plus ou moins. Mais j'avais justement modifié les vecteurs normaux parce qu'avec ceux la, comme dans le test que j'ai essayé de faire quand j'ai vu ton schéma de cube l'éclairage n'est pas correct. Ça reflète par les coins à la place de refléter par les faces

Hors ligne


#9 

17-12-2013 17:56:19

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 908
Corrections: 2
Site web

Je n'avais pas vraiment regardé de ce coté-ci ^^"

Hors ligne


Options Liens officiels Caractéristiques Statistiques Communauté
Corrections
irrlicht
irrklang
irredit
irrxml
xhtml 1.0
css 2.1
Propulsé par FluxBB
Traduit par FluxBB.fr
881 membres
1427 sujets
11117 messages
Dernier membre inscrit: Bidule
29 invités en ligne
Aucun membre connecté
RSS Feed