Lua 2D光线投射引擎非鱼眼类渲染扭曲效应补偿方法求助
射线渲染扭曲修复方案
核心问题根源
你当前使用等角度均分FOV的方式生成扫描射线,是导致笔直墙面渲染为外凸曲面的核心原因:
- 等角度步长的射线,在透视投影平面上的水平采样间距是不均匀的,屏幕边缘的采样密度远低于中心,即使做了鱼眼距离校正,也无法修正这种采样本身导致的几何扭曲。
具体修复步骤
1. 改用投影平面等距采样生成射线角度
不要直接均分FOV的角度值,改为基于透视投影平面的水平坐标反算射线角度,步骤如下:
- 预计算FOV对应的投影平面半宽,该值可以在
love.load中一次性计算,避免每帧重复运算:
function love.load() fullscreen = true love.window.setTitle("Raycaster") love.window.setMode(1280,720,{}) love.window.setFullscreen(true, "desktop") ScreenX,ScreenY = love.graphics.getDimensions() -- 新增投影半宽计算 projHalfWidth = math.tan(math.rad(pFOV / 2)) end
- 替换
love.draw中扫描角度scanX的计算逻辑:
for i = 1,ScreenX,1 do -- 删掉原来的等角度计算逻辑 -- local scanX = pRot+(i-1)*pFOV/ScreenX-pFOV/2 -- 替换为投影平面等距采样逻辑 local normX = (i - 0.5) / ScreenX local planeOffset = (normX * 2 - 1) * projHalfWidth local scanX = pRot + math.deg(math.atan(planeOffset)) local lx1,ly1 = math.cos(math.rad(scanX))*pViewRange+pPosX,math.sin(math.rad(scanX))*pViewRange+pPosY -- 后续原有逻辑保持不变
2. 性能优化(可选)
你当前在love.update中每帧都调用love.window.setFullscreen属于冗余操作,仅需要在按键切换全屏时调用即可,修改如下:
function love.keypressed( key ) if key == "f11" then fullscreen = not fullscreen love.window.setFullscreen(fullscreen, "desktop") end end -- 删掉love.update中的love.window.setFullscreen(fullscreen, "desktop")一行
修改完成后,笔直墙面的外凸扭曲就会完全消失,渲染结果符合真实透视效果。
内容的提问来源于stack exchange,提问作者RandomNoob164
相关产品推荐
相关产品推荐

