Отображение текстуры икосаэдра OpenGL - PullRequest
3 голосов
/ 15 января 2011

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

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 ]

3 голосов
/ 15 января 2011

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

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

3 голосов
/ 15 января 2011

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

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

0 голосов
/ 16 октября 2018

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

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

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