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.get_vertex_normal(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,以了解程序化几何体生成。
注意:对于三角形基元模型的正面,i3D使用顺时针环绕顺序。
方法¶
方法说明¶
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.PRIMITIVE_TRIANGLES的Mesh。
返回此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,因为一个面只有三个边。
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) 🔗
设置给定顶点的骨骼权重。