首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在x或y轴上反射顶点后,如何恢复CCW缠绕顺序?

在x或y轴上反射顶点后,如何恢复CCW缠绕顺序?
EN

Stack Overflow用户
提问于 2016-07-14 02:23:54
回答 1查看 616关注 0票数 1

我在OpenGL中渲染一个多边形,使用一个名为vertices的顶点数组和一个名为DRAW_ORDERfinal索引缓冲区。我启用了背面剔除,并使用glDrawElements(GL_TRIANGLES, DRAW_ORDER.capacity(), GL_UNSIGNED_SHORT, DRAW_ORDER)进行绘制调用。

当我通过矩阵变换在x或y轴上反射vertices时,多边形将被剔除,因为反射颠倒了顶点的方向,因此它们不再与DRAW_ORDER的逆时针缠绕顺序匹配。

我可以通过禁用剔除来防止这个问题,但出于性能考虑,我宁愿找到一种方法来通过置换恢复vertices的方向。例如,如果多边形是一个三角形,我可以简单地交换反射后的第二个和第三个顶点来恢复CCW方向。如何将此方法扩展到具有任意数量的顶点和索引的多边形?

代码语言:javascript
复制
  //PSEUDO-CODE FOR TRIANGLE:
    final DRAW_ORDER = {0,1,2};
    vertices = { {0,0}, {1,0}, {0,1} };
    reflect(vertices);
    swap(vertices,1,2);

编辑:这里有一个似乎适用于凸多边形的解决方案,但不适用于凹多边形。

代码语言:javascript
复制
    //Reverse the order of the vertices so, for example, 
    //vertices {v1,v2,v3,v4,v5} become {v5,v4,v3,v2,v1}
    for(int start = 0, end = vertices.length-1; start<end; start++, end--){
        swap(vertices,start,end);
    }

您可以在下图中看到椭圆(凸形)而不是星形(凹形)的解决方案是如何工作的。

EN

回答 1

Stack Overflow用户

发布于 2016-07-15 11:44:06

要通过索引的排列来颠倒缠绕顺序,您可以简单地颠倒索引的顺序。

因此,对于您的三角形示例,如果原始顺序为(0,1,2),则反向顺序为(2,1,0)。由于所有循环排列对于定义多边形来说都是等价的,因此其他有效的顺序将是(1,0,2)和(0,2,1)。但是使用相反的方法是最好的。

作为另一个示例,对于具有5个顶点的多边形,使用索引(3,17,6,8,11),反转为(11,8,6,17,3),当您要使用相反的缠绕顺序渲染多边形时,可以将其用作索引集。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38359158

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档