max*_*yne 2 opengl geometry texture-mapping coordinates 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;
}
Run Code Online (Sandbox Code Playgroud)
输出:http: //i.stack.imgur.com/luhgZ.jpg ![在此处输入图像说明] [1]
正如您在图中所看到的,我的代码在球体的一侧生成长条带.解决方案在这里.. http://sol.gfxile.net/sphere/index.html但无法弄清楚..我该如何解决这个问题?有什么建议吗?
# Update 1:#
Run Code Online (Sandbox Code Playgroud)
这段代码也不适用于我..我不知道它有什么问题.我仍然得到同样难看的缝隙.???
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;
}
Run Code Online (Sandbox Code Playgroud)
问题是因为你在球体周围包裹着texcoords.
如果我把你的地球的一个水平切片拉伸平整,x texcoords看起来像这样;
0.7 0.8 0.9 0 0.1 0.2 0.3 0.4
|------|------|------|------|------|------|------|
^^^^^^
|-wrapping around here
Run Code Online (Sandbox Code Playgroud)
丑陋的缝隙来自我用克拉标记的区域(^)
.在所有其他顶点之间,纹理坐标很好地插入n
到n+0.1
.然而在最后的顶点对,它被插所有的方法0.9
和0
,这意味着它翻转和squishes整个纹理成单缝(这是你所看到的丑陋的眼泪.
要解决这个问题,您需要做的是在接缝周围创建一对重复的顶点,纹理坐标为1.0.这些应该直接在原始顶点之上,并且它们可能不应该连接到它们.texcoord应如下所示:
1.0
0.7 0.8 0.9 |0 0.1 0.2 0.3 0.4
|------|------|------||------|------|------|------|
Run Code Online (Sandbox Code Playgroud)
随着1.0和0位于彼此的顶部.然后将均匀地插入顶点之间的所有区域.