頂点配列が呼び出され、CCW 巻きで呼び出さvertices
れるfinal
インデックス バッファーを使用して、OpenGL でポリゴンをレンダリングしています。DRAW_ORDER
バック フェース カリングを有効にして、 を使用してドロー コールを行いますglDrawElements(GL_TRIANGLES, DRAW_ORDER.capacity(), GL_UNSIGNED_SHORT, DRAW_ORDER)
。
行列変換を介して x 軸または y 軸で反射vertices
すると、反射によって頂点の向きが逆になり、 の反時計回りの巻き順と一致しなくなるため、ポリゴンがカリングされDRAW_ORDER
ます。
vertices
カリングを無効にすることで問題を防ぐことができますが、パフォーマンスのために、順列経由の向きを復元する方法を見つけたいと思います。たとえば、ポリゴンが三角形の場合、反射の後に 2 番目と 3 番目の頂点を交換するだけで、反時計回りの向きに戻すことができます。このアプローチを任意の数の頂点とインデックスを持つポリゴンに拡張するにはどうすればよいですか?
//PSEUDO-CODE FOR TRIANGLE:
final DRAW_ORDER = {0,1,2};
vertices = { {0,0}, {1,0}, {0,1} };
reflect(vertices);
swap(vertices,1,2);
編集:これは、凸面ポリゴンでは機能するように見えるが、凹面では機能しないソリューションです。
//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);
}
下の画像では、楕円 (凸) では解決策が機能するが、星 (凹) では機能しないことがわかります。