Mesh

继承: Resource < RefCounted < Object

派生: ArrayMesh, ImmediateMesh, PlaceholderMesh, PrimitiveMesh

一种包含基于顶点数组的几何资源。

描述

网格是一种包含了基于顶点数组的几何资源。网格被分为各种平面,每一个平面包含了一个完整的、单独的顶点数组和材质用来绘制它。通过明智的设计,一个由多个面组成的网格胜过单个面的,这是因为在3D编辑软件中,一个物体通常包含多种材质。每个网格的最大表面数是 RenderingServer.MAX_MESH_SURFACES

教程

属性

Vector2i

lightmap_size_hint

Vector2i(0, 0)

方法

AABB

_get_aabb() virtual const

int

_get_blend_shape_count() virtual const

StringName

_get_blend_shape_name(index: int) virtual const

int

_get_surface_count() virtual const

void

_set_blend_shape_name(index: int, name: StringName) virtual

int

_surface_get_array_index_len(index: int) virtual const

int

_surface_get_array_len(index: int) virtual const

Array

_surface_get_arrays(index: int) virtual const

Array[Array]

_surface_get_blend_shape_arrays(index: int) virtual const

int

_surface_get_format(index: int) virtual const

Dictionary

_surface_get_lods(index: int) virtual const

Material

_surface_get_material(index: int) virtual const

int

_surface_get_primitive_type(index: int) virtual const

void

_surface_set_material(index: int, material: Material) virtual

ConvexPolygonShape3D

create_convex_shape(clean: bool = true, simplify: bool = false) const

Mesh

create_outline(margin: float) const

Resource

create_placeholder() const

ConcavePolygonShape3D

create_trimesh_shape() const

TriangleMesh

generate_triangle_mesh() const

AABB

get_aabb() const

PackedVector3Array

get_faces() const

int

get_surface_count() const

Array

surface_get_arrays(surf_idx: int) const

Array[Array]

surface_get_blend_shape_arrays(surf_idx: int) const

Material

surface_get_material(surf_idx: int) const

void

surface_set_material(surf_idx: int, material: Material)


枚举

enum PrimitiveType: 🔗

PrimitiveType PRIMITIVE_POINTS = 0

将数组渲染为点(一个顶点对应一个点)。

PrimitiveType PRIMITIVE_LINES = 1

将数组渲染为线(每两个顶点创建一条连线)。

PrimitiveType PRIMITIVE_LINE_STRIP = 2

将数组渲染为线条。

PrimitiveType PRIMITIVE_TRIANGLES = 3

将数组渲染为三角形(每三个顶点创建一个三角形)。

PrimitiveType PRIMITIVE_TRIANGLE_STRIP = 4

将数组渲染为三角形条。


enum ArrayType: 🔗

ArrayType ARRAY_VERTEX = 0

顶点位置的 PackedVector3ArrayPackedVector2ArrayArray

ArrayType ARRAY_NORMAL = 1

PackedVector3Array of vertex normals.

Note: The array has to consist of normal vectors, otherwise they will be normalized by the engine, potentially causing visual discrepancies.

ArrayType ARRAY_TANGENT = 2

顶点切线的 PackedFloat32Array。4 个浮点数为一组表示一个元素,前 3 个浮点数确定切线,最后一个是为 -1 或 1 的副法线方向。

ArrayType ARRAY_COLOR = 3

顶点颜色的 PackedColorArray

ArrayType ARRAY_TEX_UV = 4

UV 坐标的 PackedVector2Array

ArrayType ARRAY_TEX_UV2 = 5

第二 UV 坐标的 PackedVector2Array

ArrayType ARRAY_CUSTOM0 = 6

包含自定义颜色通道 0。如果 (format >> Mesh.ARRAY_FORMAT_CUSTOM0_SHIFT) & Mesh.ARRAY_FORMAT_CUSTOM_MASKARRAY_CUSTOM_RGBA8_UNORMARRAY_CUSTOM_RGBA8_SNORMARRAY_CUSTOM_RG_HALFARRAY_CUSTOM_RGBA_HALF,则为 PackedByteArray。否则为 PackedFloat32Array

ArrayType ARRAY_CUSTOM1 = 7

包含自定义颜色通道 1。如果 (format >> Mesh.ARRAY_FORMAT_CUSTOM1_SHIFT) & Mesh.ARRAY_FORMAT_CUSTOM_MASKARRAY_CUSTOM_RGBA8_UNORMARRAY_CUSTOM_RGBA8_SNORMARRAY_CUSTOM_RG_HALFARRAY_CUSTOM_RGBA_HALF,则为 PackedByteArray。否则为 PackedFloat32Array

ArrayType ARRAY_CUSTOM2 = 8

包含自定义颜色通道 2。如果 (format >> Mesh.ARRAY_FORMAT_CUSTOM2_SHIFT) & Mesh.ARRAY_FORMAT_CUSTOM_MASKARRAY_CUSTOM_RGBA8_UNORMARRAY_CUSTOM_RGBA8_SNORMARRAY_CUSTOM_RG_HALFARRAY_CUSTOM_RGBA_HALF,则为 PackedByteArray。否则为 PackedFloat32Array

ArrayType ARRAY_CUSTOM3 = 9

包含自定义颜色通道 3。如果 (format >> Mesh.ARRAY_FORMAT_CUSTOM3_SHIFT) & Mesh.ARRAY_FORMAT_CUSTOM_MASKARRAY_CUSTOM_RGBA8_UNORMARRAY_CUSTOM_RGBA8_SNORMARRAY_CUSTOM_RG_HALFARRAY_CUSTOM_RGBA_HALF,则为 PackedByteArray。否则为 PackedFloat32Array

ArrayType ARRAY_BONES = 10

骨骼索引的 PackedFloat32ArrayPackedInt32Array。每个顶点包含 4 个还是 8 个数字取决于是否存在 ARRAY_FLAG_USE_8_BONE_WEIGHTS 标志。

ArrayType ARRAY_WEIGHTS = 11

骨骼权重的 PackedFloat32ArrayPackedInt32Array,取值范围为 0.01.0(闭区间)。每个顶点包含 4 个还是 8 个数字取决于是否存在 ARRAY_FLAG_USE_8_BONE_WEIGHTS 标志。

ArrayType ARRAY_INDEX = 12

整数的 PackedInt32Array,用作引用顶点、颜色、法线、切线和纹理的索引。所有这些数组必须具有与顶点数组相同数量的元素。任何索引都不能超过顶点数组的大小。当该索引数组存在时,它会将函数置于“索引模式”,其中索引选择第 i 个顶点、法线、切线、颜色、UV 等。这意味着,如果想要沿着一条边有不同的法线或颜色,则必须复制这些顶点。

对于三角形,索引数组被解释为三元组,指代每个三角形的顶点。对于线条,索引数组成对表示每条线的开始和结束。

ArrayType ARRAY_MAX = 13

代表 ArrayType 枚举的大小。


enum ArrayCustomFormat: 🔗

ArrayCustomFormat ARRAY_CUSTOM_RGBA8_UNORM = 0

表示该自定义通道包含的是无符号归一化字节颜色,范围为 0 到 1,编码为 PackedByteArray

ArrayCustomFormat ARRAY_CUSTOM_RGBA8_SNORM = 1

表示该自定义通道包含的是有符号归一化字节颜色,范围为 -1 到 1,编码为 PackedByteArray

ArrayCustomFormat ARRAY_CUSTOM_RG_HALF = 2

表示该自定义通道包含的是半精度浮点数颜色,编码为 PackedByteArray。仅使用红、绿通道。

ArrayCustomFormat ARRAY_CUSTOM_RGBA_HALF = 3

表示该自定义通道包含的是半精度浮点数颜色,编码为 PackedByteArray

ArrayCustomFormat ARRAY_CUSTOM_R_FLOAT = 4

表示该自定义通道包含的是全精度浮点数颜色,使用 PackedFloat32Array。仅使用红色通道。

ArrayCustomFormat ARRAY_CUSTOM_RG_FLOAT = 5

表示该自定义通道包含的是全精度浮点数颜色,使用 PackedFloat32Array。仅使用红、绿通道。

ArrayCustomFormat ARRAY_CUSTOM_RGB_FLOAT = 6

表示该自定义通道包含的是全精度浮点数颜色,使用 PackedFloat32Array。仅使用红、绿、蓝通道。

ArrayCustomFormat ARRAY_CUSTOM_RGBA_FLOAT = 7

表示该自定义通道包含的是全精度浮点数颜色,使用 PackedFloat32Array

ArrayCustomFormat ARRAY_CUSTOM_MAX = 8

代表 ArrayCustomFormat 枚举的大小。


flags ArrayFormat: 🔗

ArrayFormat ARRAY_FORMAT_VERTEX = 1

网格数组包含顶点。所有网格都需要有顶点数组,所以这应该始终存在。

ArrayFormat ARRAY_FORMAT_NORMAL = 2

网格数组包含法线。

ArrayFormat ARRAY_FORMAT_TANGENT = 4

网格数组包含切线。

ArrayFormat ARRAY_FORMAT_COLOR = 8

网格数组包含颜色。

ArrayFormat ARRAY_FORMAT_TEX_UV = 16

网格数组包含 UV。

ArrayFormat ARRAY_FORMAT_TEX_UV2 = 32

网格数组包含第二套 UV。

ArrayFormat ARRAY_FORMAT_CUSTOM0 = 64

网格数组包含自定义通道索引 0。

ArrayFormat ARRAY_FORMAT_CUSTOM1 = 128

网格数组包含自定义通道索引 1。

ArrayFormat ARRAY_FORMAT_CUSTOM2 = 256

网格数组包含自定义通道索引 2。

ArrayFormat ARRAY_FORMAT_CUSTOM3 = 512

网格数组包含自定义通道索引 3。

ArrayFormat ARRAY_FORMAT_BONES = 1024

网格数组包含骨骼。

ArrayFormat ARRAY_FORMAT_WEIGHTS = 2048

网格数组包含骨骼权重。

ArrayFormat ARRAY_FORMAT_INDEX = 4096

网格数组使用索引。

ArrayFormat ARRAY_FORMAT_BLEND_SHAPE_MASK = 7

混合形状中允许使用的网格通道的掩码。

ArrayFormat ARRAY_FORMAT_CUSTOM_BASE = 13

第一个自定义通道的移位量。

ArrayFormat ARRAY_FORMAT_CUSTOM_BITS = 3

每个自定义通道的格式位数。请参阅 ArrayCustomFormat

ArrayFormat ARRAY_FORMAT_CUSTOM0_SHIFT = 13

自定义通道索引 0 需要对 ArrayCustomFormat 进行的按位移动量。

ArrayFormat ARRAY_FORMAT_CUSTOM1_SHIFT = 16

自定义通道索引 1 需要对 ArrayCustomFormat 进行的按位移动量。

ArrayFormat ARRAY_FORMAT_CUSTOM2_SHIFT = 19

自定义通道索引 2 需要对 ArrayCustomFormat 进行的按位移动量。

ArrayFormat ARRAY_FORMAT_CUSTOM3_SHIFT = 22

自定义通道索引 3 需要对 ArrayCustomFormat 进行的按位移动量。

ArrayFormat ARRAY_FORMAT_CUSTOM_MASK = 7

每个自定义通道的自定义格式位掩码。必须按 SHIFT 常量之一进行移位。请参阅 ArrayCustomFormat

ArrayFormat ARRAY_COMPRESS_FLAGS_BASE = 25

第一个压缩标志的移位。压缩标志应该被传递给 ArrayMesh.add_surface_from_arraysSurfaceTool.commit

ArrayFormat ARRAY_FLAG_USE_2D_VERTICES = 33554432

用于标记包含 2D 顶点的数组的标志。

ArrayFormat ARRAY_FLAG_USE_DYNAMIC_UPDATE = 67108864

网格数据将在 GLES 上使用 GL_DYNAMIC_DRAW 的标记索引。在 Vulkan 上未被使用。

ArrayFormat ARRAY_FLAG_USE_8_BONE_WEIGHTS = 134217728

用于标记网格每个顶点最多包含 8 个骨骼影响的标志。该标志表示 ARRAY_BONESARRAY_WEIGHTS 元素将具有双倍长度。

ArrayFormat ARRAY_FLAG_USES_EMPTY_VERTEX_ARRAY = 268435456

用于标记网格有意不包含顶点数组的标志。

ArrayFormat ARRAY_FLAG_COMPRESS_ATTRIBUTES = 536870912

用于标记网格正在使用的压缩的属性(顶点、法线、切线、UV)的标志。启用这种形式的压缩后,顶点位置将被打包到 RGBA16UNORM 属性中,并在顶点着色器中进行缩放。法线和切线将被打包到表示一个轴的 RG16UNORM 中,并在顶点的 A 通道中存储一个 16 位浮点数。UV 将使用 16 位标准化浮点数而不是完整的 32 位有符号浮点数。使用该压缩模式时,必须使用顶点、法线和切线或仅使用顶点。你无法使用没有切线的法线。如果可以的话,导入器将自动启用这种压缩。


enum BlendShapeMode: 🔗

BlendShapeMode BLEND_SHAPE_MODE_NORMALIZED = 0

混合形状是被归一化了的。

BlendShapeMode BLEND_SHAPE_MODE_RELATIVE = 1

混合形状是相对于基础的权重。


属性说明

Vector2i lightmap_size_hint = Vector2i(0, 0) 🔗

  • void set_lightmap_size_hint(value: Vector2i)

  • Vector2i get_lightmap_size_hint()

设置用于光照贴图分辨率的提示。


方法说明

AABB _get_aabb() virtual const 🔗

虚方法,能够为扩展自 Mesh 的自定义类覆盖 AABB


int _get_blend_shape_count() virtual const 🔗

虚方法,能够为扩展自 Mesh 的自定义类覆盖混合形状的数量。


StringName _get_blend_shape_name(index: int) virtual const 🔗

虚方法,能够为扩展自 Mesh 的自定义类覆盖混合形状名称的获取过程。


int _get_surface_count() virtual const 🔗

虚方法,能够为扩展自 Mesh 的自定义类覆盖表面的数量。


void _set_blend_shape_name(index: int, name: StringName) virtual 🔗

虚方法,能够为扩展自 Mesh 的自定义类覆盖混合形状的名称。


int _surface_get_array_index_len(index: int) virtual const 🔗

虚方法,能够为扩展自 Mesh 的自定义类覆盖表面数组索引的长度。


int _surface_get_array_len(index: int) virtual const 🔗

虚方法,能够为扩展自 Mesh 的自定义类覆盖表面数组的长度。


Array _surface_get_arrays(index: int) virtual const 🔗

虚方法,能够为扩展自 Mesh 的自定义类覆盖表面数组。


Array[Array] _surface_get_blend_shape_arrays(index: int) virtual const 🔗

虚方法,能够为扩展自 Mesh 的自定义类覆盖混合形状数组。


int _surface_get_format(index: int) virtual const 🔗

虚方法,能够为扩展自 Mesh 的自定义类覆盖表面格式。


Dictionary _surface_get_lods(index: int) virtual const 🔗

虚方法,能够为扩展自 Mesh 的自定义类覆盖表面 LOD。


Material _surface_get_material(index: int) virtual const 🔗

虚方法,能够为扩展自 Mesh 的自定义类覆盖表面材质。


int _surface_get_primitive_type(index: int) virtual const 🔗

虚方法,能够为扩展自 Mesh 的自定义类覆盖表面图元类型。


void _surface_set_material(index: int, material: Material) virtual 🔗

虚方法,能够为扩展自 Mesh 的自定义类覆盖索引为 index 的材质 material 的设置。


ConvexPolygonShape3D create_convex_shape(clean: bool = true, simplify: bool = false) const 🔗

从网格计算 ConvexPolygonShape3D

如果 cleantrue(默认值),则自动移除重复顶点和内部顶点。如果不需要如此的化话,可以将其设置为 false 以加快处理速度。

如果 simplifytrue,则可以进一步简化几何体以减少顶点数。默认情况下是禁用的。


Mesh create_outline(margin: float) const 🔗

以一定的偏移量(边距),计算出该网格的外轮廓。

注意:这个方法实际上反序返回顶点(例如输入顺时针,返回逆时针)。


Resource create_placeholder() const 🔗

创建该资源的占位符版本(PlaceholderMesh)。


ConcavePolygonShape3D create_trimesh_shape() const 🔗

从该网格计算出 ConcavePolygonShape3D


TriangleMesh generate_triangle_mesh() const 🔗

从网格生成 TriangleMesh。仅考虑使用以下图元类型的表面:PRIMITIVE_TRIANGLESPRIMITIVE_TRIANGLE_STRIP


AABB get_aabb() const 🔗

返回局部空间中包围这个网格的最小 AABB。不受 custom_aabb 的影响。

注意:只针对 ArrayMeshPrimitiveMesh 进行了实现。


PackedVector3Array get_faces() const 🔗

返回网格中所有构成面的顶点。每三个顶点代表一个三角形。


int get_surface_count() const 🔗

返回 Mesh 中存放的表面的数量。相当于 MeshInstance3D.get_surface_override_material_count


Array surface_get_arrays(surf_idx: int) const 🔗

返回构成请求表面的顶点、法线、UV 等数组。(见 ArrayMesh.add_surface_from_arrays)。


Array[Array] surface_get_blend_shape_arrays(surf_idx: int) const 🔗

返回请求表面的混合形状数组。


Material surface_get_material(surf_idx: int) const 🔗

返回给定表面中的 Material。表面是使用该材质渲染的。

注意:这将返回 Mesh 资源中的材质,而不是与 MeshInstance3D 的表面材质覆盖属性关联的 Material。要获取与 MeshInstance3D 的表面材质覆盖属性关联的 Material,请改用 MeshInstance3D.get_surface_override_material


void surface_set_material(surf_idx: int, material: Material) 🔗

为给定表面设置 Material。表面将使用该材质进行渲染。

注意:这会分配 Mesh 资源中的材质,而不是与 MeshInstance3D 的表面材质覆盖属性关联的 Material。要设置与 MeshInstance3D 的表面材质覆盖属性关联的 Material,请改用 MeshInstance3D.set_surface_override_material