Вопрос

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

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 -текстурой и поверхностью икосаэдрона.

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

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

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

  1. При построении сетки обнаружите, находится ли треугольник на шов. Если так, отрегулируйте координаты текстуры, используя x + 1 Для каждой вершины на дальней стороне шва. Установите свою текстуру, чтобы обернуть горизонтально, и вы избавитесь от шва, по крайней мере, для большинства ваших полигонов.
  2. Еще лучше: вычислите координату текстуры в вашем фрагменте шейдера на основе нормы поверхности. Это полностью избавится от шва.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top