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

Какие данные хранит Mesh?

2.0 Middle🔥 141 комментариев
#Рендеринг и графика

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

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

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

Структура и данные Mesh в Unity

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

Основные данные, которые хранит Mesh, можно разделить на несколько ключевых категорий.

1. Основные массивы вершин и топологии

Это ядро любой сетки. Данные хранятся в виде массивов (чаще всего массивов Vector3).

  • Массив вершин (vertices):
    *   Самый важный массив. Содержит координаты (`Vector3`) каждой вершины в **локальном пространстве** объекта (Local Space).
    *   Положение вершин относительно центра (pivot point) меша.
```csharp
Vector3[] vertices = mesh.vertices;
```
  • Массив треугольников (triangles):
    *   Определяет **топологию** — как вершины соединяются в полигоны (треугольники).
    *   Это массив целых чисел (`int[]`), где каждые три последовательных индекса образуют один треугольник. Индексы ссылаются на элементы массива `vertices`.
    *   Порядок вершин (по или против часовой стрелки) определяет **нормаль** полигона и, соответственно, его лицевую сторону (задается правилом левой или правой руки в настройках рендеринга).
```csharp
int[] triangles = mesh.triangles; // Например: [0, 1, 2, 2, 1, 3] - это два треугольника
```

2. Данные для освещения и затенения

Для корректного расчета освещения и применения материалов меш хранит дополнительные атрибуты вершин.

  • Нормали (normals):
    *   Массив `Vector3`. Нормаль вершины — это единичный вектор, направленный перпендикулярно к поверхности в данной точке. Критически важны для расчета **диффузного (по Ламберту)** и **отраженного (по Фонгу)** освещения.
    *   Если нормали не заданы, их можно вычислить автоматически (`mesh.RecalculateNormals()`).
```csharp
Vector3[] normals = mesh.normals;
```
  • Координаты UV (uv):
    *   Массив `Vector2`. Определяют, как 2D-текстура (из материала) накладывается на 3D-геометрию. Координаты (U, V) соответствуют осям (X, Y) текстуры в диапазоне, обычно, от 0 до 1.
    *   Для сложных материалов может использоваться несколько каналов UV (например, `uv2`, `uv3` для наложения световой карты (Lightmap) или детализации).
```csharp
Vector2[] uv = mesh.uv;
```
  • Тангенты (tangents):
    *   Массив `Vector4`. Вектор тангенса (касательный) необходим для корректной работы **нормальных карт (Normal Maps)**, которые симулируют мелкую детализацию без увеличения полигонов. Четвертый компонент (`.w`) обычно равен +1 или -1 и задает направление бинормали.
```csharp
Vector4[] tangents = mesh.tangents;
```

3. Дополнительные и производные данные

  • Цвета вершин (colors):
    *   Массив `Color` или `Color32`. Позволяют задать цвет для каждой вершины, который затем смешивается с цветом материала. Часто используется для тонирования, затемнения или простых эффектов.
```csharp
Color[] colors = mesh.colors;
```
  • Координаты UV для Lightmapping (uv2):
    *   Второй канал UV, специально запеченный и оптимизированный для развертки световой карты. Генерируется в окне **UV Editor** или автоматически.

  • Индексы костей и веса (boneWeights):
    *   Ключевые данные для **скелетной анимации (Skinned Mesh Rendering)**. Определяют, какие кости из `SkinnedMeshRenderer` и с каким весом (влиянием) воздействуют на каждую вершину, позволяя ей плавно деформироваться.

  • Границы (bounds):
    *   Структура `Bounds` (прямоугольная область в пространстве). Представляет собой **AABB (Axis-Aligned Bounding Box)** меша в его локальном пространстве. Используется системой **отсечения (Culling)** для определения, виден ли меш камере, без анализа каждой вершины. Может быть пересчитан автоматически.

Важность управления данными Mesh

Работа с данными меша напрямую (например, в MeshFilter.sharedMesh) должна производиться с осторожностью, так как это разделяемый ресурс. Изменения повлияют на все объекты, использующие этот меш. Для уникальной модификации в рантайме следует создавать копию через Instantiate() или работать с MeshFilter.mesh (что создает копию "на лету").

Итог: Mesh в Unity — это структурированный набор данных, содержащий:

  1. Геометрию: вершины и индексы треугольников.
  2. Данные для рендеринга: нормали, UV, тангенты для текстур и освещения.
  3. Данные для доп. функций: цвета, веса костей, UV2 для запекания.
  4. Служебные данные: границы для оптимизации.

Понимание состава Mesh необходимо для задач procedural generation, оптимизации (например, уменьшение количества вершин или атрибутов), создания сложных шейдерных эффектов и реализации пользовательской скелетной анимации.