SurfaceToolの使用

SurfaceTool は、ジオメトリを構築するための便利なインターフェイスを提供します。このインターフェースは ImmediateGeometry ノードに似ています。頂点ごとの各属性(例: normal、uv、color)を設定し、頂点を追加すると属性がキャプチャされます。

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() を呼び出してメッシュの生成を終了します。ArrayMeshcommit() に渡されると、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()

自分でカスタム法線を追加しない場合は、generate_normals() を使用して追加できます。同じことが接線にも当てはまります。

st.generate_normals()
st.generate_tangents()

デフォルトでは、法線を生成するとき、それらは面ごとに計算されます。滑らかな頂点法線が必要な場合、頂点を追加するときに add_smooth_group() を呼び出します。ジオメトリの構築中に add_smooth_group() を呼び出す必要があります。例えば、`` add_vertex()`` (インデックス化されていない場合)または add_index() (インデックス化されている場合)の呼び出しの前にです。