2012-05-28 97 views
2

我正在嘗試在球體上貼合世界紋理。它幾乎工作,但紋理重複兩次。這是我的映射代碼:光線追蹤球形紋理

v = acosf(sp->coll->z/(double)sp->radius)/M_PI ; 
u = asinf(sp->coll->y/((double)sp->radius * sinf(v * M_PI)))/M_PI; 
u += 0.5; 
// u and v are between 0 and 1 
i = (int)((float)texture->xsize * (v - ((int)v))); 
j = (int)((float)texture->ysize * (u - ((int)u))); 
this->color = texture->map[j][i]; 

什麼可能導致此問題?

回答

1

我認爲問題在於你在u計算中丟失了一些符號信息。

對於給定的z和y對,球體上有點。要解決這個問題,您應該使用atan2而不是asin。該代碼看起來大致是這樣的:

u = atan2(sp->coll->y, sp->coll->x)/(2*PI); 

您可能需要的參數正常化atan2 - 但在大多數實現你並不需要。

+0

完美的工作:) – gfauchart