では、Wavefrontオブジェクトファイルを使用して、OpenGLで4つを超える頂点を持つ面をレンダリングするにはどうすればよいですか?
頂点が3つある場合は、頂点GL_TRIANGLES
が4つある場合は使用しますが、頂点GL_QUADS
が5つ以上ある場合は、何を使用するのでしょうか。基準はありますか?
では、Wavefrontオブジェクトファイルを使用して、OpenGLで4つを超える頂点を持つ面をレンダリングするにはどうすればよいですか?
頂点が3つある場合は、頂点GL_TRIANGLES
が4つある場合は使用しますが、頂点GL_QUADS
が5つ以上ある場合は、何を使用するのでしょうか。基準はありますか?
まず、エクスポートツールに、その数の頂点を持つ面をエクスポートしないように指示する必要があります。面には3つの頂点、ピリオドが必要です。
エクスポートツールでそれができない場合は、ロードツールでポリゴンを3つの頂点面に分割する必要があります。AssetImporterライブラリがそれを実行できると確信しています。
OBJエクスポーターは、各面に対して正しい順序で頂点をエクスポートします(反時計回り)。また、面が同一平面上にあり、凸状である限り(血まみれになるはずです!)、GL_TRIANGLE_FANを使用できます。
GL_TRIANGLE_FAN
ポリゴンが上記のルールに従っている場合、使用するとコードが単純化され、システムメモリの消費量が削減されますが、顔には常に3つの頂点が必要であるというNicolBolasの指摘には同意しません。とにかくポリゴンは三角形に分解されるため、GPU側は何も変わりません。
実際には、ほとんどのwavefront-obj面は同一平面上にあり、凸状ですが、元のOBJ仕様には、これが保証されていると言っているものは何も見つかりません。
面が同一平面上にあり凸状である場合は、GL_TRIANGLE_FANを使用するか、GL_TRIANGLEを使用してファンを手動で評価することができます。ファンでは、すべての三角形が最初の頂点を共有しています。このような:
// manually generate a triangle-fan
for (int x = 1; x < (faceIndicies.Length-1); x++) {
renderIndicies.Add(faceIndicies[0]);
renderIndicies.Add(faceIndicies[x]);
renderIndicies.Add(faceIndicies[x+1]);
}
n-gonの頂点の数が多い場合は、GL_TRIANGLE_STRIPを使用するか、独自の三角ストリップを手動で作成すると、より良い視覚的結果が得られます。しかし、これはwavefrontOBJファイルでは非常にまれです。
顔が同一平面上にあるが凹面である場合は、Ear-ClippingMethodなどのアルゴリズムを使用して顔を三角測量する必要があります。
http://en.wikipedia.org/wiki/Polygon_triangulation#Ear_clipping_method
頂点が同一平面上にない場合、OBJはどの形状のテッセレーションが意図されているかを知るのに十分な情報を保持していないため、失敗します。