我在为 Ti Nspire CX(使用 Lua)构建的光线投射引擎上日复一日地工作,并且遇到了光线碰撞问题。
我已经摆弄了我认为有问题的区域,因为在屏幕上绘制光线没有问题:
我在这方面也做了很多调试,比如显示从玩家向外射出时光线所在的坐标。我说我相信碰撞部分有问题,因为当我打印每条射线的半径时,它们都达到了最大距离,我设置为40。这是碰撞和单射线管理代码:
function ray()
radius = 1
for n = 1, 40, 1 do -- increase of testdot
x_ray = x + (radius * math.cos(rayf * 3.141592653/180))
y_ray = y - (radius * math.sin(rayf * 3.141592653/180))
--print(math.floor(x_ray,3), math.floor(y_ray,3), rayf, radius)
for i = 1, 4, 1 do --for k,v in pairs(map) do -- testing for collision of testdot and a wall
--print("X ",v[1],"<-->",math.floor(x_ray),"<-->",v[3])
--print("Y ",v[2],"<-->",math.floor(y_ray),"<-->",v[4])'
------------------------------------
if (
math.min(map[i][1],map[i][3]) <= x_ray and x_ray <= math.max(map[i][1],map[i][3])
) and (
math.min(map[i][2],map[i][4]) <= y_ray and y_ray <= math.max(map[i][2],map[i][4])
) then
print("Collision")
--return true
end
------------------------------------
end
radius = n
end
end
我知道第二个 for 循环可以被压缩,但我在调试过程中这样做是为了找出为什么它不能正常工作。
------------------------------------------------ 周围的区域是光线不会碰撞/越过的区域-reach/miss...我不知道为什么这不起作用,有人有什么建议吗?
仅供参考,这个碰撞是基于我在这里遇到问题的一个 python 程序,当然,在碰撞部分。
变量值:
x, y 是玩家的位置(在光线投射时,这将保持静态)
radius 是单条射线的当前半径,只要没有检测到碰撞就会继续增加
rayf 是射线的当前度数(与玩家无关)。在程序开始时计算玩家的度数(此处未显示,但称为“面对”),加上 30,然后顺时针旋转直到满足 60 度的 FOV。
X-ray, y_ray 是单条射线的当前点,会继续朝着指定的rayf值递增,并且会递增1,使半径等于最后一个for循环中的n。(必须注意,典型单位圆中的度数是相同的,并且不会镜像以匹配这个镜像的 y 轴;即向上 90 度,向下 180 度。)