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) + i
和 Y = ceiling(y) + j
,因此 Y
步长 tan α
和 X
步长 [=20] =].
对于其他象限,ceiling
将替换为 floor
。
我正在 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) + i
和 Y = ceiling(y) + j
,因此 Y
步长 tan α
和 X
步长 [=20] =].
对于其他象限,ceiling
将替换为 floor
。