您的当前位置:主页 > 传奇私服发布网 >

使用程序食谱烘焙自己的3D地下城

发布时间:2019-05-31 11:00

最早使用程序世界一代的游戏之一是Rogue。它于1980年制造,具有动态生成的2D网格地下城。由于没有两个游戏是完全相同的,游戏产生了一种全新的游戏类型,称为“roguelikes”。这种类型的地牢在30年后仍然非常普遍。

1996年,Daggerfall被释放。它具有程序化的3D地下城和城市,允许开发人员创建数以千计的独特位置,而无需手动构建所有位置。虽然它的3D方法比传统的2D网格地下城提供了许多优势,但它并不常见。

此图显示了一个较大的地牢的一部分,它被提取以说明用于构建它的模块。图像是使用从Dfworkshop.net下载的“Daggerfall Modeling”生成的。

我们将专注于生成类似于Daggerfall的地下城。?要从本教程中受益,您需要了解基本的3D变换,并对“场景图”和“实体组件系统”感到满意。

本教程最初发布于?Tuts +,其中包含类似的教程?使用细胞自动机生成随机洞级别?并且可以自定义您的Unity游戏资产。

如何建造地牢?

为了建造一个地下城,我们需要定义一个地牢是什么。在本教程中,我们将根据一组规则将地牢定义为一组彼此连接的模块(3D模型)。我们将使用走廊交汇点连接的房间

房间是一个有一个或多个出口的大区域走廊是一个狭长的区域,可能是倾斜的,并且只有两个出口是一个有三个或更多出口的小区域

在本教程中,我们将使用模块的简单模型,它们的网格只包含地板。我们将使用三个:房间,走廊和路口。我们将出口标记可视化为轴对象,-X / + X轴为红色,+ Y轴为绿色,+ Z轴为蓝色。

用于构建地牢的模块

请注意,退出的方向不为90度增量。

在连接模块时,我们将定义以下规则:

客房可以连接到走廊走廊可以连接到房间或交叉点交汇处可以连接到走廊

每个模块都包含一组具有已知位置和旋转的出口 marker对象。每个模块都被标记为说明它是什么类型,每个出口都有一个它可以连接的标签列表。

在最高级别,建造地牢的过程如下:

实例化一个起始模块(最好是一个出口数量较多的模块)。将有效模块实例化并连接到模块的每个未连接出口。到目前为止,重建整个地牢中未连接出口的列表。重复这个过程,直到建立一个足够大的地牢。

查看正在运行的算法的迭代。

将两个模块连接在一起的详细过程是:

从旧模块中选择一个未连接的出口。选择一个新模块的预制件,其中包含旧模块出口允许的标签匹配标签。实例化新模块。从新模块中选择一个退出。连接模块:将新模块的出口与旧模块的出口相匹配。将两个出口标记为已连接,或者只是从场景图中删除它们。对旧模块的其余未连接出口重复此作。

要将两个模块连接在一起,我们必须对齐它们(在3D空间中旋转和平移它们),以便从第一个模块退出与第二个模块的出口匹配。当它们的位置相同且它们的+ Z轴相反时,退出是匹配,而它们的+ Y轴是匹配的。

执行此作的算法很简单:

在+ Y轴上旋转新模块,旋转原点位于新出口的位置,以使旧出口的+ Z轴与新出口的+ Z轴相反,并且它们的+ Y轴相同。翻译新模块,使新出口的位置与旧出口的位置相同。


连接两个模块。

履行

这里使用的伪代是Python-ish,但任何人都应该可读。示例源代是Unity项目。

让我们假设我们正在使用一个实体组件系统,该系统在场景图中保存实体,定义它们的父子关系。具有这种系统的游戏引擎的一个很好的例子是Unity,它的游戏对象和组件

最早使用程序世界一代的游戏之一是Rogue。它于1980年制造,具有动态生成的2D网格地下城。由于没有两个游戏是完全相同的,游戏产生了一种全新的游戏类型,称为“roguelikes”。这种类型的地牢在30年后仍然非常普遍。

1996年,Daggerfall被释放。它具有程序化的3D地下城和城市,允许开发人员创建数以千计的独特位置,而无需手动构建所有位置。虽然它的3D方法比传统的2D网格地下城提供了许多优势,但它并不常见。

此图显示了一个较大的地牢的一部分,它被提取以说明用于构建它的模块。图像是使用从Dfworkshop.net下载的“Daggerfall Modeling”生成的。

我们将专注于生成类似于Daggerfall的地下城。?要从本教程中受益,您需要了解基本的3D变换,并对“场景图”和“实体组件系统”感到满意。

本教程最初发布于?Tuts +,其中包含类似的教程?使用细胞自动机生成随机洞级别?并且可以自定义您的Unity游戏资产。

如何建造地牢?

为了建造一个地下城,我们需要定义一个地牢是什么。在本教程中,我们将根据一组规则将地牢定义为一组彼此连接的模块(3D模型)。我们将使用走廊交汇点连接的房间

房间是一个有一个或多个出口的大区域走廊是一个狭长的区域,可能是倾斜的,并且只有两个出口是一个有三个或更多出口的小区域

在本教程中,我们将使用模块的简单模型,它们的网格只包含地板。我们将使用三个:房间,走廊和路口。我们将出口标记可视化为轴对象,-X / + X轴为红色,+ Y轴为绿色,+ Z轴为蓝色。

用于构建地牢的模块

请注意,退出的方向不为90度增量。

在连接模块时,我们将定义以下规则:

客房可以连接到走廊走廊可以连接到房间或交叉点交汇处可以连接到走廊

每个模块都包含一组具有已知位置和旋转的出口 marker对象。每个模块都被标记为说明它是什么类型,每个出口都有一个它可以连接的标签列表。

在最高级别,建造地牢的过程如下:

实例化一个起始模块(最好是一个出口数量较多的模块)。将有效模块实例化并连接到模块的每个未连接出口。到目前为止,重建整个地牢中未连接出口的列表。重复这个过程,直到建立一个足够大的地牢。

查看正在运行的算法的迭代。

将两个模块连接在一起的详细过程是:

从旧模块中选择一个未连接的出口。选择一个新模块的预制件,其中包含旧模块出口允许的标签匹配标签。实例化新模块。从新模块中选择一个退出。连接模块:将新模块的出口与旧模块的出口相匹配。将两个出口标记为已连接,或者只是从场景图中删除它们。对旧模块的其余未连接出口重复此作。

要将两个模块连接在一起,我们必须对齐它们(在3D空间中旋转和平移它们),以便从第一个模块退出与第二个模块的出口匹配。当它们的位置相同且它们的+ Z轴相反时,退出是匹配,而它们的+ Y轴是匹配的。

执行此作的算法很简单:

在+ Y轴上旋转新模块,旋转原点位于新出口的位置,以使旧出口的+ Z轴与新出口的+ Z轴相反,并且它们的+ Y轴相同。翻译新模块,使新出口的位置与旧出口的位置相同。


连接两个模块。

履行

这里使用的伪代是Python-ish,但任何人都应该可读。示例源代是Unity项目。

让我们假设我们正在使用一个实体组件系统,该系统在场景图中保存实体,定义它们的父子关系。具有这种系统的游戏引擎的一个很好的例子是Unity,它的游戏对象和组件

最早使用程序世界一代的游戏之一是Rogue。它于1980年制造,具有动态生成的2D网格地下城。由于没有两个游戏是完全相同的,游戏产生了一种全新的游戏类型,称为“roguelikes”。这种类型的地牢在30年后仍然非常普遍。

1996年,Daggerfall被释放。它具有程序化的3D地下城和城市,允许开发人员创建数以千计的独特位置,而无需手动构建所有位置。虽然它的3D方法比传统的2D网格地下城提供了许多优势,但它并不常见。

此图显示了一个较大的地牢的一部分,它被提取以说明用于构建它的模块。图像是使用从Dfworkshop.net下载的“Daggerfall Modeling”生成的。

我们将专注于生成类似于Daggerfall的地下城。?要从本教程中受益,您需要了解基本的3D变换,并对“场景图”和“实体组件系统”感到满意。

本教程最初发布于?Tuts +,其中包含类似的教程?使用细胞自动机生成随机洞级别?并且可以自定义您的Unity游戏资产。

如何建造地牢?

为了建造一个地下城,我们需要定义一个地牢是什么。在本教程中,我们将根据一组规则将地牢定义为一组彼此连接的模块(3D模型)。我们将使用走廊交汇点连接的房间

房间是一个有一个或多个出口的大区域走廊是一个狭长的区域,可能是倾斜的,并且只有两个出口是一个有三个或更多出口的小区域

在本教程中,我们将使用模块的简单模型,它们的网格只包含地板。我们将使用三个:房间,走廊和路口。我们将出口标记可视化为轴对象,-X / + X轴为红色,+ Y轴为绿色,+ Z轴为蓝色。

用于构建地牢的模块

请注意,退出的方向不为90度增量。

在连接模块时,我们将定义以下规则:

客房可以连接到走廊走廊可以连接到房间或交叉点交汇处可以连接到走廊

每个模块都包含一组具有已知位置和旋转的出口 marker对象。每个模块都被标记为说明它是什么类型,每个出口都有一个它可以连接的标签列表。

在最高级别,建造地牢的过程如下:

实例化一个起始模块(最好是一个出口数量较多的模块)。将有效模块实例化并连接到模块的每个未连接出口。到目前为止,重建整个地牢中未连接出口的列表。重复这个过程,直到建立一个足够大的地牢。

查看正在运行的算法的迭代。

将两个模块连接在一起的详细过程是:

从旧模块中选择一个未连接的出口。选择一个新模块的预制件,其中包含旧模块出口允许的标签匹配标签。实例化新模块。从新模块中选择一个退出。连接模块:将新模块的出口与旧模块的出口相匹配。将两个出口标记为已连接,或者只是从场景图中删除它们。对旧模块的其余未连接出口重复此作。

要将两个模块连接在一起,我们必须对齐它们(在3D空间中旋转和平移它们),以便从第一个模块退出与第二个模块的出口匹配。当它们的位置相同且它们的+ Z轴相反时,退出是匹配,而它们的+ Y轴是匹配的。

执行此作的算法很简单:

在+ Y轴上旋转新模块,旋转原点位于新出口的位置,以使旧出口的+ Z轴与新出口的+ Z轴相反,并且它们的+ Y轴相同。翻译新模块,使新出口的位置与旧出口的位置相同。


连接两个模块。

履行

这里使用的伪代是Python-ish,但任何人都应该可读。示例源代是Unity项目。

让我们假设我们正在使用一个实体组件系统,该系统在场景图中保存实体,定义它们的父子关系。具有这种系统的游戏引擎的一个很好的例子是Unity,它的游戏对象和组件

    上一篇:Rock of Ages今年秋天正在拍续集
    下一篇:Xbox One游戏流推出三款游戏通行证

    更多相关新闻