球车UV坐标在OpenGL?(Buggy UV coordinates of sphere in O

2019-09-19 18:23发布

我有我的球车纹理贴图。 问题是众所周知的,但解决方案是罕见的。

这是我的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;
}

Answer 1:

这个问题是因为你周围包裹球体texcoords。

如果我把你的地球的水平切片和伸展出来持平,X texcoords是这个样子;

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

丑陋的接缝来自该地区的我已经打上了克拉(^) 在所有其他顶点之间,纹理坐标是很好的从内插nn+0.1 。 然而在最后的顶点对,它被插一路之间0.90 ,这意味着它翻转和squishes整个纹理成单缝(这是你所看到的丑陋的眼泪。

为了解决这个问题,你需要做的是创建一个重复的对周围的接缝顶点,纹理坐标1.0。 这些应该直接想在原来的顶点的顶部,所以它们可能无法连接到它们。 该texcoord应该是这样的:

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

与1.0和0躺在彼此的顶部上。 然后顶点之间的所有区域将被均匀地插入。



文章来源: Buggy UV coordinates of sphere in OpenGL?