Використання 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.
When finished generating your geometry with the SurfaceTool
call commit()
to finish generating the mesh. If an ArrayMesh is passed
to commit()
then it appends a new surface to the end of the ArrayMesh. While if nothing is passed
in, commit()
returns an 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()
, але вона потребує щоб кожна вершина вже мала задані текстурні координати та нормалі.
st.generate_normals()
st.generate_tangents()
Типово, нормалі обчислюються окремо для кожного трикутника окремо. Якщо ж ви хочете щоб ваша поверхня була гладенькою, перед тим як додавати вершини до неї, викличіть add_smooth_group()
. Функцію потрібно застосовувати не пізніше виклику add_vertex()
(для не індексованої геометрії) або add_index()
(для індексованої).