0

地形の表面の外観をより滑らかにするための解決策は、単一の法線を三角形に関連付けるのではなく、三角形の 3 つの頂点のそれぞれに関連付ける法線を関連付けることです。

それで、実装しようとすると、ぼかしのような問題がいくつか見つかりました

http://i.stack.imgur.com/6oPcW.png

これは、私がやろうとしていることを明示するためのスキームです: http://i.stack.imgur.com/7T04y.png

私はこのコードを使用しています:

    for (int i=0;i<nb_pt_z;i++)
{
    for (int j=0;j<nb_pt_x;j++)
    {
        Vector N(0.0, 0.0, 0.0);

        if (i != 0)
        {
            if (j != 0)
            {
                Vector v1(points_terrain[((i-1)*nb_pt_x)+j].x-points_terrain[(i*nb_pt_x)+j].x,
                          points_terrain[((i-1)*nb_pt_x)+j].hauteur-points_terrain[(i*nb_pt_x)+j].hauteur,
                          points_terrain[((i-1)*nb_pt_x)+j].z-points_terrain[(i*nb_pt_x)+j].z);

                Vector v2(points_terrain[(i*nb_pt_x)+(j-1)].x-points_terrain[(i*nb_pt_x)+j].x,
                          points_terrain[(i*nb_pt_x)+(j-1)].hauteur-points_terrain[(i*nb_pt_x)+j].hauteur,
                          points_terrain[(i*nb_pt_x)+(j-1)].z-points_terrain[(i*nb_pt_x)+j].z);

                N += v1^v2;
            }

            if (j != nb_pt_z-1)
            {
                Vector v1(points_terrain[((i-1)*nb_pt_x)+(j+1)].x-points_terrain[(i*nb_pt_x)+j].x,
                          points_terrain[((i-1)*nb_pt_x)+(j+1)].hauteur-points_terrain[(i*nb_pt_x)+j].hauteur,
                          points_terrain[((i-1)*nb_pt_x)+(j+1)].z-points_terrain[(i*nb_pt_x)+j].z);

                Vector v2(points_terrain[((i-1)*nb_pt_x)+j].x-points_terrain[(i*nb_pt_x)+j].x,
                          points_terrain[((i-1)*nb_pt_x)+j].hauteur-points_terrain[(i*nb_pt_x)+j].hauteur,
                          points_terrain[((i-1)*nb_pt_x)+j].z-points_terrain[(i*nb_pt_x)+j].z);

                N += v1^v2;

                Vector v3(points_terrain[(i*nb_pt_x)+(j+1)].x-points_terrain[(i*nb_pt_x)+j].x,
                          points_terrain[(i*nb_pt_x)+(j+1)].hauteur-points_terrain[(i*nb_pt_x)+j].hauteur,
                          points_terrain[(i*nb_pt_x)+(j+1)].z-points_terrain[(i*nb_pt_x)+j].z);

                Vector v4(points_terrain[((i-1)*nb_pt_x)+(j+1)].x-points_terrain[(i*nb_pt_x)+j].x,
                          points_terrain[((i-1)*nb_pt_x)+(j+1)].hauteur-points_terrain[(i*nb_pt_x)+j].hauteur,
                          points_terrain[((i-1)*nb_pt_x)+(j+1)].z-points_terrain[(i*nb_pt_x)+j].z);

                N+= v3^v4;
            }
        }

        if (i != nb_pt_x-1)
        {
            if (j != 0)
            {
                Vector v1(points_terrain[(i*nb_pt_x)+(j-1)].x-points_terrain[(i*nb_pt_x)+j].x,
                          points_terrain[(i*nb_pt_x)+(j-1)].hauteur-points_terrain[(i*nb_pt_x)+j].hauteur,
                          points_terrain[(i*nb_pt_x)+(j-1)].z-points_terrain[(i*nb_pt_x)+j].z);

                Vector v2(points_terrain[((i+1)*nb_pt_x)+(j-1)].x-points_terrain[(i*nb_pt_x)+j].x,
                          points_terrain[((i+1)*nb_pt_x)+(j-1)].hauteur-points_terrain[(i*nb_pt_x)+j].hauteur,
                          points_terrain[((i+1)*nb_pt_x)+(j-1)].z-points_terrain[(i*nb_pt_x)+j].z);

                N+= v1^v2;

                Vector v3(points_terrain[((i+1)*nb_pt_x)+(j-1)].x-points_terrain[(i*nb_pt_x)+j].x,
                          points_terrain[((i+1)*nb_pt_x)+(j-1)].hauteur-points_terrain[(i*nb_pt_x)+j].hauteur,
                          points_terrain[((i+1)*nb_pt_x)+(j-1)].z-points_terrain[(i*nb_pt_x)+j].z);

                Vector v4(points_terrain[((i+1)*nb_pt_x)+j].x-points_terrain[(i*nb_pt_x)+j].x,
                          points_terrain[((i+1)*nb_pt_x)+j].hauteur-points_terrain[(i*nb_pt_x)+j].hauteur,
                          points_terrain[((i+1)*nb_pt_x)+j].z-points_terrain[(i*nb_pt_x)+j].z);

                N+= v3^v4;
            }

            if (j != nb_pt_z-1)
            {
                Vector v3(points_terrain[((i+1)*nb_pt_x)+j].x-points_terrain[(i*nb_pt_x)+j].x,
                          points_terrain[((i+1)*nb_pt_x)+j].hauteur-points_terrain[(i*nb_pt_x)+j].hauteur,
                          points_terrain[((i+1)*nb_pt_x)+j].z-points_terrain[(i*nb_pt_x)+j].z);

                Vector v4(points_terrain[(i*nb_pt_x)+(j+1)].x-points_terrain[(i*nb_pt_x)+j].x,
                          points_terrain[(i*nb_pt_x)+(j+1)].hauteur-points_terrain[(i*nb_pt_x)+j].hauteur,
                          points_terrain[(i*nb_pt_x)+(j+1)].z-points_terrain[(i*nb_pt_x)+j].z);

                N+= v3^v4;
            }
        }
        N.normalize();
        points_terrain[(i*nb_pt_x)+j].nx = N.x;
        points_terrain[(i*nb_pt_x)+j].ny = N.y;
        points_terrain[(i*nb_pt_x)+j].nz = N.z;

    }
}

typedef struct                                  
{
    GLfloat s, t;
    GLfloat nx, ny, nz;
    GLfloat x, hauteur,z;                               

} Point_terrain; /* Me, I have a pointer of that already initialized and well fill *

これらの点を描画するために頂点配列を使用しています。

num = 0;
for( z=0; z<nb_pt_z-1; z++ )
{
    for( x=0; x<nb_pt_x-1; x++ )
    {
        int ind=z*nb_pt_x+x;
        points_indice[num++] =ind;
        points_indice[num++] = ind+nb_pt_x;
        points_indice[num++] = ind+nb_pt_x+1;
        points_indice[num++] = ind;
        points_indice[num++] = ind+nb_pt_x+1;
        points_indice[num++] = ind+1;
    }
}

と ..

 glInterleavedArrays( GL_T2F_N3F_V3F, 0, points_terrain );
glDrawElements( GL_TRIANGLES, nbIndice,
               GL_UNSIGNED_INT, points_indice );

では、誰かが問題の原因を知っていますか?

4

0 に答える 0