我正在为游戏创建一个基于图块的 2D 地形系统。但是,我也在使用游戏中的坐标,它需要能够将边界框映射到“图块坐标”并点击边界框接触的每个图块(别担心,有一个 kd-tree 和所有这些工作美好的)。使用定点“真实世界”坐标,我可以将每个图块计为 2^n 个,然后简单地将位右移以截断到图块坐标。我使用最小的 x,y 对和最大的 x,y 对形成一个边界框。我会分别给他们R0
打电话R1
。
这是一个边界框,其中包含要映射到图块的R0: 0.8, 0.7
坐标R1: 2.2, 1.7
。
现在,这很简单。但是,我想将我的图块分成 4 个三角形象限,这让我可以制作更有趣的东西。由于每个图块变成了 4 个三角形,我假设它们可以以某种方式被 2 位引用(不一定是我展示的那个)。我想使用尽可能少的位来“标记”这些三角形。我将把我的三角形标签放在它的平铺坐标旁边,以 [XX] 的形式,其中 XX 是指示它是哪个三角形的位。
但是,我在使用它时遇到了几个问题。我需要能够将我的真实世界边界框坐标转换为“三角形坐标”,但似乎完全描述边界框太有损了。三角形区域中的相同坐标可以描述与不同三角形碰撞的边界框。
我在左边有和以前一样的第一个边界框:R0: 0.8, 0.7
toR1: 2.2, 1.7
在右边,我有一个新的边界框R0: 0.8, 0.3
to R1: 2.2, 1.7
,所以左上角的 y 分量向上移动。它们都转换为相同的三角形坐标,但如果在现实世界坐标中完成,则会与不同的三角形发生碰撞。但是,在三角坐标中没有区别,因此数据丢失并生成了一组不正确的碰撞。
此外,在同一个三角形中开始和结束的边界框也会出现同样的问题。相同的三角形坐标描述了有时完全在该三角形中的边界框,有时则不在。
必须有一种方法来映射这些,可能使用更多位,以便在 kd-tree 范围查询中执行的所有三角形坐标比较可以匹配真实世界边界框与真实世界坐标中的相同三角形的碰撞方式。但我不知所措。
我沿着兔子洞创建了“子图块”,将每个图块分成 4 个轴对齐的正方形,这也将每个象限图块沿着它穿过的轴分成 2 个,因为我注意到很多情况是由于不知道哪一侧造成的我的坐标映射到的每个三角形。
但是当我遵循一个又一个例外的例外规则时,我最终将我的子图块变成了相同的 4 个三角形象限设计,并在我开始的地方结束,除了更小的图块。
我知道必须有可能实现这种“压缩”并进行适当的比较,但每当我尝试时,我都会一直在兜圈子。怎么做到呢??
编辑:
Alexey 提出了一个解决方案,可以让我描述边界框,但它与使用 kd-tree 查找边界框重叠不兼容。使用我的 kd-tree(存储左上角和右下角坐标)范围查询和搜索区域[x0, y0], [x1, y1]
,我进行范围查询:
[0, 0, x1, y1]
至[x1, y1, xmax, ymax]
但 Alexey 的解决方案不适用于此,即使我试图补偿 8 维坐标。
我真的不介意坐标系是否与我最初考虑的有所不同,只要它仍然可以在三角形象限中表现出相同的结果。