Отображение текстуры икосаэдра OpenGL

В настоящее время у меня нет решения для наложения текстуры икосаэдра без шва от полюса к полюсу. Кажется, что наложение текстуры этого примитива является обычной проблемой, которая еще не полностью решена. Я провел много исследований и попробовал много разных подходов для генерации UV-координат, самый близкий (и самый маленький) подход это:

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, каждый из которых показывает другой вариант шва.

3 ответа

Решение

Вам нужно изменить текстурное изображение, текстурное изображение, которое у вас есть, является искажением сферы, где полюс растянут в линию, вы никогда не сможете правильно сопоставить это с икосаэдром, для этого вам понадобится деление больше похоже на систему долготы и широты, из которой исходит такое искажение. Вместо этого вам нужно изображение текстуры, где полюс разбит на несколько различных точек. Вы можете увидеть это на некоторых картах мира, где они пытаются минимизировать искажение от отображения сферы на плоскую поверхность. например, http://www.planetaryvisions.com/Project.php?pid=2236

Вы можете найти полезную информацию о различных способах текстурирования сферы на http://www.vterrain.org/Textures/spherical.html

Поверхность икосаэдра имеет топологию сферы. Поверхность 2D текстуры имеет топологию плоскости. Между сферой и плоскостью не существует диффеоморфизма. То есть нет отображения без растяжек и разрывов между 2D-текстурой и поверхностью икосаэдра.

Тем не менее, существует соответствие между кубической картой и икосаэдром.

Я понимаю, что этот вопрос старый, но поскольку никто не упомянул следующее решение, я решил ответить.

Два возможных решения:

  1. При построении сетки определите, находится ли треугольник на шве. Если это так, скорректируйте координаты текстуры с помощью x + 1 для каждой вершины на дальней стороне шва. Установите текстуру горизонтально, и вы избавитесь от шва, по крайней мере, для большинства ваших полигонов.
  2. Еще лучше: вычислить координату текстуры в вашем фрагментном шейдере, основываясь на нормали поверхности. Это избавит от шва полностью.
Другие вопросы по тегам