Я хочу написать сферическое отображение для моего трассировщика лучей, чтобы генерировать UV-координаты для сферы. Текстура, примененная с этим отображением, должна выглядеть так:
У меня есть сфера, которая находится на [0.0f,0.0f,0.0f]
с radius
из 20.0f
,
Для данного xyz
точку на поверхности сферы (положение, где луч от трассировщика лучей попал в сферу), я вычисляю uv
координаты с эта формула:
float u = 0.5f + atan2(point.getX(), point.getZ()) / (2 * PI);
float v = 0.5f - asin(point.getY() / radius) / PI;
Я решил вывести u
а также v
значения для проверки соответствия.
Что касается v
это выглядит вполне нормально (значения от одного полюса к другому, от 0.0f
в 1.0f
):
Но u
выглядит не очень хорошо
Не должна ли это быть сфера, где цвет зависит от XZ (одинаково для всех точек на одной и той же долготе, постепенно переходя от одной долготы к другой)?
Я не прав с интерпретацией point
, формула или что-то еще?
Разрыв в центральной линии, потому что atan2()
возвращает долготу между -π и π. Вы делите это на 2π, чтобы масштабировать его от -0,5 до 0,5, затем добавляете 0,5, чтобы масштабировать его от 0 до 1. В результате получается значение, которое скачкообразно скачет с 0 до 1, подобно тому, как местное время внезапно скачет назад на 24 часов, когда вы пересекаете международную линию дат, и по той же причине. Чтобы получить непрерывно заштрихованную сферу, сопоставьте значение u с яркостью, масштабированной до четной функции, или, что еще лучше, в качестве оттенка на цветовом круге.
Других решений пока нет …