0

私はopengl(3.0)で球をレンダリングしようとしています。以下のアルゴリズムは、頂点とそれに応じたインデックスを計算します。全体としては非常にうまく機能しますが、マトリックスにグリッチがあるようです。球の中に醜いコーンができます。

ここに画像の説明を入力

vertices.resize(rings * segments * 3);
colors.resize(rings * segments * 3);
indices.resize(6 * rings * segments);

auto v = vertices.begin();
auto c = colors.begin();
auto i = indices.begin();

auto dTheta = M_PI / (f32)rings;
auto dPhi   = 2 * M_PI / (f32)segments;

for ( u32 ring = 0; ring < rings; ++ring ) {
    auto r0 = radius * sinf(ring * dTheta);
    auto y0 = radius * cosf(ring * dTheta);
    for ( u32 segment = 0; segment < segments; ++segment ) {
        auto x0 = r0 * sinf(segment * dPhi);
        auto z0 = r0 * cosf(segment * dPhi);

        *v++ = x0;  *c++ = color.r;
        *v++ = y0;  *c++ = color.g;
        *v++ = z0;  *c++ = color.b;

        if (ring < rings) {
            *i++ = ( (ring  ) * segments ) + segment;
            *i++ = ( (ring+1) * segments ) + segment;
            *i++ = ( (ring+1) * segments ) + segment + 1;
            *i++ = ( (ring+1) * segments ) + segment + 1;
            *i++ = ( (ring  ) * segments ) + segment + 1;
            *i++ = ( (ring  ) * segments ) + segment;
        }
    }
}

私が欠けているものを知っていますか?

4

1 に答える 1

3
*i++ = ( (ring+1) * segments ) + segment + 1;
*i++ = ( (ring+1) * segments ) + segment + 1;
*i++ = ( (ring  ) * segments ) + segment + 1;

segmentが に等しい場合、どの指数を計算しますsegments - 1か? はい、次のセグメントからインデックスを取得します。

次のセグメントがない場合は?次に、ポイントのリストの外にあるインデックスを取得します。

セグメントの増分は 0 にラップする必要があります。

*i++ = ( (ring+1) * segments ) + (segment + 1) % segments;
*i++ = ( (ring+1) * segments ) + (segment + 1) % segments;
*i++ = ( (ring  ) * segments ) + (segment + 1) % segments;

また、ringが に等しい場合に何が起こるかを考えてみましょうrings - 1。同じ問題ですが、別の解決策が必要です。あなたのif発言は間違っています。そのはず:

if((ring + 1) < rings)
于 2013-05-04T09:17:03.220 に答える