Attention: Here be dragons

This is the latest (unstable) version of this documentation, which may document features not available in or compatible with released stable versions of Godot.

ArrayMesh

Успадковує: Mesh < Resource < RefCounted < Object

Тип Mesh, який надає утиліту для побудови поверхні з масивів.

Опис

ArrayMesh використовується для створення Mesh шляхом визначення таких атрибутів, як масиви.

Найпростішим прикладом є створення одного трикутника:

var vertices = PackedVector3Array()
vertices.push_back(Vector3(0, 1, 0))
vertices.push_back(Vector3(1, 0, 0))
vertices.push_back(Vector3(0, 0, 1))

# Ініціалізація Масивів Мешу.
var arr_mesh = ArrayMesh.new()
var arrays = []
arrays.resize(Mesh.ARRAY_MAX)
arrays[Mesh.ARRAY_VERTEX] = vertices

# Створення Мешу.
arr_mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, arrays)
var m = MeshInstance3D.new()
m.mesh = arr_mesh

MeshInstance3D готовий до додавання до SceneTree.

Дивіться також ImmediateMesh, MeshDataTool і SurfaceTool для генерації процедурної геометрії.

Примітка: Godot використовує порядок намотування за годинниковою стрілкою для передніх граней примітивів трикутників.

Посібники

Властивості

BlendShapeMode

blend_shape_mode

1

AABB

custom_aabb

AABB(0, 0, 0, 0, 0, 0)

ArrayMesh

shadow_mesh

Методи

void

add_blend_shape(name: StringName)

void

add_surface_from_arrays(primitive: PrimitiveType, arrays: Array, blend_shapes: Array[Array] = [], lods: Dictionary = {}, flags: BitField[ArrayFormat] = 0)

void

clear_blend_shapes()

void

clear_surfaces()

int

get_blend_shape_count() const

StringName

get_blend_shape_name(index: int) const

Error

lightmap_unwrap(transform: Transform3D, texel_size: float)

void

regen_normal_maps()

void

set_blend_shape_name(index: int, name: StringName)

int

surface_find_by_name(name: String) const

int

surface_get_array_index_len(surf_idx: int) const

int

surface_get_array_len(surf_idx: int) const

BitField[ArrayFormat]

surface_get_format(surf_idx: int) const

String

surface_get_name(surf_idx: int) const

PrimitiveType

surface_get_primitive_type(surf_idx: int) const

void

surface_remove(surf_idx: int)

void

surface_set_name(surf_idx: int, name: String)

void

surface_update_attribute_region(surf_idx: int, offset: int, data: PackedByteArray)

void

surface_update_skin_region(surf_idx: int, offset: int, data: PackedByteArray)

void

surface_update_vertex_region(surf_idx: int, offset: int, data: PackedByteArray)


Описи властивостей

BlendShapeMode blend_shape_mode = 1 🔗

Режим накладання фігур.


AABB custom_aabb = AABB(0, 0, 0, 0, 0, 0) 🔗

  • void set_custom_aabb(value: AABB)

  • AABB get_custom_aabb()

Замінює AABB на один, визначений користувачем для використання з вибракуванням усеченої точки. Особливо корисно, щоб уникнути несподіваного відсікання під час використання шейдера для зміщення вершин.


ArrayMesh shadow_mesh 🔗

Додаткова сітка, яку можна використовувати для візуалізації тіней і попереднього проходу глибини. Можна використовувати для підвищення продуктивності шляхом надання сітки з об’єднаними вершинами та лише даними про положення вершин (без нормалей, UV, кольорів тощо).

Примітка: ця сітка повинна мати точно такі ж позиції вершин, як і вихідна сітка (включаючи LOD вихідної сіті, якщо вони є). Якщо положення вершин відрізняються, сітка не буде намальована правильно.


Описи методів

void add_blend_shape(name: StringName) 🔗

Додає назву для форми змішування, яку буде додано за допомогою add_surface_from_arrays(). Має викликатися перед додаванням поверхні.


void add_surface_from_arrays(primitive: PrimitiveType, arrays: Array, blend_shapes: Array[Array] = [], lods: Dictionary = {}, flags: BitField[ArrayFormat] = 0) 🔗

Створює нову поверхню. Mesh.get_surface_count() стане surf_idx для цієї нової поверхні.

Поверхні створюються для візуалізації за допомогою primitive, який може бути будь-яким зі значень, визначених у PrimitiveType.

Аргумент arrays — це масив масивів. Кожен з елементів Mesh.ARRAY_MAX містить масив із деякими даними сітки для цієї поверхні, як описано відповідним елементом ArrayType або null, якщо він не використовується поверхні. Наприклад, arrays[0] — це масив вершин. Цей підмасив перших вершин завжди потрібен; інші необов'язкові. Додавання індексного масиву переводить цю поверхню в «індексний режим», де вершина та інші масиви стають джерелами даних, а індексний масив визначає порядок вершин. Усі підмасиви повинні мати таку ж довжину, як і масив вершин (або бути кратним довжині масиву вершин, якщо кілька елементів підмасиву відповідають одній вершині) або бути порожніми, за винятком Mesh.ARRAY_INDEX, якщо він використовується.

Аргумент blend_shapes — це масив даних вершин для кожної фігури змішування. Кожен елемент є масивом такої самої структури, що й arrays, але Mesh.ARRAY_VERTEX, Mesh.ARRAY_NORMAL і Mesh.ARRAY_TANGENT встановлені тоді та лише тоді, коли вони встановлені в arrays і всі інші записи мають значення null.

Аргумент lods — це словник із ключами float і значеннями PackedInt32Array. Кожен запис у словнику представляє рівень LOD поверхні, де значенням є масив Mesh.ARRAY_INDEX для використання рівня LOD, а ключ приблизно пропорційний відстані, на якій використовується статистика LOD. Тобто збільшення ключа LOD також збільшує відстань, на якій об’єкти повинні бути від камери до використання LOD.

Аргумент flags є порозрядним АБО, якщо потрібно: одне значення ArrayCustomFormat зміщено вліво на ARRAY_FORMAT_CUSTOMn_SHIFT для кожного користувацького каналу, що використовується, Mesh.ARRAY_FLAG_USE_DYNAMIC_UPDATE, Mesh.ARRAY_FLAG_USE_8_BONE_WEIGHTS або Mesh.ARRAY_FLAG_USES_EMPTY_VERTEX_ARRAY.

Примітка: Під час використання індексів рекомендується використовувати лише точки, лінії чи трикутники.


void clear_blend_shapes() 🔗

Видаляє всі форми змішування з цього ArrayMesh.


void clear_surfaces() 🔗

Видаляє всі поверхні з цього ArrayMesh.


int get_blend_shape_count() const 🔗

Повертає кількість форм змішування, які містить ArrayMesh.


StringName get_blend_shape_name(index: int) const 🔗

Повертає назву форми змішування за цим індексом.


Error lightmap_unwrap(transform: Transform3D, texel_size: float) 🔗

Виконує ультрафіолетове розгортання ArrayMesh, щоб підготувати сітку до світлового відображення.


void regen_normal_maps() 🔗

Повторно генерує дотичні для кожної поверхні ArrayMesh.


void set_blend_shape_name(index: int, name: StringName) 🔗

Встановлює назву форми змішування за цим індексом.


int surface_find_by_name(name: String) const 🔗

Повертає індекс першої поверхні з такою назвою у цьому ArrayMesh. Якщо не знайдено жодної, повертається -1.


int surface_get_array_index_len(surf_idx: int) const 🔗

Повертає довжину в індексах масиву індексів у запитуваній поверхні (див. add_surface_from_arrays()).


int surface_get_array_len(surf_idx: int) const 🔗

Повертає довжину у вершинах масиву вершин запитуваної поверхні (див. add_surface_from_arrays()).


BitField[ArrayFormat] surface_get_format(surf_idx: int) const 🔗

Повертає маску формату запитуваної поверхні (див. add_surface_from_arrays()).


String surface_get_name(surf_idx: int) const 🔗

Отримує назву, призначену цій поверхні.


PrimitiveType surface_get_primitive_type(surf_idx: int) const 🔗

Повертає тип примітиву запитуваної поверхні (див. add_surface_from_arrays()).


void surface_remove(surf_idx: int) 🔗

Видаляє поверхню з заданим індексом із сітки, зміщуючи поверхні з вищим індексом на одиницю вниз.


void surface_set_name(surf_idx: int, name: String) 🔗

Задає назву для заданої поверхні.


void surface_update_attribute_region(surf_idx: int, offset: int, data: PackedByteArray) 🔗

Updates the attribute buffer of this mesh's surface with the given data. The expected data per attribute is 12 or 8 bytes (4 bytes per float, 2 floats per Vector2, and 3 floats per Vector3) depending on if the mesh is using Vector3 or Vector2 vertices. This value can be determined with RenderingServer.mesh_surface_get_format_attribute_stride().

The starting point of the updates can be changed with offset. The value of offset should be a multiple of 12 bytes in most cases to align to each attribute.

A PackedVector3Array of attribute locations can be converted into a PackedByteArray using PackedVector3Array.to_byte_array() for use in data.


void surface_update_skin_region(surf_idx: int, offset: int, data: PackedByteArray) 🔗

Updates the skin buffer of this mesh's surface with the given data. The expected data per skin is 12 or 8 bytes (4 bytes per float, 2 floats per Vector2, and 3 floats per Vector3) depending on if the mesh is using Vector3 or Vector2 vertices. This value can be determined with RenderingServer.mesh_surface_get_format_skin_stride().

The starting point of the updates can be changed with offset. The value of offset should be a multiple of 12 bytes in most cases to align to each skin.

A PackedVector3Array of skin locations can be converted into a PackedByteArray using PackedVector3Array.to_byte_array() for use in data.


void surface_update_vertex_region(surf_idx: int, offset: int, data: PackedByteArray) 🔗

Updates the vertex buffer of this mesh's surface with the given data. The expected data per vertex is 12 or 8 bytes (4 bytes per float, 2 floats per Vector2, and 3 floats per Vector3) depending on if the mesh is using Vector3 or Vector2 vertices. This value can be determined with RenderingServer.mesh_surface_get_format_vertex_stride().

The starting point of the updates can be changed with offset. The value of offset should be a multiple of 12 bytes in most cases to align to each vertex.

A PackedVector3Array of vertex locations can be converted into a PackedByteArray using PackedVector3Array.to_byte_array() for use in data.