使用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() 然后在阵列网格的末端附加一个新的曲面。如果什么都没有传进来, commit() 返回数组网格。

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)

# or alternatively
st.index()

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

st.deindex()

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

st.generate_normals()
st.generate_tangents()

默认情况下,生成法线时,将基于每个面计算。如果要平滑顶点法线,请在添加顶点时调用 add_smooth_group() . add_smooth_group() 在构建几何图形时需要调用,例如在调用 add_vertex() (如果没有索引)或 add_index() (如果编入索引)。