You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Lua 2D光线投射引擎非鱼眼类渲染扭曲效应补偿方法求助

射线渲染扭曲修复方案

核心问题根源

你当前使用等角度均分FOV的方式生成扫描射线,是导致笔直墙面渲染为外凸曲面的核心原因:

  • 等角度步长的射线,在透视投影平面上的水平采样间距是不均匀的,屏幕边缘的采样密度远低于中心,即使做了鱼眼距离校正,也无法修正这种采样本身导致的几何扭曲。

具体修复步骤

1. 改用投影平面等距采样生成射线角度

不要直接均分FOV的角度值,改为基于透视投影平面的水平坐标反算射线角度,步骤如下:

  1. 预计算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
  1. 替换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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 16:54:03