OpenGL Icosahedron Mapping Texture
Вопрос
В настоящее время у меня нет решения для картирования текстуры икосаэдр без шва с шеста на полюс. Сопоставление текстуры этого примитива, по -видимому, является общей проблемой, которая еще не полностью решена. Я провел много исследований, и я попробовал множество различных подходов для создания координат УФ, самый близлежащий (и самый маленький) подход - это:
GLfloat u = 0.5f * ( 1.0f + atan2( z , x ) * ( 1 / M_PI ));
GLfloat v = acos( y ) * ( 1 / M_PI );
Икосаэдр или геосфера является частью различных рамок с открытым исходным кодом, таких как JmonkeyEngine или Geist3D, но ни одна из реализаций не работает правильно. Не должно быть невозможно отобразить развернутую прямоугольную текстуру или я ошибаюсь? Приглашается каждый фрагмент кода.
Я загрузил проект Xcode здесь который построен с OpenFrameWorks 0,61 для iPhone. Внутри также есть два файла PNG, каждый из них показывает еще одно изменение шов.
Решение
Вам нужно изменить изображение текстуры, изображение текстур, которое у вас есть, представляет собой искажение сферы, где полюс растягивается в линию, вы никогда не сможете правильно сопоставить это с икосаэдром, чтобы сделать это, чтобы вам понадобится разделение больше похоже на систему долготы и широты, из которой происходит такое искажение. Вместо этого вам нужно изображение текстуры, где полюс разбит на несколько отдельных точек. Вы можете увидеть это на некоторых картах мира, где они пытаются свести к минимуму искажения от картирования сферы на плоскую поверхность. например http://www.planetaryvisions.com/project.php?pid=2236
Вы можете найти хорошую информацию о разных способах текстуры сферы на http://www.vterrain.org/textures/spherical.html
Другие советы
Поверхность икосаэдрона имеет топологию сферы. Поверхность 2D -текстуры имеет топологию плоскости. Не существует диффеоморфизма между сферой и плоскостью. То есть нет картирования без участков и слез между 2D -текстурой и поверхностью икосаэдрона.
Тем не менее, существует отображение между кубиком и икосаэдром.
Я понимаю, что этот вопрос старый, но, поскольку никто не упомянул следующее решение, я подумал, что отвечу.
Два возможных решения:
- При построении сетки обнаружите, находится ли треугольник на шов. Если так, отрегулируйте координаты текстуры, используя
x + 1
Для каждой вершины на дальней стороне шва. Установите свою текстуру, чтобы обернуть горизонтально, и вы избавитесь от шва, по крайней мере, для большинства ваших полигонов. - Еще лучше: вычислите координату текстуры в вашем фрагменте шейдера на основе нормы поверхности. Это полностью избавится от шва.