2

球にバグのあるテクスチャマップがあります。この問題はよく知られていますが、解決策はまれです。

これは、球のUVを生成するための私のコードです。

T =三角形、Nv=頂点法線。

for (int i=0; i<nbF; i++)
{
    float tx1 = atan2(Nv[T[i].v1].x, Nv[T[i].v1].z) / (2.0f*M_PI) + 0.5f;
    float ty1 = asinf(Nv[T[i].v1].y) / M_PI + 0.5f;

    float tx2 = atan2(Nv[T[i].v2].x, Nv[T[i].v2].z) / (2.0f*M_PI) + 0.5f;
    float ty2 = asinf(Nv[T[i].v2].y) / M_PI + 0.5f;

    float tx3 = atan2(Nv[T[i].v3].x, Nv[T[i].v3].z) / (2.0f*M_PI) + 0.5f;
    float ty3 = asinf(Nv[T[i].v3].y) / M_PI + 0.5f;

    float n = 0.75f;

    if(tx2 < n && tx1 > n)
        tx2 += 1.0;
    else if(tx2 > n && tx1 < n)
        tx2 -= 1.0;

    if(tx3 < n && tx2 > n)
        tx3 += 1.0;
    else if(tx3 > n && tx2 < n)
        tx3 -= 1.0;

    out_UV[T[i].v1].u = tx1;
    out_UV[T[i].v1].v = ty1; 

    out_UV[T[i].v2].u = tx2;
    out_UV[T[i].v2].v = ty2;

    out_UV[T[i].v3].u = tx3;
    out_UV[T[i].v3].v = ty3;
}

出力: http: //i.stack.imgur.com/luhgZ.jpg ![ここに画像の説明を入力] [1]

図からわかるように、私のコードは球の片側に長いストリップを生成しています。解決策はここにあります..http://sol.gfxile.net/sphere/index.htmlしかし、それを理解できませんでした..どうすればこの問題を解決できますか?なにか提案を?

# Update 1:#

このコードも私には機能しません。何が悪いのかわかりません。それでも私が得ているのと同じ醜い縫い目。???

for (int i=0; i<nbV; i++)
{
    out_UV[i].u = (float) atan2(Nv[i].x, Nv[i].z) / (2.0f*M_PI) + 0.5f;
    out_UV[i].v =  (float) (asin(Nv[i].y) / M_PI) + 0.5f;
}

float nx = 0.9f;
float nv = 0.8f;
for (int i=0; i<nbV-2; i++)
{
    if (out_UV[i].u - out_UV[i+1].u > nx)
        out_UV[i+1].u += 1.0f;
    if (out_UV[i+1].u - out_UV[i].u > nx)
        out_UV[i].u += 1.0f;

    if (out_UV[i].u - out_UV[i+2].u > nx)
        out_UV[i+2].u += 1.0f;
    if (out_UV[i+2].u - out_UV[i].u > nx)
        out_UV[i].u += 1.0f;

    if (out_UV[i+1].u - out_UV[i+2].u > nx)
        out_UV[i+2].u += 1.0f;
    if (out_UV[i+2].u - out_UV[i+1].u > nx)
        out_UV[i+1].u += 1.0f;

    if (out_UV[i].v - out_UV[i+1].v > nv)
        out_UV[i+1].v += 1.0f;
    if (out_UV[i+1].v - out_UV[i].v > nv)
        out_UV[i].v += 1.0f;

    if (out_UV[i].v - out_UV[i+2].v > nv)
        out_UV[i+2].v += 1.0f;
    if (out_UV[i+2].v - out_UV[i].v > nv)
        out_UV[i].v += 1.0f;

    if (out_UV[i+1].v - out_UV[i+2].v > nv)
        out_UV[i+2].v += 1.0f;
    if (out_UV[i+2].v - out_UV[i+1].v > nv)
        out_UV[i+1].v += 1.0f;
}
4

1 に答える 1

6

問題は、球の周りにtexcoordをラップしているためです。

地球儀を水平にスライスして平らに伸ばすと、xtexcoordsは次のようになります。

0.7    0.8    0.9     0     0.1    0.2    0.3    0.4
 |------|------|------|------|------|------|------| 
                ^^^^^^
                      |-wrapping around here

醜い縫い目は、私がカラットでマークしたエリアから来てい(^)ます。他のすべての頂点の間で、テクスチャ座標はからにうまく補間さnn+0.1ます。ただし、頂点の最後のペアでは、との間で補間されています0.90つまり、テクスチャ全体が反転して1つの継ぎ目に押しつぶされます(これは、見ている醜い裂け目です)。

これを解決するには、テクスチャ座標1.0を使用して、シームの周りに頂点の複製ペアを作成する必要があります。これらは元の頂点の上に直接好きである必要があり、おそらくそれらに接続するべきではありません。texcoordは次のようになります。

                     1.0
0.7    0.8    0.9     |0     0.1    0.2    0.3    0.4
 |------|------|------||------|------|------|------| 

1.0と0が重なり合っています。次に、頂点間のすべての領域が均等に補間されます。

于 2012-07-19T05:29:54.823 に答える