← Назад к вопросам

Что такое Mesh?

1.2 Junior🔥 182 комментариев
#Рендеринг и графика#Ресурсы и ассеты

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое Mesh (Сетка) в Unity?

Mesh (Сетка или Полигональная сетка) — это фундаментальный объект в компьютерной графике и ядро визуализации 3D-объектов в Unity. По своей сути, Mesh — это коллекция вершин, ребер и граней (полигонов), которые математически определяют форму и геометрию трехмерного объекта. Это не текстурная модель и не игровой объект (GameObject), а именно его геометрический «скелет» или «каркас», данные о котором хранятся в виде массивов.

В Unity класс Mesh является контейнером для этих данных и ключевым компонентом системы рендеринга. Без Mesh объект не может быть отрисован движком. Он используется в паре с компонентами MeshFilter (хранит ссылку на Mesh-данные) и MeshRenderer (отвечает за отрисовку этих данных с применением материалов).

Ключевые компоненты структуры Mesh

Данные Mesh организованы в несколько основных массивов:

  1. Вершины (Vertices) — Массив Vector3. Это самые важные данные, определяющие точки в локальном пространстве объекта, из которых строится геометрия.
  2. Треугольники (Triangles) — Массив целых чисел (int). Определяет, как вершины соединяются в полигоны (треугольники). Каждые три индекса в массиве образуют один треугольник, ссылаясь на вершины из массива vertices.
    // Простой пример: создание квадрата из двух треугольников.
    Vector3[] vertices = new Vector3[4];
    vertices[0] = new Vector3(0, 0, 0);
    vertices[1] = new Vector3(1, 0, 0);
    vertices[2] = new Vector3(0, 1, 0);
    vertices[3] = new Vector3(1, 1, 0);
    
    int[] triangles = new int[6];
    // Первый треугольник (0, 2, 1)
    triangles[0] = 0;
    triangles[1] = 2;
    triangles[2] = 1;
    // Второй треугольник (2, 3, 1)
    triangles[3] = 2;
    triangles[4] = 3;
    triangles[5] = 1;
    
    Mesh mesh = new Mesh();
    mesh.vertices = vertices;
    // Очень важно: порядок вершин (по или против часовой стрелки) определяет лицевую сторону треугольника!
    mesh.triangles = triangles;
    
  3. Нормали (Normals) — Массив Vector3. Векторы, перпендикулярные поверхности в каждой вершине. Критически важны для расчета освещения (закона Ламберта) и определения ориентации грани (лицевая/задняя).
    // Для плоского квадрата все нормали могут смотреть вверх.
    Vector3[] normals = new Vector3[4];
    normals[0] = Vector3.up;
    normals[1] = Vector3.up;
    normals[2] = Vector3.up;
    normals[3] = Vector3.up;
    mesh.normals = normals;
    
  4. UV-координаты (UVs) — Массив Vector2. Определяют проекцию 2D-текстуры на 3D-геометрию. Координаты (U, V) в диапазоне [0, 1] указывают, какой части текстуры соответствует вершина.

Также Mesh может содержать данные для более сложного рендеринга: касательные (tangents) для нормальных карт (bump mapping), цвета вершин (colors), несколько наборов UV (uv2, uv3, uv4) для наложения световых карт (lightmapping) или дополнительных текстур.

Практическое значение и применение

  • Основа всех 3D-моделей: Любой импортированный из Blender, Maya или созданный в Unity объект — это, прежде всего, Mesh.
  • Процедурная генерация: Позволяет создавать геометрию на лету с помощью кода (террейн, разрушаемые объекты, спецэффекты, архитектурные генераторы).
    // Пример: процедурная генерация простой плоскости.
    Mesh GeneratePlane(int width, int length) {
        Mesh mesh = new Mesh();
        List<Vector3> verts = new List<Vector3>();
        List<int> tris = new List<int>();
    
        for (int x = 0; x < width; x++) {
            for (int z = 0; z < length; z++) {
                verts.Add(new Vector3(x, 0, z));
                if (x < width - 1 && z < length - 1) {
                    int i = x * length + z;
                    // Два треугольника на квад
                    tris.Add(i);
                    tris.Add(i + length);
                    tris.Add(i + 1);
    
                    tris.Add(i + 1);
                    tris.Add(i + length);
                    tris.Add(i + length + 1);
                }
            }
        }
        mesh.SetVertices(verts);
        mesh.SetTriangles(tris, 0);
        mesh.RecalculateNormals(); // Автоматический расчет нормалей
        mesh.RecalculateBounds();
        return mesh;
    }
    
  • Оптимизация: Работа с Mesh на низком уровне — ключ к оптимизации: объединение мешей (mesh combining), Level of Detail (LOD), упрощение полигонов, эффективное использование подмешей (submeshes) для одного материала.
  • Визуальные эффекты: Морфинг, деформации вершин (травяной покров, вода), тесселяция — все это манипуляции с данными Mesh.

Важные технические аспекты

  • Топология: В Unity (и реальном времени) используются почти исключительно треугольники. Более сложные полигоны (NGons) разбиваются на треугольники.
  • Ориентация: Порядок вершин в треугольнике (по или против часовой стрелки) определяет, какая сторона является лицевой (front face). Это важно для отсечения задних граней (backface culling) и double-sided материалов.
  • Производительность: Основные метрики — количество вершин и количество треугольников. Сложный Mesh требует больше ресурсов CPU (трансформация вершин, culling) и GPU (растеризация, пиксельные шейдеры). Оптимизация часто сводится к их уменьшению без потери визуального качества.

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