SurfaceTool
Наследует: RefCounted < Object
Вспомогательный инструмент для создания геометрии.
Описание
SurfaceTool используется для построения Mesh путем указания атрибутов вершин по отдельности. Его можно использовать для построения Mesh из скрипта. Все свойства, кроме индексов, необходимо добавить до вызова add_vertex(). Например, чтобы добавить цвета вершин и UV:
var st = SurfaceTool.new()
st.begin(Mesh.PRIMITIVE_TRIANGLES)
st.set_color(Color(1, 0, 0))
st.set_uv(Vector2(0, 0))
st.add_vertex(Vector3(0, 0, 0))
var st = new SurfaceTool();
st.Begin(Mesh.PrimitiveType.Triangles);
st.SetColor(new Color(1, 0, 0));
st.SetUV(new Vector2(0, 0));
st.AddVertex(new Vector3(0, 0, 0));
Вышеуказанный SurfaceTool теперь содержит одну вершину треугольника, которая имеет координату UV и указанный Color. Если бы была добавлена другая вершина без вызова set_uv() или set_color(), то использовались бы последние значения.
Атрибуты вершины должны быть переданы перед вызовом add_vertex(). Невыполнение этого требования приведет к ошибке при фиксации информации о вершине в сетке.
Кроме того, атрибуты, используемые до добавления первой вершины, определяют формат сетки. Например, если вы добавляете UV только к первой вершине, вы не можете добавить цвет ни к одной из последующих вершин.
См. также ArrayMesh, ImmediateMesh и MeshDataTool для процедурной генерации геометрии.
Примечание: Годо использует порядок намотки по часовой стрелке для передних граней примитивных режимов треугольника.
Обучающие материалы
Методы
void |
|
void |
add_triangle_fan(vertices: PackedVector3Array, uvs: PackedVector2Array = PackedVector2Array(), colors: PackedColorArray = PackedColorArray(), uv2s: PackedVector2Array = PackedVector2Array(), normals: PackedVector3Array = PackedVector3Array(), tangents: Array[Plane] = []) |
void |
add_vertex(vertex: Vector3) |
void |
append_from(existing: Mesh, surface: int, transform: Transform3D) |
void |
begin(primitive: PrimitiveType) |
void |
clear() |
void |
create_from(existing: Mesh, surface: int) |
void |
create_from_arrays(arrays: Array, primitive_type: PrimitiveType = 3) |
void |
create_from_blend_shape(existing: Mesh, surface: int, blend_shape: String) |
void |
deindex() |
generate_lod(nd_threshold: float, target_index_count: int = 3) |
|
void |
generate_normals(flip: bool = false) |
void |
|
get_aabb() const |
|
get_custom_format(channel_index: int) const |
|
get_primitive_type() const |
|
get_skin_weight_count() const |
|
void |
index() |
void |
|
void |
set_bones(bones: PackedInt32Array) |
void |
|
void |
set_custom(channel_index: int, custom_color: Color) |
void |
set_custom_format(channel_index: int, format: CustomFormat) |
void |
set_material(material: Material) |
void |
set_normal(normal: Vector3) |
void |
set_skin_weight_count(count: SkinWeightCount) |
void |
set_smooth_group(index: int) |
void |
set_tangent(tangent: Plane) |
void |
|
void |
|
void |
set_weights(weights: PackedFloat32Array) |
Перечисления
enum CustomFormat: 🔗
CustomFormat CUSTOM_RGBA8_UNORM = 0
Ограничивает диапазон данных, передаваемых в set_custom(), беззнаковыми нормализованными значениями от 0 до 1, хранящимися в 8 битах на канал. См. Mesh.ARRAY_CUSTOM_RGBA8_UNORM.
CustomFormat CUSTOM_RGBA8_SNORM = 1
Ограничивает диапазон данных, передаваемых в set_custom(), до нормализованных со знаком от -1 до 1, хранящихся в 8 битах на канал. См. Mesh.ARRAY_CUSTOM_RGBA8_SNORM.
CustomFormat CUSTOM_RG_HALF = 2
Сохраняет данные, переданные в set_custom(), как числа с плавающей точкой половинной точности (half precision float) и использует только каналы красного и зеленого цветов. См. Mesh.ARRAY_CUSTOM_RG_HALF.
CustomFormat CUSTOM_RGBA_HALF = 3
Сохраняет данные, переданные в set_custom(), как числа с плавающей точкой половинной точности (half precision float) и использует все цветовые каналы. См. Mesh.ARRAY_CUSTOM_RGBA_HALF.
CustomFormat CUSTOM_R_FLOAT = 4
Сохраняет данные, переданные в set_custom(), как числа с плавающей точкой полной точности (full precision float) и использует только красный цветовой канал. См. Mesh.ARRAY_CUSTOM_R_FLOAT.
CustomFormat CUSTOM_RG_FLOAT = 5
Сохраняет данные, переданные в set_custom(), как числа с плавающей точкой полной точности (full precision float) и использует только каналы красного и зеленого цветов. См. Mesh.ARRAY_CUSTOM_RG_FLOAT.
CustomFormat CUSTOM_RGB_FLOAT = 6
Сохраняет данные, переданные в set_custom(), как числа с плавающей точкой полной точности (full precision float) и использует только каналы красного, зеленого и синего цвета. См. Mesh.ARRAY_CUSTOM_RGB_FLOAT.
CustomFormat CUSTOM_RGBA_FLOAT = 7
Сохраняет данные, переданные в methodset_custom, как числа с плавающей точкой полной точности (full precision float) и использует все цветовые каналы. См. Mesh.ARRAY_CUSTOM_RGBA_FLOAT.
CustomFormat CUSTOM_MAX = 8
Используется для обозначения отключенного пользовательского канала.
enum SkinWeightCount: 🔗
SkinWeightCount SKIN_4_WEIGHTS = 0
На каждую отдельную вершину могут влиять только 4 веса костей.
SkinWeightCount SKIN_8_WEIGHTS = 1
На каждую отдельную вершину может влиять до 8 весов костей.
Описания метода
Добавляет вершину в индексный массив, если вы используете индексированные вершины. Не нужно вызывать перед добавлением вершин.
void add_triangle_fan(vertices: PackedVector3Array, uvs: PackedVector2Array = PackedVector2Array(), colors: PackedColorArray = PackedColorArray(), uv2s: PackedVector2Array = PackedVector2Array(), normals: PackedVector3Array = PackedVector3Array(), tangents: Array[Plane] = []) 🔗
Вставляет треугольный веер, созданный из массива данных, в создаваемую Mesh.
Требует, чтобы тип примитива был установлен на Mesh.PRIMITIVE_TRIANGLES.
void add_vertex(vertex: Vector3) 🔗
Указывает положение текущей вершины. Следует вызывать после указания других свойств вершины (например, цвета, UV).
void append_from(existing: Mesh, surface: int, transform: Transform3D) 🔗
Добавить вершины из заданной поверхности Mesh в текущий массив вершин с указанным Transform3D.
void begin(primitive: PrimitiveType) 🔗
Вызывается перед добавлением вершин. Принимает примитивный тип в качестве аргумента (например, Mesh.PRIMITIVE_TRIANGLES).
void clear() 🔗
Очистите всю информацию, переданную на данный момент в surface tool.
ArrayMesh commit(existing: ArrayMesh = null, flags: int = 0) 🔗
Возвращает сконструированный ArrayMesh из текущей переданной информации. Если существующая ArrayMesh передана в качестве аргумента, добавит дополнительную поверхность к существующей ArrayMesh.
Аргумент flags может быть побитовым ИЛИ Mesh.ARRAY_FLAG_USE_DYNAMIC_UPDATE, Mesh.ARRAY_FLAG_USE_8_BONE_WEIGHTS или Mesh.ARRAY_FLAG_USES_EMPTY_VERTEX_ARRAY.
Фиксирует данные в том же формате, который используется ArrayMesh.add_surface_from_arrays(), ImporterMesh.add_surface() и create_from_arrays(). Таким образом, вы можете дополнительно обрабатывать данные сетки с помощью API ArrayMesh или ImporterMesh.
void create_from(existing: Mesh, surface: int) 🔗
Создает массив вершин из существующего Mesh'а.
void create_from_arrays(arrays: Array, primitive_type: PrimitiveType = 3) 🔗
Создает этот SurfaceTool из существующих массивов вершин, таких как возвращаемые commit_to_arrays(), Mesh.surface_get_arrays(), Mesh.surface_get_blend_shape_arrays(), ImporterMesh.get_surface_arrays() и ImporterMesh.get_surface_blend_shape_arrays(). primitive_type управляет типом данных сетки, по умолчанию равным Mesh.PRIMITIVE_TRIANGLES.
void create_from_blend_shape(existing: Mesh, surface: int, blend_shape: String) 🔗
Создает массив вершин из указанной формы смешивания (blend shape) существующей в Mesh. Это может быть использовано для извлечения определенной позы из формы смешивания.
void deindex() 🔗
Удаляет массив индексов путем расширения массива вершин.
PackedInt32Array generate_lod(nd_threshold: float, target_index_count: int = 3) 🔗
Устарело: This method is unused internally, as it does not preserve normals or UVs. Consider using ImporterMesh.generate_lods() instead.
Генерирует LOD для заданного nd_threshold в линейных единицах (квадратный корень квадратичной метрики ошибки), используя не более target_index_count индексов.
void generate_normals(flip: bool = false) 🔗
Генерирует нормали из вершин, поэтому вам не придется делать это вручную. Если flip равен true, результирующие нормали будут инвертированы. generate_normals() следует вызывать после генерации геометрии и до фиксации сетки с помощью commit() или commit_to_arrays(). Для корректного отображения поверхностей с отображением нормалей вам также придется генерировать касательные с помощью generate_tangents().
Примечание: generate_normals() работает только в том случае, если тип примитива установлен на Mesh.PRIMITIVE_TRIANGLES.
Примечание: generate_normals() учитывает группы сглаживания. Для генерации гладких нормалей установите для гладкой группы значение большее или равное 0 с помощью set_smooth_group() или оставьте для гладкой группы значение по умолчанию 0. Для генерации плоских нормалей установите для гладкой группы значение -1 с помощью set_smooth_group() перед добавлением вершин.
void generate_tangents() 🔗
Генерирует касательный вектор для каждой вершины. Требует, чтобы каждая вершина уже имела UV и нормали (см. generate_normals()).
Возвращает выровненный по осям ограничивающий прямоугольник позиций вершин.
CustomFormat get_custom_format(channel_index: int) const 🔗
Возвращает формат для пользовательского channel_index (в настоящее время до 4). Возвращает CUSTOM_MAX, если этот пользовательский канал не используется.
PrimitiveType get_primitive_type() const 🔗
Возвращает тип геометрии сетки, например Mesh.PRIMITIVE_TRIANGLES.
SkinWeightCount get_skin_weight_count() const 🔗
По умолчанию возвращает SKIN_4_WEIGHTS, чтобы указать, что используются только 4 влияния костей на вершину.
Возвращает SKIN_8_WEIGHTS, если используется до 8 влияний.
Примечание: Эта функция возвращает перечисление, а не точное количество весов.
void index() 🔗
Сжимает массив вершин, создавая массив индексов. Это может повысить производительность, избегая повторного использования вершин.
void optimize_indices_for_cache() 🔗
Оптимизирует сортировку треугольников для производительности. Требует, чтобы get_primitive_type() был Mesh.PRIMITIVE_TRIANGLES.
void set_bones(bones: PackedInt32Array) 🔗
Указывает массив костей, которые будут использоваться для следующей вершины. bones должен содержать 4 целых числа.
void set_color(color: Color) 🔗
Указывает Color, который будет использоваться для следующей вершины. Если для каждой вершины необходимо задать эту информацию, а вы не предоставите ее для первой вершины, эта информация может вообще не использоваться.
Примечание: Материал должен иметь включенный BaseMaterial3D.vertex_color_use_as_albedo, чтобы цвет вершины был виден.
void set_custom(channel_index: int, custom_color: Color) 🔗
Устанавливает пользовательское значение для этой вершины для channel_index.
set_custom_format() должен быть вызван первым для этого channel_index. Форматы, которые не являются RGBA, будут игнорировать другие цветовые каналы.
void set_custom_format(channel_index: int, format: CustomFormat) 🔗
Устанавливает формат цвета для этого пользовательского channel_index. Используйте CUSTOM_MAX для отключения.
Должен вызываться после begin() и должен быть установлен до commit() или commit_to_arrays().
void set_material(material: Material) 🔗
Устанавливает Material, который будет использоваться в создаваемом вами Mesh'е.
void set_normal(normal: Vector3) 🔗
Указывает нормаль для использования для следующей вершины. Если для каждой вершины необходимо установить эту информацию, а вы не предоставили ее для первой вершины, эта информация может вообще не использоваться.
void set_skin_weight_count(count: SkinWeightCount) 🔗
Установите SKIN_8_WEIGHTS, чтобы указать, что можно использовать до 8 влияний костей на вершину.
По умолчанию используются только 4 влияния костей (SKIN_4_WEIGHTS).
Примечание: Эта функция принимает перечисление, а не точное количество весов.
void set_smooth_group(index: int) 🔗
Указывает группу сглаживания, используемую для следующей вершины. Если эта функция никогда не вызывается, все вершины будут иметь группу сглаживания по умолчанию 0 и будут сглажены с соседними вершинами той же группы. Чтобы создать сетку с плоскими нормалями, установите группу сглаживания на -1.
Примечание: Эта функция на самом деле принимает uint32_t, поэтому пользователи C# должны использовать uint32.MaxValue вместо -1 для создания сетки с плоскими нормалями.
void set_tangent(tangent: Plane) 🔗
Specifies a tangent to use for the next vertex. If every vertex needs to have this information set and you fail to submit it for the first vertex, this information may not be used at all.
Note: Even though tangent is a Plane, it does not directly represent the tangent plane. Its Plane.x, Plane.y, and Plane.z represent the tangent vector and Plane.d should be either -1 or 1. See also Mesh.ARRAY_TANGENT.
Указывает набор UV-координат для использования в следующей вершине. Если для каждой вершины необходимо установить эту информацию, а вы не предоставили ее для первой вершины, эта информация может вообще не использоваться.
Указывает необязательный второй набор UV-координат для использования для следующей вершины. Если для каждой вершины необходимо установить эту информацию, а вы не предоставили ее для первой вершины, эта информация может вообще не использоваться.
void set_weights(weights: PackedFloat32Array) 🔗
Указывает значения веса для использования для следующей вершины. weights должен содержать 4 значения. Если для каждой вершины необходимо установить эту информацию, а вы не предоставили ее для первой вершины, эта информация может вообще не использоваться.