2012-07-19 60 views
2

我在我的球體上有越野車紋理貼圖。這個問題衆所周知,但解決方案很少。OpenGL中球體的Bug座標?

這是我爲球體生成UV的代碼。

T = trinagles,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; 
} 

回答

6

這個問題是因爲你在球體周圍包裹着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之間,這意味着它翻轉和squishes整個紋理成單縫(這是你所看到的醜陋的眼淚。

爲了解決這個問題,你需要做的是在接縫周圍創建一對重複的頂點,紋理座標爲1.0,它們應該直接位於原始頂點的頂部,並且它們可能不應該與它們連接。texcoord應該如下所示:

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

隨着1.0和0位於彼此之上,那麼頂點之間的所有區域將被均勻地插值

+0

感謝您的回覆。 我不理解的是......什麼是重複的頂點對?如何創建它們?你是說我需要更新網格頂點數據?例如球體有100個頂點,爲了應用紋理貼圖,我需要更新它,假設有120或140個頂點。像那樣 ? 它不應該是這樣嗎?網格數據應該是相同的..無論如何..你可以請我建議我如何創建重複的頂點...? – furqan 2012-07-19 06:44:36

+0

我已更新新代碼。仍然有相同的難看的縫。 – furqan 2012-07-19 07:25:47

+0

一個古典的問題,但它是我見過的最好的描述方式。謝謝! – 2013-04-09 16:55:14