使用SurfaceTool

SurfaceTool 提供了一个有用的接口来构建几何体。这个接口类似于 ImmediateGeometry 节点。你设置每个顶点的属性(例如法线、uv、颜色),然后当你添加一个顶点时,它就会捕捉到这些属性。

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

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

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

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

st.commit(mesh)
# Or:
var mesh = st.commit()

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

var st = SurfaceTool.new()

st.begin(Mesh.PRIMITIVE_TRIANGLES)

# Prepare attributes for add_vertex.
st.add_normal(Vector3(0, 0, 1))
st.add_uv(Vector2(0, 0))
# Call last for each vertex, adds the above attributes.
st.add_vertex(Vector3(-1, -1, 0))

st.add_normal(Vector3(0, 0, 1))
st.add_uv(Vector2(0, 1))
st.add_vertex(Vector3(-1, 1, 0))

st.add_normal(Vector3(0, 0, 1))
st.add_uv(Vector2(1, 1))
st.add_vertex(Vector3(1, 1, 0))

# Commit to a mesh.
var mesh = st.commit()

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

# Creates a quad from four corner vertices.
# Add_index does not need to be called before add_vertex.
st.add_index(0)
st.add_index(1)
st.add_index(2)

st.add_index(1)
st.add_index(3)
st.add_index(2)

# Alternatively:
st.index()

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

st.deindex()

If you don't add custom normals yourself, you can add them using generate_normals(), which should be called after generating geometry and before committing the mesh using commit() or commit_to_arrays(). Calling generate_normals(true) will flip the resulting normals. As a side note, generate_normals() only works if the primitive type is set to Mesh.PRIMITIVE_TRIANGLES.

If you don't add custom tangents, they can be added with generate_tangents(), but it requires that each vertex have UVs and normals set already.

st.generate_normals()
st.generate_tangents()

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