Використання 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()
(для індексованої).