Використання SurfaceTool

SurfaceTool— це зручний інструмент для побудови геометрії. Принцип роботи з ним схожий до такого в ImmediateGeometry. Ви задаєте властивості кожної вершини (нормаль, текстурні координати, колір) по черзі і потім додана вершина вибере свої атрибути серед заданих раніше.

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() щоб завершити побудову меша. Якщо до функції commit() передати ArrayMesh то раніше створена геометрія буде додана до ArrayMesh в кінець списку. Якщо ж до функції нічого не передати, то вона сама поверне 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(), яка повинна викликатись після того як геометрія була створена, але ще не записана до об'єкта функціями commit() чи commit_to_arrays(). Виклик generate_normals(true) виверне нормалі навиворіт. Між іншим, generate_normals() працює лише тоді, коли тип геометрії заданий як Mesh.PRIMITIVE_TRIANGLES.

Ви можете помітити, що відображення нормалей або інші властивості матеріалу на згенерованому меші виглядають з порушеннями. Це пов'язано з тим, що для відображення нормалей меша потрібні особливі дотичні, які відокремлені від нормалей. Ви можете додати власні дотичні вручну, або згенерувати їх автоматично за допомогою generate_tangents(). Цей метод вимагає, щоб кожна вершина мала вже встановлені UV і нормалі.

st.generate_normals()
st.generate_tangents()

Типово, нормалі обчислюються окремо для кожного трикутника окремо. Якщо ж ви хочете щоб ваша поверхня була гладенькою, перед тим як додавати вершини до неї, викличіть add_smooth_group(). Функцію потрібно застосовувати не пізніше виклику add_vertex() (для не індексованої геометрії) або add_index() (для індексованої).