OpenGL 4 - UV-координаты для куба с треугольными полосками

У меня есть куб, сделанный из треугольной полосы, и я пытаюсь найти для него UV-координаты.

vert = new VBO<Vector3>(new Vector3[] {
            new Vector3(1, 1, 1), 
            new Vector3(0, 1, 1), 
            new Vector3(1, 1, 0),
            new Vector3(0, 1, 0),
            new Vector3(1, 0, 1),
            new Vector3(0, 0, 1),
            new Vector3(0, 0, 0),
            new Vector3(1, 0, 0)
       });
ind = new VBO<uint>(new uint[] { 3, 2, 6, 7, 4, 2, 0, 3, 1, 6, 5, 4, 1, 0 }, BufferTarget.ElementArrayBuffer);

Кто-нибудь знает, какими бы они были?

1 ответ

Краткий ответ: вы можете присвоить любое значение UV-координатам, даже если они перекрываются (хотя обычно это нежелательно). Пока вы создаете UV-координату для каждой координаты вершины. Если у вас все в порядке с перекрытиями, вы можете просто объявить 8 Vector2(s) в качестве UV-координат и присвоить им любое значение от -1 до 1.

Длинный ответ:

Все зависит от того, как вы индексируете свои координаты.

UV-координаты говорят вам, как сопоставить 2D-полигональную область 2D-текстуры с геометрией 3D-модели. Должна быть координата UV для каждой координаты вершины, если ваши UV(ы) и вершины используют одни и те же индексы (что не кажется оптимальным для ваших координат вершин, как они есть).

Индексы указывают, какие из ваших координат ( 3 индекса для треугольников, 4 для квадратов) соотносятся с 2D (текстура) или 3D (модель) многоугольником. Как определены координаты ваших вершин, если вы не дублировали каждую вершину таким образом, что каждые 3 вершины определяют треугольник, вам придется использовать индексацию, чтобы указать, какая из ваших 8 вершин является многоугольником. Например, индексы { 0, 1 и 3 } указывают на верхний правый задний (здесь задний, что означает дальше по положительной оси Z) треугольник на вершине вашего куба.

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

Казалось бы, лучшим решением в этом случае было бы использование проекции куба, что я пока не знаю, как это сделать. Итак, я порекомендую то, что, как я понимаю, является следующим лучшим решением:

Дублируйте любые вершины, которые заставят UV-грани перекрывать друг друга (основание креста), и, возможно, вершины, которые вызовут слишком сильное искажение в способе применения текстуры к координатам вершин; 2 внешние вершины головы, "бедра"(?) и плеч креста будут дальше разнесены, что потребует искажения текстуры для получения желаемого результата.

Это должно привести к получению 10 координат вершин, 10 UV-координат и 36 индексов, где каждые 3 индекса определяют треугольник ( 12 треугольников).

Имейте в виду, что есть несколько способов добиться того, о чем вы просите, поэтому рекомендуется более глубокое исследование.

Визуальное представление ранее описанного выравнивания координат и индексации.

Это представляет собой дублирование координат вершины и UV с индексами 0 и 1 до индексов 8 и 9. Координаты вершин 8 и 9 содержат то же значение трехмерного местоположения, что и вершины 0 и 1, тогда как координаты UV 8 и 9 расположены ниже по оси Y оси, чем координаты 6 и 7.

Я забыл поместить это в изображение примера, но индексы в примере будут такими:

int indices[] = {
    0, 1, 2,
    1, 2, 3,
    2, 3, 4,
    3, 4, 5,
    0, 2, 4,
    0, 4, 6,
    1, 3, 5,
    1, 5, 7,
    4, 5, 6,
    5, 6, 7,
    6, 7, 8,
    7, 8, 9
}

Это даст вам 12 треугольников пространства модели и 12 треугольников UV, где каждые 3 индекса представляют собой треугольник.

РЕДАКТИРОВАТЬ: Согласно ссылке, предоставленной @Rabbid76, 14 координат вершин и UV были бы лучше, поскольку вы не получите искажения. То, что я упомянул, - это просто еще один способ сделать это, у которого есть свои взлеты и падения (больше искажений, немного меньше использования памяти).

Другие вопросы по тегам