具有两个角的对角线视线


9

现在,我正在使用Bresenham的线算法来获取视线。问题是我发现了一个边缘情况,玩家可以透过墙壁看。当玩家注视着墙的两个角之间,且在另一侧有特定角度的间隙时发生。

视线边缘盒

我想要的结果是将两堵墙之间的瓷砖标记为无效。

所需结果

修改布雷森汉姆线算法以解决此问题的最快方法是什么?如果没有好的解决方案,是否有更合适的算法?任何想法都欢迎。请注意,该解决方案还应该能够支持3d。

编辑:我的简单解决方案是检查直线的x和y坐标更改时两个角是否都闭合。有关完整产品的工作源代码和交互式演示,请参见http://ashblue.github.io/javascript-pathfinding/


2
如果切换起点和终点,会有所不同吗?也许如果两个计算都返回一个不受阻碍的视线,您就可以接受结果。您可能还会在RogueBasin上找到一些关于LOS的文章。
塔拉多

1
无论哪种方式,对角线在4-5处的两个黑色块都不会首先连接到墙中,之所以这样说,是因为您暗中允许对角线移动。您必须使该对角线成直角以使其成为连续墙,或者使行进器与它的对角线成直角而不是像2-3和4-5那样完全成为对角线。
Patrick Hughes

翻转它听起来像是个好主意,但并不能解决问题。我唯一能想到的就是检查两个角之一是否为空。虽然看起来很贵。
Ash Blue

5
“似乎很昂贵”永远是不尝试的理由。通常,“将太昂贵”是假设您可以证明某些东西太慢。
2013年

3
唯一需要更改的算法是,如果X和Y都在同一步骤上更改,则先更改X,然后更改Y,这将完全消除对角线。
Patrick Hughes

Answers:


7

埃里克·利珀特(Eric Lippert)在用矩形平面网格上的阴影投射生成C#视线方面写了一个很棒的系列。

在其他问题中,埃里克(Eric)处理了关于视线要求必须回答的各种问题,这些问题给出了不同的结果,并给出了几个不同结果的示例。其中一篇文章深入探讨了他算法的早期版本中出现的“四处寻找”情况。

我已经适应了Eric的算法六角网格在这里,并成功地用它在大六角格(> 400×700),具有广泛的知名度半径(> 60个不吉利的东西)。此实现使用单个i7 CPU来计算和显示完整的视场,并能以最快的速度眨眼。对于我期望用于的任何用途,这肯定足够快。

更新 -带高程的视线:
链接到上面的十六进制网格实现计算带高程的视线,而不仅仅是障碍物。文档说明还讨论了有关高程计算必须做出的其他决定:目标高度和观察者高度。默认选择是使两者相等,这将创建对称的视野,但也可以选择地对地和观察者对地的眼睛。(该代码在麻省理工学院执照下是开源的)


我确实在挖掘Shadow Casting,但是遇到了一个问题。找不到有关缩放算法以使其在z轴上运行的任何信息。抱歉提到这一点,但是您有任何建议资源可以使它在3d中工作吗?
Ash Blue

@AshBlue:请参见上方附录
Pieter Geerkens 2013年

我正在看你的代码库。它有很多东西,但我似乎找不到适合十六进制的类似于Bresenham的线条绘制算法。你用LOS做吗?
MLProgrammer-CiM 2013年

@EfEs:FieldOfView是返回的对象;ShadowCastingFov * .cs通过投射阴影来生成视场。如果您对代码有特定的疑问,最好在网站的“讨论”部分中提出;更一般的问题,我很乐意在这里回答。
Pieter Geerkens

@PieterGeerkens您可以在这里找到问题gamedev.stackexchange.com/questions/57087/…–
MLProgrammer-CiM

1

如果要进行LOS计算,您有一个单独的“高分辨率”网格填充角缝,该怎么办?我在想这样的事情:

在此处输入图片说明

左边是4格的原始块部分。

右边是“高分辨率”版本,因为您可以看到每个原始正方形都被细分为四分之一,并且其中一个角已被填充。我不确定生成该算法的临时算法,但可以对其进行预先计算从当前地图。

这确实意味着坐标空间增加了三倍,但我不认为这是一个重大的性能问题。


可以肯定的是,更高的分辨率看起来与原始分辨率完全相同。将网格划分为较小的网格时,您将获得相同的视觉表示,只是网格较小。每个单个正方形仅在同一位置变为4个较小的正方形。
MichaelHouse

@ Byte56正确,我的意思是说,在将其划分为该副本中添加额外的块之后,将应用其他逻辑。这样做的逻辑是留给读者的练习。
戴维

您可以通过模糊原始图像轻松生成高分辨率网格。然后定义一个阈值,例如,0.5是否要填充高分辨率电池。因此,使用高分辨率的网格对我来说真的很棘手。
danijar 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.