УФ-картирование процедурного цилиндра в Unity - PullRequest
1 голос
/ 16 марта 2019

У меня есть метод, который создает цилиндр на основе переменных, которые содержат высоту, радиус и количество сторон.

Сетка генерирует отлично с любым числом сторон, однако я действительно пытаюсь понять, как этодолжен быть нанесен на УФ-карту.

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

Я думаю, что правильное размещение uv-кода, однако я понятия не имею, какие значения будут соответствовать?Прямо сейчас текстура растянута / изогнута со всех сторон сетки.Пожалуйста, помогите мне понять это.

private void _CreateSegmentSides(float height)
{
    if(m_Sides > 2) { 
        float           angleStep   = 360.0f / (float) m_Sides;
        BranchSegment   seg         = new BranchSegment(m_NextID++);
        Quaternion      rotation    = Quaternion.Euler(0.0f, angleStep, 0.0f);

        int index_tr = 0, index_tl = 3, index_br = 2, index_bl = 1;
        float u0 = (float)1 / (float) m_Sides;
        int max = m_Sides - 1;

        // Make first triangles.
        seg.vertexes.Add(rotation * (new Vector3(m_Radius, height, 0f)));
        seg.vertexes.Add(rotation * (new Vector3(m_Radius, 0f, 0f)));
        seg.vertexes.Add(rotation * seg.vertexes[seg.vertexes.Count - 1]);
        seg.vertexes.Add(rotation * seg.vertexes[seg.vertexes.Count - 3]);

        // Add triangle indices.
        seg.triangles.Add(index_tr);    // 0
        seg.triangles.Add(index_bl);    // 1
        seg.triangles.Add(index_br);    // 2
        seg.triangles.Add(index_tr);    // 0
        seg.triangles.Add(index_br);    // 2
        seg.triangles.Add(index_tl);    // 3

        seg.uv.Add(new Vector2(0, 0));
        seg.uv.Add(new Vector2(0, u0));
        seg.uv.Add(new Vector2(u0, u0));
        seg.uv.Add(new Vector2(u0, 0));

        for (int i = 0; i < max; i++)
        {
            seg.vertexes.Add(rotation * seg.vertexes[seg.vertexes.Count - 2]);      // new vertex

            seg.triangles.Add(seg.vertexes.Count - 1);  // new vertex
            seg.triangles.Add(seg.vertexes.Count - 2);  // shared
            seg.triangles.Add(seg.vertexes.Count - 3);  // shared

            seg.vertexes.Add(rotation * seg.vertexes[seg.vertexes.Count - 2]);      // new vertex

            seg.triangles.Add(seg.vertexes.Count - 3);  // shared
            seg.triangles.Add(seg.vertexes.Count - 2);  // shared
            seg.triangles.Add(seg.vertexes.Count - 1);  // new vertex

            // How should I set up the variables for this part??
            // I know they are not supposed to be zero.
            if (i % 2 == 0) {
                seg.uv.Add(new Vector2(0, 0));
                seg.uv.Add(new Vector2(0, u0));
            } else {
                seg.uv.Add(new Vector2(u0, u0));
                seg.uv.Add(new Vector2(u0, 0));
            }
        }
        m_Segments.Add(seg);
    }
    else
    {
        Debug.LogWarning("Too few sides in the segment.");
    }
}

Редактировать: Добавлены картинки

Вот так выглядит цилиндр (односторонние треугольники):

enter image description here

Вот так должен выглядеть тот же шейдер (на плоской плоскости):

enter image description here

Редактировать 2: Каркасные фото

enter image description here enter image description here

1 Ответ

0 голосов
/ 16 марта 2019

Таким образом, ваш каркас является окей (вы связали только каркас, но я попросил затененный каркас: это затененный каркас , но все в порядке).

Причина, по которой ваша текстура выглядит следующим образом,это потому, что он пытается выровнять ваше изображение вдоль любой высоты, чтобы он мог хорошо выглядеть на цилиндре высотой 1 м, но выглядел бы растянутым на цилиндре высотой 1000 м, поэтому вам действительно нужно динамически навести эту ультрафиолетовую карту.

Пример для цилиндра высотой 1 м, текстура okey, потому что это для размера 1x1: enter image description here

Пример для текстуры цилиндра высотой 2 м, растянутой из-за удвоения размера 2x1 длины:

enter image description here

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

enter image description here

...