--- 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. ![Mesh in game object](images/mesh/mesh.png) После создания сетки необходимо определить ряд ее свойств. ### Свойства сетки Помимо свойств *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” по умолчанию, либо выбрать его из выпадающего списка при редактировании сетки. Это необходимо для того, чтобы движок мог преобразовать данные в мировое пространство для объединения с другими объектами.