多边形到三角形的转换效果网格的可见性

时间:2016-03-01 11:41:15

标签: c++ opengl-es mesh triangulation

我正在使用OpenGl ES来可视化具有多于3个顶点的多边形的网格。我想使用以下循环将这些多边形转换为三角形。在循环中,我通过填充OpenGL索引数组来创建polygonVertexSize-2个三角形,该数组以不同的顺序和次数引用相同的顶点。

for(int j=0;j<polygonVertexSize-2;j++)   //number of triangles
   {

    //GetPolygonVertex returns the index of a polygon Vertex 
    indices[indp+0]=Polygon->GetPolygonVertex(0); 
    indices[indp+1]=Polygon->GetPolygonVertex(1+j);
    indices[indp+2]=Polygon->GetPolygonVertex(2+j);
    indp+=3;

   }

此转换的问题是,除非我应用glDisable(GL_CULL_FACE),否则网格的某些部分是不可见的。这可能意味着我的三角测量导致表面法线错误。另外需要注意的是,我使用不同三角形中相同顶点的法线来平均顶点的法线。

我该如何解决这个问题?禁用剔除来解决这个问题是一个坏主意吗?  这是剔除和没有剔除的结果 enter image description here enter image description here

1 个答案:

答案 0 :(得分:0)

问题在于back-face culling。 网格的一部分是不可见的,因为它们背对着相机。 glDisable(GL_CULL_FACE)是解决此问题的最简单方法,但这可能会导致性能问题(每个三角形都会处理两次)。但它不应该影响你的场景。 如果你想这样做&#34;对&#34;你必须改变不可见三角形的缠绕。只需交换两个顶点。

//only for invisible triangles
indices[indp+0]=Polygon->GetPolygonVertex(0); 
indices[indp+1]=Polygon->GetPolygonVertex(2+j);
indices[indp+2]=Polygon->GetPolygonVertex(1+j);

如果多边形是平面和凸面,则三角测量是正确的。您可以使用gift wrapping algorithm检查多边形是否为凸面,或者只是遍历顶点并计算dot products,如果点积的符号发生变化,多边形不是凸的