MeshDataTool

继承: RefCounted < Object

用于访问和编辑 Mesh 数据的辅助工具。

描述

MeshDataTool 提供对 Mesh 中各个顶点的访问。它允许用户读取和编辑网格的顶点数据。它还创建了一系列面和边。

要使用 MeshDataTool,请使用 create_from_surface 加载一个网格。完成数据编辑后,使用 commit_to_surface 将数据提交到一个网格。

下面是如何使用 MeshDataTool 的示例。

GDScriptC#

  1. var mesh = ArrayMesh.new()
  2. mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, BoxMesh.new().get_mesh_arrays())
  3. var mdt = MeshDataTool.new()
  4. mdt.create_from_surface(mesh, 0)
  5. for i in range(mdt.get_vertex_count()):
  6. var vertex = mdt.get_vertex(i)
  7. # 在这个例子中,我们将网格挤出一个单位,这会导致分离的面,因为它是平直着色的。
  8. vertex += mdt.get_vertex_normal(i)
  9. # 保存你的更改。
  10. mdt.set_vertex(i, vertex)
  11. mesh.clear_surfaces()
  12. mdt.commit_to_surface(mesh)
  13. var mi = MeshInstance.new()
  14. mi.mesh = mesh
  15. add_child(mi)
  1. var mesh = new ArrayMesh();
  2. mesh.AddSurfaceFromArrays(Mesh.PrimitiveType.Triangles, new BoxMesh().GetMeshArrays());
  3. var mdt = new MeshDataTool();
  4. mdt.CreateFromSurface(mesh, 0);
  5. for (var i = 0; i < mdt.GetVertexCount(); i++)
  6. {
  7. Vector3 vertex = mdt.GetVertex(i);
  8. // 在这个例子中,我们将网格挤出一个单位,这会导致分离的面,因为它是平直着色的。
  9. vertex += mdt.GetVertexNormal(i);
  10. // 保存你的更改。
  11. mdt.SetVertex(i, vertex);
  12. }
  13. mesh.ClearSurfaces();
  14. mdt.CommitToSurface(mesh);
  15. var mi = new MeshInstance();
  16. mi.Mesh = mesh;
  17. AddChild(mi);

另请参阅 ArrayMeshImmediateMeshSurfaceTool,以了解程序化几何生成。

注意:对于三角形基元模式的前面,Godot 使用顺时针缠绕顺序

教程

方法

void

clear()

Error

commit_to_surface(mesh: ArrayMesh, compression_flags: int = 0)

Error

create_from_surface(mesh: ArrayMesh, surface: int)

int

get_edge_count() const

PackedInt32Array

get_edge_faces(idx: int) const

Variant

get_edge_meta(idx: int) const

int

get_edge_vertex(idx: int, vertex: int) const

int

get_face_count() const

int

get_face_edge(idx: int, edge: int) const

Variant

get_face_meta(idx: int) const

Vector3

get_face_normal(idx: int) const

int

get_face_vertex(idx: int, vertex: int) const

int

get_format() const

Material

get_material() const

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

PackedInt32Array

get_vertex_edges(idx: int) const

PackedInt32Array

get_vertex_faces(idx: int) const

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

Vector2

get_vertex_uv2(idx: int) const

PackedFloat32Array

get_vertex_weights(idx: int) const

void

set_edge_meta(idx: int, meta: Variant)

void

set_face_meta(idx: int, meta: Variant)

void

set_material(material: Material)

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)

void

set_vertex_uv(idx: int, uv: Vector2)

void

set_vertex_uv2(idx: int, uv2: Vector2)

void

set_vertex_weights(idx: int, weights: PackedFloat32Array)


方法说明

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


int get_edge_count() const 🔗

返回这个 Mesh 的边数。


PackedInt32Array get_edge_faces(idx: int) const 🔗

返回与给定边相邻的面数组。


Variant get_edge_meta(idx: int) const 🔗

返回给定边的元数据。


int get_edge_vertex(idx: int, vertex: int) const 🔗

返回连接到给定边的指定顶点的索引。

顶点参数只能是 0 或 1,因为边是由两个顶点组成的。


int get_face_count() const 🔗

返回这个 Mesh 中的面数。


int get_face_edge(idx: int, edge: int) const 🔗

返回与给定面关联的指定边。

边参数必须是 0、1、2 之一,因为面只有 3 条边。


Variant get_face_meta(idx: int) const 🔗

返回与给定面关联的元数据。


Vector3 get_face_normal(idx: int) const 🔗

计算并返回给定面的面法线。


int get_face_vertex(idx: int, vertex: int) const 🔗

返回给定面的指定顶点索引。

顶点参数必须为 0、1 或 2,因为面包含三个顶点。

示例:

GDScriptC#

  1. var index = mesh_data_tool.get_face_vertex(0, 1) # 获取第一个面的第二个顶点的索引。
  2. var position = mesh_data_tool.get_vertex(index)
  3. var normal = mesh_data_tool.get_vertex_normal(index)
  1. int index = meshDataTool.GetFaceVertex(0, 1); // 获取第一个面的第二个顶点的索引。
  2. Vector3 position = meshDataTool.GetVertex(index);
  3. Vector3 normal = meshDataTool.GetVertexNormal(index);

int get_format() const 🔗

Mesh 的格式返回为 ArrayFormat 标志的组合。例如,包含顶点和法线的网格将返回为 3 的格式,因为 Mesh.ARRAY_FORMAT_VERTEX1,而 Mesh.ARRAY_FORMAT_NORMAL2


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 🔗

返回共享给定顶点的面数组。


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) 🔗

设置给定面的元数据。


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) 🔗

设置给定顶点的切线。


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) 🔗

设置给定顶点的骨骼权重。