我正在尝试在球体上拟合世界纹理。它几乎可以工作,但纹理重复两次。这是我的映射代码:
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];
可能导致此问题的原因是什么?
答案 0 :(得分:1)
我认为问题在于你在u计算中丢失了一些标志信息。
对于给定的z和y对,球体上有点。要解决这种歧义,您应该使用atan2
而不是asin
。代码看起来大致如下:
u = atan2(sp->coll->y, sp->coll->x)/(2*PI);
您可能需要将参数规范化为atan2
- 但在大多数实现中您不需要。