2012-05-28 96 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