Attention: Here be dragons
This is the latest
(unstable) version of this documentation, which may document features
not available in or compatible with released stable versions of Godot.
Checking the stable version of the documentation...
MeshDataTool
Наследует: RefCounted < Object
Вспомогательный инструмент для доступа и редактирования данных Mesh.
Описание
MeshDataTool предоставляет доступ к отдельным вершинам в Mesh. Он позволяет пользователям читать и редактировать данные вершин сеток. Он также создает массив граней и ребер.
Чтобы использовать MeshDataTool, загрузите сетку с помощью create_from_surface(). Когда вы закончите редактирование данных, зафиксируйте данные в сетке с помощью commit_to_surface().
Ниже приведен пример того, как можно использовать MeshDataTool.
var mesh = ArrayMesh.new()
mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, BoxMesh.new().get_mesh_arrays())
var mdt = MeshDataTool.new()
mdt.create_from_surface(mesh, 0)
for i in range(mdt.get_vertex_count()):
var vertex = mdt.get_vertex(i)
# В этом примере мы расширяем сетку на одну единицу, что приводит к разделению граней, поскольку она имеет плоское затенение.
vertex += mdt.get_vertex_normal(i)
# Сохраните изменения.
mdt.set_vertex(i, vertex)
mesh.clear_surfaces()
mdt.commit_to_surface(mesh)
var mi = MeshInstance.new()
mi.mesh = mesh
add_child(mi)
var mesh = new ArrayMesh();
mesh.AddSurfaceFromArrays(Mesh.PrimitiveType.Triangles, new BoxMesh().GetMeshArrays());
var mdt = new MeshDataTool();
mdt.CreateFromSurface(mesh, 0);
for (var i = 0; i < mdt.GetVertexCount(); i++)
{
Vector3 vertex = mdt.GetVertex(i);
// В этом примере мы расширяем сетку на одну единицу, что приводит к разделению граней, поскольку она имеет плоское затенение.
vertex += mdt.GetVertexNormal(i);
// Сохраните изменения.
mdt.SetVertex(i, vertex);
}
mesh.ClearSurfaces();
mdt.CommitToSurface(mesh);
var mi = new MeshInstance();
mi.Mesh = mesh;
AddChild(mi);
См. также ArrayMesh, ImmediateMesh и SurfaceTool для создания процедурной геометрии.
Примечание: Godot использует по часовой стрелке порядок намотки для передних граней примитивных режимов треугольников.
Обучающие материалы
Методы
Описания метода
void clear() 🔗
Очищает все текущие данные в MeshDataTool.
Error commit_to_surface(mesh: ArrayMesh, compression_flags: int = 0) 🔗
Добавляет новую поверхность к указанному Mesh с отредактированными данными.
Error create_from_surface(mesh: ArrayMesh, surface: int) 🔗
Использует указанную поверхность заданной Mesh для заполнения данных для MeshDataTool.
Требуется Mesh с примитивным типом Mesh.PRIMITIVE_TRIANGLES.
Возвращает количество ребер в этом Mesh-е.
PackedInt32Array get_edge_faces(idx: int) const 🔗
Возвращает массив граней (Faces), касающихся заданного ребра.
Variant get_edge_meta(idx: int) const 🔗
Возвращает мета-информацию, назначенную данному ребру.
int get_edge_vertex(idx: int, vertex: int) const 🔗
Возвращает индекс указанной вершины vertex, соединённой с ребром с индексом idx.
vertex может быть только 0 или 1, поскольку ребра состоят из двух вершин.
Возвращает количество граней в этом Mesh-е.
int get_face_edge(idx: int, edge: int) const 🔗
Возвращает ребро, связанное с гранью с индексом idx.
Аргумент edge должен иметь значение 0, 1 или 2, поскольку грань имеет только три ребра.
Variant get_face_meta(idx: int) const 🔗
Возвращает метаданные, связанные с указанным лицом (Face).
Vector3 get_face_normal(idx: int) const 🔗
Вычисляет и возвращает нормаль заданной грани (Face).
int get_face_vertex(idx: int, vertex: int) const 🔗
Возвращает указанный индекс вершины заданной грани.
vertex должен быть либо 0, 1, либо 2, поскольку грани содержат три вершины.
var index = mesh_data_tool.get_face_vertex(0, 1) # Получает индекс второй вершины первой грани.
var position = mesh_data_tool.get_vertex(index)
var normal = mesh_data_tool.get_vertex_normal(index)
int index = meshDataTool.GetFaceVertex(0, 1); // Получает индекс второй вершины первой грани.
Vector3 position = meshDataTool.GetVertex(index);
Vector3 normal = meshDataTool.GetVertexNormal(index);
Возвращает формат Mesh как комбинацию флагов ArrayFormat. Например, сетка, содержащая как вершины, так и нормали, вернет формат 3, поскольку Mesh.ARRAY_FORMAT_VERTEX — это 1, а Mesh.ARRAY_FORMAT_NORMAL — это 2.
Material get_material() const 🔗
Возвращает материал, назначенный Mesh.
Vector3 get_vertex(idx: int) const 🔗
Возвращает положение заданной вершины.
PackedInt32Array get_vertex_bones(idx: int) const 🔗
Возвращает кости указанной вершины.
Color get_vertex_color(idx: int) const 🔗
Возвращает цвет заданной вершины.
int get_vertex_count() const 🔗
Возвращает общее количество вершин в Mesh.
PackedInt32Array get_vertex_edges(idx: int) const 🔗
Возвращает массив ребер, имеющих общую вершину.
PackedInt32Array get_vertex_faces(idx: int) const 🔗
Возвращает массив граней (Faces), имеющих общую вершину.
Variant get_vertex_meta(idx: int) const 🔗
Возвращает метаданные, связанные с заданной вершиной.
Vector3 get_vertex_normal(idx: int) const 🔗
Возвращает нормаль заданной вершины.
Plane get_vertex_tangent(idx: int) const 🔗
Возвращает тангенс заданной вершины.
Vector2 get_vertex_uv(idx: int) const 🔗
Возвращает UV заданной вершины.
Vector2 get_vertex_uv2(idx: int) const 🔗
Возвращает UV2 заданной вершины.
PackedFloat32Array get_vertex_weights(idx: int) const 🔗
Возвращает вес костей заданной вершины.
void set_edge_meta(idx: int, meta: Variant) 🔗
Устанавливает метаданные указанного ребра.
void set_face_meta(idx: int, meta: Variant) 🔗
Устанавливает метаданные указанной грани (Faces).
void set_material(material: Material) 🔗
Устанавливает материал, который будет использоваться для вновь созданной Mesh.
void set_vertex(idx: int, vertex: Vector3) 🔗
Устанавливает положение заданной вершины.
void set_vertex_bones(idx: int, bones: PackedInt32Array) 🔗
Устанавливает кости заданной вершины.
void set_vertex_color(idx: int, color: Color) 🔗
Устанавливает цвет заданной вершины.
void set_vertex_meta(idx: int, meta: Variant) 🔗
Устанавливает метаданные, связанные с заданной вершиной.
void set_vertex_normal(idx: int, normal: Vector3) 🔗
Устанавливает нормаль заданной вершины.
void set_vertex_tangent(idx: int, tangent: Plane) 🔗
Задает касательную к заданной вершине.
Примечание: Хотя tangent является Plane, он не представляет собой непосредственно касательную плоскость. Его Plane.x, Plane.y и Plane.z представляют собой касательный вектор, а Plane.d должен быть либо -1, либо 1. См. также Mesh.ARRAY_TANGENT.
void set_vertex_uv(idx: int, uv: Vector2) 🔗
Устанавливает UV заданной вершины.
void set_vertex_uv2(idx: int, uv2: Vector2) 🔗
Устанавливает UV2 заданной вершины.
void set_vertex_weights(idx: int, weights: PackedFloat32Array) 🔗
Устанавливает вес костей заданной вершины.