C++ 棱锥角上的平滑法线

C++ 棱锥角上的平滑法线,c++,opengl,math,C++,Opengl,Math,因此,这些是我生成的网格的法线,在gimp中增强对比度以使其更易于查看: 网格是一个平顶金字塔。所有法线都会通过对周围面法线进行加权平均来进行适当的平滑,并且效果与预期一样 然而,正如你所看到的,在平坦的表面上有非常明显的接缝。仅使用漫反射照明,这些几乎不明显,但使用镜面反射,它们看起来很可怕 我怎样才能摆脱这些?我的第一个想法是将所有的6个顶点平铺替换为12个顶点平铺,以便它们都是相同的。然而,这当然会使网格的大小增加一倍。有没有其他方法来完成我的任务 编辑:所有角都有三角形,以适合其各自的

因此,这些是我生成的网格的法线,在gimp中增强对比度以使其更易于查看:

网格是一个平顶金字塔。所有法线都会通过对周围面法线进行加权平均来进行适当的平滑,并且效果与预期一样

然而,正如你所看到的,在平坦的表面上有非常明显的接缝。仅使用漫反射照明,这些几乎不明显,但使用镜面反射,它们看起来很可怕

我怎样才能摆脱这些?我的第一个想法是将所有的6个顶点平铺替换为12个顶点平铺,以便它们都是相同的。然而,这当然会使网格的大小增加一倍。有没有其他方法来完成我的任务

编辑:所有角都有三角形,以适合其各自的角,所有平面沿东北/西南方向分割

  • 将法线从其顶点绘制为直线,以实际查看实际发生的情况

    • 只需为每个顶点V和相应的法线N画一条线

      double V[3],N[3],tmp[3];
      for (int i=0;i<3;i++) tmp[i]=V[i]+0.3*N[i]; // 0.3 is the line size ...
      glColor3f(0.0,0.5,0.0);
      glBegin(GL_LINES);
      glVertex3dv(V);
      glVertex3dv(N);
      glEnd();
      
      double V[3],N[3],tmp[3];
      
      对于(int i=0;i1.将法线从其顶点绘制为直线,以实际观察到底发生了什么。2.求平均值后是否对法线进行了归一化处理?1:我会试试,但我不能从显示的颜色中收集所有这些信息吗?2:是的,实际上,我正在做的是获取加权周围面的法线之和,t但是如果你在代码中有一个bug,那么法线可能会被错误地计算出来,所以如果你画线,你可以直观地检查它们是否正确。我计算平均法线而不加权…看这里