1

頂点配列が呼び出され、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);
    }

下の画像では、楕円 (凸) では解決策が機能するが、星 (凹) では機能しないことがわかります。

ここに画像の説明を入力

4

1 に答える 1

1

インデックスの順列によって巻き順を逆にするには、単にインデックスの順序を逆にすることができます。

したがって、三角形の例では、元の順序が (0, 1, 2) の場合、逆の順序は (2, 1, 0) です。すべての巡回順列は多角形の定義と同等であるため、他の有効な順序は (1, 0, 2) および (0, 2, 1) になります。しかし、逆を使用することは何でも良いです。

別の例として、インデックス (3, 17, 6, 8, 11) を使用する 5 つの頂点を持つポリゴンの場合、逆は (11, 8, 6, 17, 3) であり、次の場合にインデックスのセットとして使用できます。逆の巻き順でポリゴンをレンダリングしたい。

于 2016-07-15T03:44:05.927 に答える