如何加载球形行星及其区域?


15

我正在设计一个部分由行星探索组成的游戏。我想为它们使用伪随机生成,当我不得不加载它们而不是存储每个细节的时候,从定义的种子重新生成,这会太繁琐。因此,我将随机种子和玩家所做的修改(如果有)存储在文件中。

玩家必须能够从轨道上看到行星(细节水平非常低,然后下降到地面,缓慢增加他/她着陆区域的细节水平,并从另一侧卸下超出玩家视野的行星。

如果必须在平坦的地面上进行操作,则可以使用正方形块系统轻松进行操作。但是这里的问题是行星几乎是球体。

那么,在精确点附近加载地面细节(起伏和接地物体)的最佳方法是什么?
我虽然已经提出了两种解决方案,但是两者都有一个弱点:

1.将球切成正方形块。

方块法

一旦玩家离地面足够近,我只需要从他/她的位置改善最接近的正方形的细节即可。
如果这还不够,当玩家在地面上或真的离地面很近时,我仍然可以在子正方形中切割每个正方形以进行加载。

但是,正如您在图片上看到的那样,如果玩家尝试着陆,那将是一个问题:正方形变成非常细长的矩形,甚至最后一行都变成三角形,此外还要加载很多东西,一代似乎会扭曲。

2.从二十面体开始。

二十面体法

在这里,我可以在玩家靠近时增加围绕他的位置的三角形镶嵌。

但是我不知道如何将三角形定位成比玩家的位置更近。我听说笛卡尔坐标在这种情况下可能有用,但我不知道如何使用它们。


我正在使用C ++ / OpenGL,所以这里要生成和加载的主要是表示表面浮雕和颜色/纹理的顶点。


在我开始写作之前,您的世界是一个领域吗?您是否要在每个属性都已保存到文件的球体上施加网格?
亚历克·蒂尔

@AlecTeal我正在尝试模拟一个行星。因此,它在全球范围内。主要的问题是,玩家可以尝试在任意点,电线杆或赤道上接地。
Aracthor

2
所以....一定要问您是否搜索“球形世界游戏引擎”,因为那里有很多实现。他们为什么不工作?此外,这就是为什么我们有立方体贴图的原因,因此,它们是任何球体同胚的拓扑流形上的标准图表!
亚历克·蒂尔

1
建议也评估四边形选项
dnk drone.vs.drones

Answers:


5

好的,所以我在这里写出来:

http://www.maths.kisogo.com/index.php?title=注释:Spherical_coordinates

(我需要数学标记,而且确实很长)


申请文件

该文档首先介绍了流形的概念,流形就是其中的块是R ^ n块的“同胚”(基本上是相同的)(R ^ 2是x / y平面,知道)

图表涵盖了歧管的一些(可能是全部,尽管在球形的情况下却无法涵盖全部)。

在本文中,我为保留角度的球体绘制了4个图表,即它们保持规则的距离。

如您所知,给球面上的点赋予坐标实际上是非常困难的!相反,我们要做的是(虽然在示例中为圆),但要给每个点一个(i,x,y)形式的坐标,其中i是一个球体,介于1和6之间,一个圆是1和4之间的数字。这是图表编号。

x和y是指该图表上的角度(如果是圆,则仅x)。

球面的6个图表分别是上/下半球,左/右和前/后半球。


座标

现在,您可以给evey点一个表现良好的“好”坐标。用数学术语来说,图表的区域是“开放”地图,这意味着存在一些正数,使得每个点周围的球也都位于集合中。例如,范围(0,1)(如果0 <x <1则包含x的集合)是开放的,取(0,1)中的任何p(例如0.001),则存在一个数字(例如0.0005),例如在0.0005到0.001之间的任何点也在(0,1)中。

这意味着您可以通过图表传递指示。

现在,我们开发的图表中存在45度的重叠。这意味着,如果在坐标(i,x,y)上具有要素,则可以安全地指定形式为(i,x + a,y + b)的点,ab范围在-45至+45(以度为单位)之间

形式(i,x + a,y + b)的任何点都可以轻松转换为“正常” 3维空间中的点,而不会出现问题。


实作

现在,您可以使用一种方法来存储球体上某物的坐标,并使用这些坐标表示区域大片空间,它们的行为也类似于坐标,例如它们是开放的(如果使用2个角度来代替,这是一个问题)

现在,您还可以完全放弃“如何创建规则球体”的答案,因为您要做的就是做6个平面,并确保它们的边缘对齐(这很简单),结果是:

您将拥有一个易于使用的座标球

如有任何问题,请发表评论,我试图假设很少的先验知识。我也是教人的新手


@Alec_Teal自从您发布它以来,我就一直在回答您,它复杂且难以理解(我不使用太多的数学公式),但我想我必须理解...您的方法与基于多维数据集的方法真的不同吗?如上所述的球体?我不知道您的“图表”是正方形投影还是其他…
Aracthor

@Aracthor更一般。图表从字面上看就像是一本(地图)中的图表,它所做的只是将网格强加于某个区域。假设您有一个圆环,或一个2孔圆环,则需要这些方法。在这里,没有一个答案能像处理几何体的常规方法那样处理球体上的坐标,这是另一项任务。我可以提供有关公式的帮助,我尝试过将其编写为尽可能易于访问的形式,但这只是我的面包和黄油,因此我看不到复杂性。
亚历克·蒂尔

@Alec_Teal我验证了它,但我仍然认为我什么都没有。但是,让我们在聊天室中继续讨论。
Aracthor

13

如您已经显示的,有许多解决此问题的方法,但都不是100%理想的。球很棘手。

基于多维数据集

孢子和其他游戏(虽然很难在不偷看的情况下很难确定)使用的一种常见路线是将球体投影到立方体上,并在每个立方体面上使用正方形网格。

(这是Alec Teal和dnk drone.vs.drones在上面的评论中描述的内容)

根据立方体细分的球体

(本文中的图片描述了对LoD使用三次表示法

这具有纬度-经度方法的许多优点,并且峰失真小得多。通过对向量进行归一化或除以其绝对值的最大成分,可以轻松地在面网格上的位置与球面上的位置之间来回转换。它还与立方体贴图纹理技术很好地吻合,当从远处观察整个星球时,这很有用。

典型的映射方法称为gnomonic投影,如上图所示,它仍然存在密度不匹配的问题。网格在立方体角附近比在面中心更密集。如果均匀性很重要,则可以使用正确的映射公式来减少这种情况,但这通常会使映射更难以逆转。

改变映射功能以提高一致性

在所有情况下,您在拐角处都仍然会出现角度变形,在这种情况下,四个具有90度角的正方形的普通网格相交会变成三个具有120度角的菱形的交集。

基于二十面体

我个人最喜欢的方法是您所描述的二十面体版本,因为它使峰值角度畸变尽可能小。三角形网格通常有六个以60度角相交的三角形,而二十面体顶点有5个以72度角相交的三角形。因此,每个对象的失真都小于立方体示例中的正方形。

它不像立方体版本的正方形那么熟悉,这可能就是为什么它不那么受欢迎的原因。这需要更多的数学知识才能完成。

但是,识别附近的点并不像看起来那样棘手。任何基于二十面体的测地球都可以展平到规则的三角形网格上:

将测地线镶嵌图展平到规则的三角形网格上 三角形网格上二十面体的网

如此处所述,可以将规则的三角形网格视为正方形网格

三角方格同构

因此,一旦确定了正二十面体的哪一面(可以通过对正二十面体网格进行射线投射即可完成-我不知道有什么聪明的数学方法可以简化该部分),可以使用熟悉的方法填充周围的环境网格遍历。:)

编辑:

如果您使用I级测地线,则可以将行星解开为五个矩形图表,以高效地存储级别块/纹理/高度图,类似于用于存储基于多维数据集的版本的六个正方形图表:

将地球层展开为矩形图表

(这可能有助于解决Fuzzy Logic在另一个答案中提出的问题。这也是可能的,但对于II类测地线来说稍微复杂一些。我尚未研究III类)

诀窍在于,这些图表的轴在使用中并不是真正垂直的,因此现有的创作和流媒体工具/技术不会开箱即用。如果您打算编写自己的块流,或者使用即时过程生成,那么可能就不成问题了。您还可以通过以下方式来解决创作问题:通过使用比使用常规工具更高分辨率的方式来生成源地图,然后将其运行在烘焙过程中,然后沿着图表网格进行采样,以构建密集,有效的表示形式,并直接插入进入二十面体结构。


1
这里有一些好东西。我会+1,但我打算稍后再写一个答案(我也想回答时尽量避免参与投票的早期阶段)。我唯一的评论是,这种方法比球形表面更好地用于渲染球体
Alec Teal 2015年

以防万一您好奇,我现在已经回答完了。
亚历克·蒂尔

4

如果希望能够从空间到地面使用任何级别的详细地形(程序或预定义的高度贴图和纹理),则带块LOD的四边形是首选方法。

Icosasphere提供了更均匀的网格,易于细分,但在尝试映射需要缓存的纹理和高度图时会出现问题,并且这种方式不会非常紧凑或简单。

四面体有夹点,但具有足够的镶嵌效果,您无论如何也不会看到它们。然后,您可以映射纹理并有效地实现DLOD,就好像每个区域(块)都是正方形网格一样,没有什么问题。相较于一片圈,这更容易实现,并且在计算和资源上都将更加高效。

有关在Gamasutra上生成程序宇宙的信息,请参见Sean O'Neil的文章:
- 第1部分 ,有关高度图和纹理的Perlin噪声和分形布朗运动。
- 第2部分 ROAM算法,用于使用DLOD的程序网格进行行星生成。遭受性能问题的困扰。不推荐使用,但具有教育价值。
- 第3部分 解决大规模,优化和浮点问题。主要与宇宙规模有关,但如果需要,也可以用于从光年的刻度转换为厘米的行星。
- 第4部分 讨论了用分块(四叉树)DLOD进行四球面行星生成的实现 <-特别请参阅此文章


0

我不是编程专家,但是您可以使用某种检查点。当您通过安全检查站清关时,当然可以使用动画来加载行星表面,反之亦然。


通过开放选项而不是将可探索的行星表面设计为球体,但不能解决问题,从而解决了这个问题。
Philipp 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.