使用SurfaceTool

The SurfaceTool provides a useful interface for constructing geometry. The interface is similar to the ImmediateGeometry node. You set each per-vertex attribute (e.g. normal, uv, color) and then when you add a vertex it captures the attributes.

SurfaceTool还提供了一些有用的辅助函数,如 index()generate_normals() .

属性是在添加每个顶点之前添加的:

GDScript

  1. st.add_normal() # Overwritten by normal below.
  2. st.add_normal() # Added to next vertex.
  3. st.add_color() # Added to next vertex.
  4. st.add_vertex() # Captures normal and color above.
  5. st.add_normal() # Normal never added to a vertex.

当使用 SurfaceTool <class_surfacetool>`完成生成几何体后,调用 ``commit()` 完成生成网格.如果将一个 ArrayMesh <class_ArrayMesh>`传递给 ``commit()` ,那么它就会在ArrayMesh的末尾附加一个新的曲面.而如果没有传递任何信息, commit() 则返回一个ArrayMesh.

GDScript

  1. st.commit(mesh)
  2. # Or:
  3. var mesh = st.commit()

代码创建一个有索引的三角形

GDScript

  1. var st = SurfaceTool.new()
  2. st.begin(Mesh.PRIMITIVE_TRIANGLES)
  3. # Prepare attributes for add_vertex.
  4. st.add_normal(Vector3(0, 0, 1))
  5. st.add_uv(Vector2(0, 0))
  6. # Call last for each vertex, adds the above attributes.
  7. st.add_vertex(Vector3(-1, -1, 0))
  8. st.add_normal(Vector3(0, 0, 1))
  9. st.add_uv(Vector2(0, 1))
  10. st.add_vertex(Vector3(-1, 1, 0))
  11. st.add_normal(Vector3(0, 0, 1))
  12. st.add_uv(Vector2(1, 1))
  13. st.add_vertex(Vector3(1, 1, 0))
  14. # Commit to a mesh.
  15. var mesh = st.commit()

你可以选择添加一个索引数组,可以通过调用 add_index() 将顶点添加到索引数组中,也可以通过调用 index() 将顶点数组缩小以删除重复的顶点.

GDScript

  1. # Creates a quad from four corner vertices.
  2. # Add_index does not need to be called before add_vertex.
  3. st.add_index(0)
  4. st.add_index(1)
  5. st.add_index(2)
  6. st.add_index(1)
  7. st.add_index(3)
  8. st.add_index(2)
  9. # Alternatively:
  10. st.index()

同样,如果你有一个索引数组,但希望每个顶点都是唯一的(例如,因为想在每个面而不是每个顶点使用唯一的法线或颜色),可以调用 deindex() .

GDScript

  1. st.deindex()

如果你不自己添加自定义法线,你可以使用 generate_normals() 添加.切线也是如此.

GDScript

  1. st.generate_normals()
  2. st.generate_tangents()

默认情况下,当生成法线时,它们将以每个面为基础进行计算.如果想要平滑的顶点法线,在添加顶点时,调用 add_smooth_group() . add_smooth_group() 需要在建立几何体时调用,例如在调用 add_vertex() (如果没有索引)或 add_index() (如果有索引)之前.