2012-05-28 11 views
2

Я стараюсь соответствовать мировой текстуре на сфере. Он почти работает, но текстура повторяется дважды. Это мой код сопоставления:Raytracing сферическая текстура

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