Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenGL Terrain 3D calcul法线顶点->;模糊_C++_Opengl_3d_Normals_Vertex Array - Fatal编程技术网

C++ OpenGL Terrain 3D calcul法线顶点->;模糊

C++ OpenGL Terrain 3D calcul法线顶点->;模糊,c++,opengl,3d,normals,vertex-array,C++,Opengl,3d,Normals,Vertex Array,为了使地形的曲面外观更平滑,解决方案是将单个法线与三角形相关联,而不是将法线与三角形的三个顶点中的每个顶点相关联 所以,当我尝试实现它时,我发现了一些问题,比如模糊 这是我试图做的事情的一个计划: 我正在使用以下代码: 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)

为了使地形的曲面外观更平滑,解决方案是将单个法线与三角形相关联,而不是将法线与三角形的三个顶点中的每个顶点相关联

所以,当我尝试实现它时,我发现了一些问题,比如模糊

这是我试图做的事情的一个计划:

我正在使用以下代码:

    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;

    }
}
我正在使用顶点数组来绘制这些点

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

所以,有人知道问题出在哪里吗?

实际上,这看起来像是您交换了一些坐标。检查循环的
顺序是否正确。你面临的问题不是模糊,而是法线的不连续性。是的,我已经检查了,它似乎是正确的。我试图在2-3个晚上纠正这个问题。你的循环表明顶点是x行x行对齐的(内循环超过x),但索引表明不是这样(左邻右舍是
num-nb\u pt\u x
而不是
num-1
)。这似乎不正确。我更新了我的第一篇博文。由于您的回复编辑了我的代码后,它仍然存在。可能是问题出在points\u Indicate选项卡上?(请参阅第一篇博文)您的范围检查错误(
if(j!=nb\u pt\u z-1)
).
j
属于x轴,
i
属于z轴。但这应该不是问题。您可以尝试从方案中删除三角形。因此,仅从三角形1开始,查看法线是否平滑。
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 );