Java光线投射(raycaster)使用cos校正鱼眼畸变失效问题求助
光线投射器鱼眼校正失效问题修复
问题描述
使用Java实现光线投射器时,复用此前JavaScript项目中correctedDistance = distance * cos(射线角度偏移量)的鱼眼校正方案未生效,渲染效果存在明显弧形畸变。
效果截图:
根因定位
- 变量作用域错误:你在
draw3d方法的if-else分支内部声明了局部变量ra,赋值仅在分支作用域内有效,后续计算校正距离cd时调用的是类未初始化的成员变量ra,默认值为0,校正逻辑完全未生效。 - 校正角度计算逻辑错误:鱼眼校正所需的参数是当前射线角度与玩家朝向的差值,你现有逻辑额外加入了90度偏移,计算得到的角度值不符合校正要求。
修复方案
将draw3d方法中的对应错误逻辑替换为以下代码即可:
// 计算射线与玩家朝向的角度差 double angleDelta = angle - Player.angle; // 角度归一化,保证差值落在[-π, π]区间,避免角度溢出导致的计算错误 while (angleDelta < -Math.PI) { angleDelta += 2 * Math.PI; } while (angleDelta > Math.PI) { angleDelta -= 2 * Math.PI; } // 计算校正后的距离 double cd = d * Math.cos(angleDelta);
可选优化建议
- 射线长度的平方根计算可以提前到射线与墙体求交的阶段完成,无需每次渲染时重复计算,可提升渲染性能。
- 射线索引可以在射线实例创建时就作为属性存储,无需每次调用
indexOf遍历列表查询,降低性能开销。
内容的提问来源于stack exchange,提问作者Ryan Grube
相关产品推荐
相关产品推荐

