程序几何

在Godot中有许多方法可以程序化地生成几何图形。在本教程系列中,我们将探讨其中的一些内容。每种技术都有其自身的优点和缺点,因此最好了解每种技术以及它在给定情况下如何有用。

什么是几何?

几何是一种表达形状的奇特方式。在计算机图形学中,几何图形通常由称为“顶点”的位置数组表示。在Godot中,几何图形由网格表示。

什么是网格?

戈多的许多事物在其名称中都有网状物: Mesh , the ArrayMesh , the MeshInstance , the MultiMeshMultiMeshInstance . 虽然它们都是相关的,但它们的用途略有不同。

网格和阵列网格是使用网格实例节点绘制的资源。网格和数组等资源不能直接添加到场景中。网格实例表示场景中网格的一个实例。可以在多个网格实例中重用单个网格,以使用不同的材质或变换(比例、旋转、位置等)在场景的不同部分绘制它。

如果要多次绘制同一个对象,将多网格与多网格实例一起使用会很有帮助。multimeshinstance以非常便宜的价格绘制数千次网格。它利用硬件实例来实现这一点。使用多网格实例的缺点是,对于所有实例,只能使用一种材质。它使用实例数组为每个实例存储不同的颜色和转换,但所有实例使用相同的材质。

什么是网格?

网格由一个或多个曲面组成。曲面是由包含顶点、法线、UV等的多个子数组组成的数组。通常,在 VisualServer 但是,使用ArrayMeshes,用户可以通过传入包含表面信息的数组来手动构造网格。

表面

每个表面都有自己的材料。或者,当使用网格实例时,可以使用 MeshInstance.override_material .

面阵

表面阵列是一个长度阵列 ArrayMesh.ARRAY_MAX . 数组中的每个位置都由包含每个顶点信息的子数组填充。例如,位于 ArrayMesh.ARRAY_NORMAL 是一个 PoolVector3Array 顶点法线。

曲面数组可以被索引,也可以不被索引。创建非索引数组与不在索引处分配数组一样容易。 ArrayMesh.ARRAY_INDEX . 非索引数组为每个三角形存储唯一的顶点信息,这意味着当两个三角形共享一个顶点时,顶点将在数组中重复。索引曲面数组只存储每个唯一顶点的顶点信息,然后存储索引数组,该数组映射出如何从顶点数组构造三角形。一般来说,使用索引数组更快,但这意味着您必须在三角形之间共享顶点数据,而这并不总是需要的(例如,当您需要每个面的法线时)。

工具

Godot提供了访问和处理几何图形的不同方法。下面的教程将提供有关每种方法的更多信息。

ArrayMesh

arraymesh资源扩展了网格以添加一些不同的生活质量函数,最重要的是,通过脚本构建网格表面的能力。

有关arraymesh的更多信息,请参阅 ArrayMesh tutorial .

MeshDataTool

meshdatatool是一种资源,它将网格数据转换为可在运行时修改的顶点、面和边的数组。

有关meshdatatool的更多信息,请参见 MeshDataTool tutorial .

SurfaceTool

surfacetool允许使用OpenGL1.x即时模式样式接口创建网格。

有关Surfacetool的更多信息,请参见 SurfaceTool tutorial .

ImmediateGeometry

即时测光是一个使用即时模式界面(如surfacetool)绘制对象的节点。直接测光法和表面测光法的区别在于,直接测光法是一个节点本身,可以添加到场景树中,直接从代码中绘制。surfacetool生成一个需要添加一个要查看的网格实例的网格。

由于直接的API,直接测光法在原型制作中很有用,但由于几何结构在每一帧中都被重建,所以速度很慢。它对于快速添加简单的几何图形进行可视化调试(例如,通过绘制线来可视化物理光线投射等)非常有用。

如需了解有关即时测定的更多信息,请参阅 ImmediateGeometry tutorial .

我应该用哪一个?

你使用哪种方法取决于你想做什么,以及你能接受什么样的程序。

SurfaceTool和ArrayMesh都非常适合生成不随时间变化的静态几何体(网格)。

使用arraymesh比使用surfacetool稍微快一点,但是API更具挑战性。此外,表面醇还有一些生活质量的方法,例如 generate_normals()index() .

即时测定法在每一帧中都能再生网格,因此比阵列网格或表面醇慢得多。但是,如果您无论如何都需要几何图形来更改每一帧,它提供了一个更容易的接口,甚至可能比生成一个数组对每一帧进行网格化更快。

meshdatatool速度不快,但它可以让您访问与其他网格(边、面等)不同的各种网格属性。当您需要这种类型的数据来转换网格时,它是非常有用的,但是如果不需要这些信息,使用它不是一个好主意。如果要使用需要访问面或边数组的算法,则最好使用meshdatatool。