使用SurfaceTool
SurfaceTool 提供了一个有用的接口来构建几何体。这个接口类似于 ImmediateGeometry 节点。你设置每个顶点的属性(例如法线、uv、颜色),然后当你添加一个顶点时,它就会捕捉到这些属性。
index() 和 generate_normals() .
属性是在添加每个顶点之前添加的:
GDScript
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.
GDScript
st.commit(mesh)# Or:var mesh = st.commit()
代码创建一个有索引的三角形 GDScript
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() 将顶点数组缩小以删除重复的顶点.
GDScript
# 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() .
GDScript
st.deindex()
**generate_normals()` 来添加,调用时机应该是在生成几何体之后、使用commit()或commit_to_arrays()提交网格之前。调用generate_normals(true)会将最终的法线翻转。另外请注意,generate_normals()只有在图元类型为Mesh.PRIMITIVE_TRIANGLES时有效。generate_tangents()` 来添加,不过这个函数要求每个顶点都已经设好 UV 和法线。
GDScript
st.generate_normals()st.generate_tangents()
add_smooth_group() . add_smooth_group() 需要在建立几何体时调用, 例如在调用 add_vertex() (如果没有索引)或 add_index() (如果有索引)之前.
