SurfaceToolの使用
SurfaceTool は、ジオメトリを構築するための便利なインターフェイスを提供します。このインターフェースは ImmediateMesh ノードに似ています。頂点ごとの各属性(例: normal、uv、color)を設定し、頂点を追加すると属性がキャプチャされます。
SurfaceToolは、index() や generate_normals() などの便利なヘルパー関数も提供します。
各頂点が追加される前に次の属性が追加されます:
st.set_normal() # Overwritten by normal below.
st.set_normal() # Added to next vertex.
st.set_color() # Added to next vertex.
st.add_vertex() # Captures normal and color above.
st.set_normal() # Normal never added to a vertex.
st.SetNormal(); // Overwritten by normal below.
st.SetNormal(); // Added to next vertex.
st.SetColor(); // Added to next vertex.
st.AddVertex(); // Captures normal and color above.
st.SetNormal(); // Normal never added to a vertex.
SurfaceTool を使用してジオメトリの生成が終了したら、commit() を呼び出してメッシュの生成を終了します。ArrayMesh が commit() に渡されると、ArrayMeshの最後に新しいサーフェスが追加されます。一方、何も渡されない場合、commit() はArrayMeshを返します。
st.commit(mesh)
# Or:
var mesh = st.commit()
st.Commit(mesh);
// Or:
var mesh = st.Commit();
コードはインデックス付きの三角形を作成します
var st = SurfaceTool.new()
st.begin(Mesh.PRIMITIVE_TRIANGLES)
# Prepare attributes for add_vertex.
st.set_normal(Vector3(0, 0, 1))
st.set_uv(Vector2(0, 0))
# Call last for each vertex, adds the above attributes.
st.add_vertex(Vector3(-1, -1, 0))
st.set_normal(Vector3(0, 0, 1))
st.set_uv(Vector2(0, 1))
st.add_vertex(Vector3(-1, 1, 0))
st.set_normal(Vector3(0, 0, 1))
st.set_uv(Vector2(1, 1))
st.add_vertex(Vector3(1, 1, 0))
# Commit to a mesh.
var mesh = st.commit()
var st = new SurfaceTool();
st.Begin(Mesh.PrimitiveType.Triangles);
// Prepare attributes for AddVertex.
st.SetNormal(new Vector3(0, 0, 1));
st.SetUV(new Vector2(0, 0));
// Call last for each vertex, adds the above attributes.
st.AddVertex(new Vector3(-1, -1, 0));
st.SetNormal(new Vector3(0, 0, 1));
st.SetUV(new Vector2(0, 1));
st.AddVertex(new Vector3(-1, 1, 0));
st.SetNormal(new Vector3(0, 0, 1));
st.SetUV(new Vector2(1, 1));
st.AddVertex(new 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()
// Creates a quad from four corner vertices.
// AddIndex does not need to be called before AddVertex.
st.AddIndex(0);
st.AddIndex(1);
st.AddIndex(2);
st.AddIndex(1);
st.AddIndex(3);
st.AddIndex(2);
// Alternatively:
st.Index();
同様に、インデックス配列があるが、各頂点を一意にしたい場合(たとえば、頂点ごとではなく面ごとに一意の法線または色を使用するため)、deindex() を呼び出すことができます。
st.deindex()
st.Deindex();
カスタム法線を自分で追加しない場合は、 generate_normals() を使用して法線を自動生成できます。これはジオメトリを生成した後、 commit() または commit_to_arrays() を使用してメッシュをコミットする前に呼び出す必要があります。 generate_normals(true) を呼び出すと結果の法線が反転します。補足として generate_normals() は、プリミティブ タイプが Mesh.PRIMITIVE_TRIANGLES に設定されている場合にのみ機能します。
生成されたメッシュでは、法線マッピングやその他のマテリアル プロパティが壊れているように見えることがあります。これは法線マッピングではメッシュに法線とは別の接線が含まれることが 必要 であるためです。カスタム接線は手動で追加するか、 generate_tangents() を使用して自動的に生成することができます。この方法では各頂点に UV と法線が既に設定されている必要があります。
st.generate_normals()
st.generate_tangents()
st.GenerateNormals();
st.GenerateTangents();
デフォルトでは、法線を生成するとき、それらは面ごとに計算されます。滑らかな頂点法線が必要な場合、頂点を追加するときに add_smooth_group() を呼び出します。ジオメトリの構築中に add_smooth_group() を呼び出す必要があります。例えば、`` add_vertex()`` (インデックス化されていない場合)または add_index() (インデックス化されている場合)の呼び出しの前にです。