GameMaker射线投射鱼眼效应修正失效问题求助
解决GameMaker射线投射器的鱼眼效应问题
你的核心问题出在鱼眼修正的角度计算逻辑和射线角度分布的合理性上,以下是具体修复方案:
问题根源
- 鱼眼修正公式错误:你用了
ray[0]*cos(degtorad(rotation-rot_start)),角度差的方向搞反了,导致侧面墙体的修正逻辑完全错误。鱼眼效应需要用射线与玩家正前方的夹角余弦来修正,而非玩家朝向与射线的反向差值。 - 射线角度分配不合理:原来的
rot_start=rotation-resolution/2+每次加1度的逻辑,会让视野范围完全绑定射线数量(比如100条射线就对应100度视野),这不符合常规射线投射的视野设定,也会间接加剧畸变。
修复后的代码
修正draw_rays()函数
function draw_rays() { const FOV = 60; // 自定义你的视野角度,常用值60-90度 var rot_start = rotation - FOV / 2; var ray_angle_step = FOV / resolution; // 每条射线的角度增量 var ray_width = room_width / resolution; for (var r = 0; r < resolution; r++) { var ray = cast_ray(x, y, rot_start); var raw_distance = ray[0]; // 计算射线与玩家正前方的角度差(转为弧度) var angle_offset = degtorad(rot_start - rotation); // 鱼眼修正:用原始距离乘以角度差的余弦,得到垂直于投影平面的真实距离 var corrected_distance = raw_distance * cos(angle_offset); var wall_height = clamp(50000 / corrected_distance, 0, room_height); var wall_color = make_color_rgb(clamp(wall_height, 0, 255), clamp(wall_height, 0, 255), clamp(wall_height, 0, 255)); draw_set_color(wall_color); draw_rectangle(r * ray_width, height - wall_height/2, r * ray_width + ray_width, height + wall_height/2, false); rot_start += ray_angle_step; } }
关键修复点解析
- 固定FOV视野:通过
FOV常量设定固定视野角度,射线按FOV/resolution均匀分配角度,确保不同射线数量下视野大小一致,避免角度分布不均导致的畸变。 - 正确的鱼眼修正:
angle_offset = degtorad(rot_start - rotation)计算射线相对于玩家正前方的偏移角度,乘以余弦值后得到的是射线到投影平面的垂直距离——这正是消除鱼眼效应的核心:斜向射线的实际长度会被余弦值“压缩”到垂直投影的真实长度,避免斜墙被过度拉伸。 - 变量命名优化:把
rayd拆分为raw_distance和corrected_distance,让逻辑更清晰,便于调试。
内容的提问来源于stack exchange,提问作者SomeRandomDude
相关产品推荐
相关产品推荐

