opengl - OpenGL 中球体的错误 UV 坐标?

标签 opengl geometry coordinates texture-mapping uv-mapping

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

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

如图所示,我的代码在球体的一侧生成长 strip 。解决方案在这里.. 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;
}

最佳答案

问题是因为您在球体周围包裹了纹理坐标。

如果我从你的地球上切出一个水平切片并将其平展,x 纹理坐标看起来像这样;

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

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

要解决它,您需要做的是在接缝周围创建一对重复的顶点,纹理坐标为 1.0。这些应该直接位于原始顶点之上,并且它们可能不应该连接到它们。纹理坐标应如下所示:

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

1.0 和 0 彼此重叠。然后顶点之间的所有区域将被均匀插值。

关于opengl - OpenGL 中球体的错误 UV 坐标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11553567/

相关文章:

java - 使用 JOGL 编译错误

c++ - OpenGL,这是绘制文本的最佳方式吗?

python - 旋转矩形直到碰到三角形,并确定交点

python - 如何以数组形式返回正方形上的点?

algorithm - 排序算法从仅具有直角的点创建多边形

iphone - 手机上的 GPS 坐标

c++ - OpenGL 顶点着色器变换,对象消失

java - 我如何计算Java中两个gps点之间的距离?

Python GeoPy 错误处理

opengl - 当 glVertexAttribPointer 没有绑​​定缓冲区时,GL_NO_ERROR