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

时间:2018-07-16 11:36:48

标签: algorithm trigonometry raycasting

我正在用JavaScript编写光线投射器。我在为射线广播找到或实现算​​法时遇到了麻烦。目前,我正在尝试采用以下样式进行投射。

enter image description here

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

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

2 个答案:

答案 0 :(得分:1)

(下面的道歉格式;我正在电话上敲这个)

根据三角学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来获得正确的相对角度。

答案 1 :(得分:0)

射线的参数方程式

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在步骤cot α

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