生成体素地形
(a)一种常见的方法是使用Perlin噪声生成高度图。高度图基本上是一张单色图像,通过其像素的暗或亮表示不同的高度。
您将查看此高度图中的各个像素,以根据高度图图像中该像素的亮度,在不同(x,y)位置创建高达不同高度(z轴)的体素“堆栈”。由于Perlin噪点图像是平滑的(没有锐利的边缘相对于黑暗),因此您将获得平滑滚动的地形。
(b)您可以通过使用不同的多面体创建景观来逐步构建它。创建一个多面体矢量形状,该形状近似于所需的体素形状。使用任何3D多面体点方法(最常见的是凸面壳),检查世界网格中哪些点落在该多面体体积之内。例如,在空间中定义金字塔。在根据该金字塔体量检查了世界空间局部区域中的每个点之后,您将知道其中包含哪些点,并且可以将这些单元格设置为“当前”,这意味着它们成为体素而不是空白空间。现在,您的空间中有一个体素金字塔。您可以通过这种方式继续添加各种形状,直到形成地形。
(c)(与b完全相同)编写建模工具。Voxatron展示了外观。这只是在替代世界(编辑器)中创建体素表单,然后将它们导入您的实际运行时游戏世界中。我相信Voxlap拥有第一个开源的体素开源编辑器。您可以放置单个体素,也可以使用形状/体积不同的体素“画笔”将体素吸引到您的世界中。
构造自己的基于体素的游戏所需的内容
我之所以包括这一部分,是因为体素之路并非易事,至少目前不是这样。最近,大型公司再次对体素引擎进行大量研究,以进行渲染和物理应用。
简单性可能是个问题,因为用原始体素动态构建世界是构建世界的一种程序方法,而这并不是天生的简单。非常抱歉,这里将有一些技术术语。编写体素引擎是一项非常严肃的工作,需要跨多个游戏引擎开发领域的知识,尤其是在空间概念方面,这意味着要在一定程度上理解3D向量数学,矩阵和基本演算。
话虽如此,您的“体素地形的生成”需要一个可以在其中工作的环境,因为体素引擎并不完全普及。让我们对体素引擎如何工作进行基本描述。
体素是您世界的基本构建块。它们的位置由整数索引的3D网格(数组)定义,而不是由连续的浮点空间(如在基于矢量的3D游戏中使用)定义。这些将成为您世界的“原子”。它们可能比《我的世界》这样的游戏高3英尺,或者它们可能比虚拟角色的眼睛实际看到的要小,除非大量聚集在一起-有点像分子。有两种:
- 基于立方网格的体素(示例)-是一种较新的种类,为简单起见,可与现代图形技术结合使用。用于MineCrat和Dungeon Keeper等游戏。
- 点体素(example,example)-原始体素。每个空间都是一个单独的,可碰撞的点,尽管它可能被球形的边界体积包围。它们比较简单,因此您可以在自己的世界中拥有更多它们,因此可以使它们更小,这通常是有利的。使用它们的两个游戏是科曼奇(Comanche)和1990年代重制的《午夜之王》。
无论哪种方式,操作世界中体素的方法都大致相同,如下所示。
要在您的世界中构造和移动对象,您将需要上述数学工具。例如,创建墙:使用向量在3D空间中构造一个具有适当尺寸的盒子。使用矩阵数学将框转换为3D世界中所需的旋转和位置(在连续向量空间中)。对于体素引擎,额外的步骤是现在使用3D多面体点算法来确定哪些体素落在该旋转空间内。
本质上,这就是构造世界上大多数对象的方式。除此之外,您可以编写自己的工具,以用Maya或3DS Max这样的方式“建模”角色。但是,由于要进行建模,因此您要使用体素而不是点,边和面来进行角色设计,因此方法将大不相同。如果您决定在世界中旋转这些对象,则需要类似地使用矩阵转换。
可破坏地形很简单,要么根据您选择的某种方法一次删除一个体素,要么对大量体素使用CSG(本构几何)操作,以根据某个预定义的体积将其删除;例如,如果将激光束发射穿过岩石,则可以使用圆柱体体积减去在此处穿过岩石发射的体素。CSG是一个相对简单的过程,使用形成您的体素世界的3D空间栅格,并对照另一个栅格(在此情况下为激光束)检查基本栅格(在这种情况下为岩石)的一部分中的每个单元格
为了使物质“流动”(如Vigil在他对沙子的评论中所暗示的那样),您将需要研究流体动力学和细胞自动机。矮人要塞作者塔恩·亚当斯(Tarn Adams)的作者在本质上也是体素的世界中使用了这些元素(尽管在这种情况下体素要大得多,与Dungeon Keeper相当,原理仍然相同)。这些是最前沿的主题,而不是所定义的体素引擎的必要条件,因此我将其保留为您自己研究的“存根”。
最后,CSG和流体动力学使我感到最优化。当前正在开发的体素引擎几乎仅使用稀疏体素八叉树(SVO),这是一种将体素空间细分为不同分辨率的方法,如该视频中展示的即将推出的Atomontage引擎所示。使用八叉树/ SVO比优化选择更为必要,因为处理一个庞大,统一的网格会涉及处理开销。八叉树本质上是一棵树(有向无环图),其中每个节点都有8个或0个子节点,具体取决于它表示的空间是否包含任何物理卷。八叉树如何细分空间以形成体素的图在此处。
我知道的最好的开源体素实现是Ken Silverman的Voxlap Engine,该引擎用于Voxelstein3D。它用C ++编写,并实现了用于地形变形的CSG操作。