---
title: Компонент Mesh
brief: Это руководство описывает методы создания 3D-сеток во время выполнения игры.
---
# Компонент Mesh
Defold по сути является 3D движком. Даже когда работа ведется только с 2D-материалом, весь рендеринг выполняется в 3D, но проецируется на экран ортографически. Defold позволяет полноценно использовать 3D-контент, добавляя и создавая 3D-сетки во время выполнения в коллекциях. Игры могут быть созданы исключительно в 3D с использованием только 3D-ассетов, или же 3D и 2D контент может совмещаться в соответствии с целями разработчика.
## Создание компонента Mesh
Компоненты сетки создаются так же, как и любой другой компонент игрового объекта. Это можно сделать двумя способами:
- Создайте *файл Mesh*, кликнув ПКМ в нужном расположении в браузере *Assets* и выбрав New... ▸ Mesh.
- Создайте компонент, встроенный непосредственно в игровой объект, кликнув ПКМ по игровому объекту в представлении *Outline* и выбрав Add Component ▸ Mesh.

После создания сетки необходимо определить ряд ее свойств.
### Свойства сетки
Помимо свойств *Id*, *Position* и *Rotation* существуют следующие специфичные для компонента свойства:
*Material*
: Материал, используемый для рендеринга сетки.
*Vertices*
: Файл буфера, описывающий данные сетки для каждого потока.
*Primitive Type*
: Lines, Triangles или Triangle Strip.
*Position Stream*
: Это свойство должно быть именем потока *position*. Этот поток автоматически предоставляется в качестве входных данных для вертексного шейдера.
*Normal Stream*
: Это свойство должно быть именем потока *normal*. Этот поток автоматически предоставляется в качестве входных данных для вертексного шейдера.
*tex0*
: Задает текстуру, используемую для сетки.
## Манипулирование в редакторе
После того, как компонент сетки размещен, можно свободно редактировать и манипулировать компонентом и/или объемлющим игровым объектом с помощью обычных инструментов *Scene Editor*, перемещая, вращая и масштабируя сетку по своему усмотрению.
## Манипулирование во время выполнения
Используя буферы, сетками можно манипулировать во время выполнения.
```Lua
-- cube
local vertices = {
0, 0, 0,
0, 1, 0,
1, 0, 0,
1, 1, 0,
1, 1, 1,
0, 1, 0,
0, 1, 1,
0, 0, 1,
1, 1, 1,
1, 0, 1,
1, 0, 0,
0, 0, 1,
0, 0, 0,
0, 1, 0
}
-- create a buffer with a position stream
local buf = buffer.create(#vertices / 3, {
{ name = hash("position"), type=buffer.VALUE_TYPE_FLOAT32, count = 3 }
})
-- get the position stream and write the vertices
local positions = buffer.get_stream(buf, "position")
for i, value in ipairs(vertices) do
positions[i] = vertices[i]
end
-- set the buffer with the vertices on the mesh
local res = go.get("#mesh", "vertices")
resource.set_buffer(res, buf)
```
Дополнительную информацию об использовании компонента Mesh, включая примеры проектов и фрагменты кода, можно найти в [анонсе на форуме](https://forum.defold.com/t/mesh-component-in-defold-1-2-169-beta/65137).
## Отсечение по усеченной пирамиде (Frustum culling)
Компоненты Mesh не отсеиваются автоматически из-за их динамической природы и невозможности заранее определить, как закодированы данные о положении. Чтобы включить отсечение, необходимо задать axis-aligned ограничивающий прямоугольник (AABB) в виде метаданных буфера, используя 6 чисел с плавающей точкой (минимальные и максимальные значения по осям):
```lua
buffer.set_metadata(buf, hash("AABB"), { 0, 0, 0, 1, 1, 1 }, buffer.VALUE_TYPE_FLOAT32)
```
## Константы материала
{% include shared/material-constants.md component='mesh' variable='tint' %}
`tint`
: Цветовой оттенок сетки (`vector4`). Для представления оттенка с компонентами x, y, z и w, соответствующими красному, зеленому, синему и альфа оттенкам, используется тип vector4.
## Локальное vs мировое пространство вершин
Если параметр Vertex Space материала сетки установлен в Local, данные будут предоставлены в шейдере как есть, и придется преобразовывать вершины/нормали, как принято, на GPU.
Если для свойства Vertex Space материала сетки установлено значение World Space, необходимо либо предоставить поток “position” и “normal” по умолчанию, либо выбрать его из выпадающего списка при редактировании сетки. Это необходимо для того, чтобы движок мог преобразовать данные в мировое пространство для объединения с другими объектами.