球面图表示


19

我最新的游戏将在一个小行星上进行。我正在寻找用于表示球体表面上的单元的良好数据结构。三角形,正方形,五边形,六边形?哪一个最大程度地减少了拉伸并创造了最好的贴砖?

球形贴图是最简单的,但极点处的拉伸是不可接受的。立方体贴图也很容易,但是在立方体角附近仍然会有相当大的拉伸。就拉伸而言,细分二十面体似乎是最好的,但是存在索引许多三角形阵列并在边界处查找相邻单元的问题。

我想我可以使用代表N个角的单个线性点数组,每个点都有N个邻居索引数组,但这似乎浪费了很多空间。

该游戏具有RTS元素,因此我将存储诸如影响力图之类的内容并执行A *寻路和卷积,因此表示必须高效。


与让角色朝一个方向前进并最终在其起点处结束相比,地图的精确拓扑结构有多重要?最简单,最有效的表示方法是圆环/甜甜圈。
congusbongus

1
是的,我提到了球面贴图及其极点存在的问题。我想在曲面周围存储值,因此需要从3D曲面点到数组索引的映射,并尽可能少地拉伸。
DaleyPaley

您可以尝试细分四面体以创建一个球体。它由大小相等且分布均匀的三角形组成。
塔拉多

1
@thalador感谢您的建议。不确定,但我认为如果走三角形,二十面体比四面体更好。但是无论如何,镶嵌不是问题。困扰我的是高效的数组索引。
DaleyPaley 2013年

Answers:


12

好的,对于对此主题感兴趣的人,我现在将详细介绍我选择的解决方案。感谢每一个回答并给我想法的人。

首先,对于“最佳”镶嵌,我将选择截短的二十面体作为起点。将其细分会导致六边形非常漂亮的镶嵌,并提供12个五边形以提供曲率。同样,继续对其对偶进行细分将为我提供一个非常好的三角形网格,用于渲染具有良好的属性。关于12个五角形单元:我可以忽略它们,使其变得特殊(例如可以建造基地的唯一场所),或者可以将它们隐藏在风景中。

六边形和五边形单元将存储在半边数据结构中,以便于访问邻居和快速遍历。唯一棘手的部分是找到给定世界点所在的单元格,但这可以通过从随机单元格开始并通过邻居向该点走来完成。

我希望有人认为此信息有用。我学到了很多东西,并期待得到一些结果。

编辑:

这是显示我的二十面体细分和使用半边数据结构的双重网格切换的结果的图像。

我可能会进行一些松弛迭代,以使单元格区域更加均匀。

二十面体细分


7

正如您在问题中所建议的,有一种方法可以在细分二十面体的基础上非常优雅地做到这一点。二十面体由20个等边三角形组成,这些三角形可以分为5组,其中一组中的4个三角形形成平行四边形:

在此处输入图片说明

(四个三角形组成的组,通过它们绘制出的曲线是我在说的平行四边形。箭头表示将胶合在一起的哪些边将其折叠成二十面体。)

如果将这些三角形细分为较小的三角形,则整个平行四边形可以像n x 4n矩形数组(在示例中为n = 4)那样被索引:

在此处输入图片说明

每个单元格中的数字是矩形阵列的列号。在数组中查找邻居的规则非常简单:水平邻居为正或负1列,而垂直邻居为负一行加一列,或者正行和负一列,具体取决于列号分别为偶数或奇数。

但是,您仍然必须编写一些特殊情况的代码来查找从一个平行四边形到下一个平行四边形的边界的邻居。这有点棘手,因为在某些地方,一个平行四边形的顶部或底部将连接到另一个平行四边形的侧面,或者顶部和底部将以它们之间的水平偏移量连接,等等。可能是半边结构或类似结构因为平行四边形在这里很有用。但是,至少所有5个平行四边形之间的关系都是对称的:它们都遵循相同的模式,其中一侧连接到邻居的另一侧。


这确实是一个很好的表示。我对三角方法的主要关注是保持三角阵列和所有缝合。这里仍然有一点缝线,但阵列是矩形的。谢谢,非常高兴
DaleyPaley

3

嗯-有关拉伸的注释表明您正在球面和平面贴图之间移动,这就是导致极点变形的原因

如果您希望平铺瓷砖是平坦且均匀的,那是正确的,二十面体,特别是截短的二十面体很常见

您可以在此处找到所有不同的映射-Wikipedia上的球形多面体

至于保持面之间的关系,这是一个拓扑问题-你可能会发现无论是翼边或四边缘有帮助(你会得到极好的机会,以满足代数的一种全新的形式),翼边


啊,截短的二十面体。是的,这正是我所需要的。谢谢。另外,虽然我从未使用过翼状边缘,但我在网格处理中经常使用半边,因此我对该领域非常精通。干杯,我快解决了。
DaleyPaley13年

2

我想我来晚了一点,但是这里有一个可能的解决方案,可以用来维护任意大小和统一外观的球形世界。

这里要了解的关键是世界不是平坦的,因此不可能实现100%均匀的平铺(这来自所谓的毛球定理)。必须允许一些不规则性,而我们所希望的最好办法是将这些不规则性均匀地分布在表面上,使每个不规则性都尽可能小。

实际上,以不确定性方式进行操作非常容易。首先,在表面周围均匀地选择N个随机点。确保这些点实际上是统一的(请参见“ 球形点拾取”,公式9-11)。在第二步中,我们使这些点的随机性降低,并使它们变得更均匀:假定所有这些点均带有负电荷,以便彼此排斥。模拟点的移动几步,直到它们收敛到平衡状态。这些点的最终配置将为您提供一个几乎均匀分布在球体表面周围的网格。


1
我从未听说过毛球理论,这很有趣。必须阻止自己开玩笑的笑话。我以前曾在球体上分布过点,但是问题是将其多边形化要比细分多面体慢得多。而且,细胞的形状和化合价对于我的喜好也将太不均匀。但是还是谢谢你。
2013年
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.