【问题标题】:Buggy UV coordinates of sphere in OpenGL?OpenGL中球体的UV坐标有问题?
【发布时间】:2012-07-18 05:00:00
【问题描述】:

我的球体上有错误的纹理贴图。这个问题众所周知,但很少有解决方案。

这是我为球体生成 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;
}

【问题讨论】:

    标签: opengl geometry coordinates texture-mapping uv-mapping


    【解决方案1】:

    问题是因为您将 texcoords 包裹在球体周围。

    如果我将你的地球水平切片并将其展开,x texcoords 看起来像这样;

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

    丑陋的接缝来自我标有克拉(^) 的区域。在所有其他顶点之间,纹理坐标很好地从n 插值到n+0.1。然而,在最后一对顶点上,它一直在 0.90 之间进行插值,这意味着它将整个纹理翻转并挤压到单个接缝中(这是您看到的丑陋撕裂。

    要解决这个问题,您需要在接缝周围创建一对重复的顶点,纹理坐标为 1.0。这些应该直接位于原始顶点的顶部,并且它们可能不应该连接到它们。 texcoord 应该是这样的:

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

    1.0 和 0 相互重叠。然后顶点之间的所有区域将被平均插值。

    【讨论】:

    • 感谢您的友好回复。我不明白的是..什么是重复的顶点对?如何创建它们?你的意思是我需要更新网格顶点数据?例如,球体有 100 个顶点,为了应用纹理贴图,我需要用假设 120 或 140 来更新它。像那样 ?不应该是我想的那样吧?网格数据应该是相同的......无论如何......你能建议我如何创建重复的顶点......?
    • 我已经更新了新代码。仍然有同样丑陋的接缝。
    • 一个经典的问题,但却是我见过的最好的描述方式。谢谢!
    猜你喜欢
    • 2013-12-07
    • 1970-01-01
    • 2011-12-12
    • 2020-12-18
    • 1970-01-01
    • 2018-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多