Raycast 播放器到网格交叉点的距离

Raycast Players Distance to Grid Intersection

我正在 JavaScript 中编写 raycaster。我在查找或实现光线投射算法时遇到问题。目前我正在尝试以下风格的演员表。

有一个方块宽度和高度相等的网格。我的玩家在网格内有一个位置,一个方向是他正在看的 0-360 度角。在第一步中,我需要计算出从我的播放器到网格交叉点处的绿点的距离。我知道绿点在十字路口,因此我可以算出红线的长度。交叉处有一个直角。当我计算出绿点的距离或 x 和 y 位置时,我必须在第二步中做一个类似的事情。橙色线的距离已知,绿点的位置和角度已知。同样,直角在相交的边界线上。

我什至不确定这种方式是否可行,但也许您还有其他想法我应该如何解决。非常感谢。

(对于下面的格式表示歉意;我正在 phone 上点击它)

根据三角学,cos(aplha) = (length of red line)/(length of hypotenuse)

因此:length of hypotenuse = (length of red line)/cos(alpha).

您将使用 sin 作为垂直交叉点。

不过要注意一点:如果你考虑当玩家直视墙壁时会发生什么,所有的长度都应该相同,这样它在屏幕上的高度就恒定了,但实际上它们是不同是因为对角线不同。您需要乘以 cos 玩家方向和施法方向之间的相对角度(因此,如果您有 60 度视野,则显示屏中心为 0,一个为 +30结束并在另一个下降到-30)。

也不要陷入认为投射的角度应该均匀分布的常见陷阱。再想想一个人直视墙壁并使用 atan 来获得正确的相对角度。

读取的光线参数方程

X = x + t cos α, Y = y + t sin α

t>0.

假设一个单位网格(但你可以重新缩放),第一象限的角度,与网格的第一个交点是

X = ceiling(x) => t = (X - x) / cos α => Y = y + (X - x) . tan α

Y = ceiling(y) => t = (Y - y) / sin α => X = x + (Y - y) . cot α

两者中最小的 t 会告诉您水平和垂直中的哪一个先满足。

下一个交叉点是 X = ceiling(x) + iY = ceiling(y) + j,因此 Y 步长 tan αX 步长 [=20] =].

对于其他象限,ceiling 将替换为 floor