mesh.md 6.7 KB


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

После создания сетки необходимо определить ряд ее свойств.

Свойства сетки

Помимо свойств Id, Position и Rotation существуют следующие специфичные для компонента свойства:

Material : Материал, используемый для рендеринга сетки.

Vertices : Файл буфера, описывающий данные сетки для каждого потока.

Primitive Type : Lines, Triangles или Triangle Strip.

Position Stream : Это свойство должно быть именем потока position. Этот поток автоматически предоставляется в качестве входных данных для вертексного шейдера.

Normal Stream : Это свойство должно быть именем потока normal. Этот поток автоматически предоставляется в качестве входных данных для вертексного шейдера.

tex0 : Задает текстуру, используемую для сетки.

Манипулирование в редакторе

После того, как компонент сетки размещен, можно свободно редактировать и манипулировать компонентом и/или объемлющим игровым объектом с помощью обычных инструментов Scene Editor, перемещая, вращая и масштабируя сетку по своему усмотрению.

Манипулирование во время выполнения

Используя буферы, сетками можно манипулировать во время выполнения.


-- 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, включая примеры проектов и фрагменты кода, можно найти в анонсе на форуме.

Отсечение по усеченной пирамиде (Frustum culling)

Компоненты Mesh не отсеиваются автоматически из-за их динамической природы и невозможности заранее определить, как закодированы данные о положении. Чтобы включить отсечение, необходимо задать axis-aligned ограничивающий прямоугольник (AABB) в виде метаданных буфера, используя 6 чисел с плавающей точкой (минимальные и максимальные значения по осям):

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” по умолчанию, либо выбрать его из выпадающего списка при редактировании сетки. Это необходимо для того, чтобы движок мог преобразовать данные в мировое пространство для объединения с другими объектами.