title: Компонент Mesh
Defold по сути является 3D движком. Даже когда работа ведется только с 2D-материалом, весь рендеринг выполняется в 3D, но проецируется на экран ортографически. Defold позволяет полноценно использовать 3D-контент, добавляя и создавая 3D-сетки во время выполнения в коллекциях. Игры могут быть созданы исключительно в 3D с использованием только 3D-ассетов, или же 3D и 2D контент может совмещаться в соответствии с целями разработчика.
Компоненты сетки создаются так же, как и любой другой компонент игрового объекта. Это можно сделать двумя способами:
После создания сетки необходимо определить ряд ее свойств.
Помимо свойств 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, включая примеры проектов и фрагменты кода, можно найти в анонсе на форуме.
Компоненты 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.
Если параметр Vertex Space материала сетки установлен в Local, данные будут предоставлены в шейдере как есть, и придется преобразовывать вершины/нормали, как принято, на GPU.
Если для свойства Vertex Space материала сетки установлено значение World Space, необходимо либо предоставить поток “position” и “normal” по умолчанию, либо выбрать его из выпадающего списка при редактировании сетки. Это необходимо для того, чтобы движок мог преобразовать данные в мировое пространство для объединения с другими объектами.