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 🔗
返回与给定边相邻的面数组。
Variant get_edge_meta(idx: int) const 🔗
返回给定边的元数据。
int get_edge_vertex(idx: int, vertex: int) const 🔗
返回连接到给定边的指定顶点的索引。
顶点参数只能是 0 或 1,因为边是由两个顶点组成的。
返回这个 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 🔗
返回给定面的指定顶点索引。
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 🔗
返回共享给定顶点的面数组。
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) 🔗
设置给定顶点的骨骼权重。