Я следую этому старому уроку по созданию базового raycaster: https://lodev.org/cgtutor/raycasting.html#The_Basic_Idea_
Проблема, с которой я столкнулся, заключается в том, что все стены выглядят слегка раздавленными или растянутыми в зависимости от размера поля зрения / плоскостииспользуется, как видно на этом изображении:
Я думаю, что происходит то, что высота стен не зависит от размера плоскости, в то время как ширина равна. Если это так, то мне нужно знать, как повлиять на высоту стен. Тем не менее, это может быть что-то из урока, который я испортил.
Функция рисования (в lua / love2d)
player = {}
player.x = 22
player.y = 12
player.dir = vector(-1, 0)
player.plane = vector(0, 0.80)
function buffer.draw()
love.graphics.setColor(1, 1, 1)
for x = 0, buffer.width-1 do
-- ray position and direction
local camera_x = 2 * x / buffer.width - 1
local ray_dir = {}
ray_dir.x = player.dir.x + player.plane.x * camera_x
ray_dir.y = player.dir.y + player.plane.y * camera_x
local ray_map = vector(math.floor(player.x), math.floor(player.y))
local delta_dist = vector(math.abs(1/ray_dir.x), math.abs(1/ray_dir.y))
local hit = 0
local step = {}
local side_dist = {}
-- Setting step directions and delta
if ray_dir.x < 0 then
step.x = -1
side_dist.x = (player.x - ray_map.x) * delta_dist.x
else
step.x = 1
side_dist.x = (ray_map.x + 1 - player.x) * delta_dist.x
end
if ray_dir.y < 0 then
step.y = -1
side_dist.y = (player.y - ray_map.y) * delta_dist.y
else
step.y = 1
side_dist.y = (ray_map.y + 1 - player.y) * delta_dist.y
end
-- DDA
while hit == 0 do
if side_dist.x < side_dist.y then
side_dist.x = side_dist.x + delta_dist.x
ray_map.x = ray_map.x + step.x
side = 0
else
side_dist.y = side_dist.y + delta_dist.y
ray_map.y = ray_map.y + step.y
side = 1
end
if world[ray_map.x][ray_map.y] > 0 then hit = 1 end
end
if side == 0 then perp_wall_dist = (ray_map.x - player.x + (1-step.x) / 2) / ray_dir.x
else perp_wall_dist = (ray_map.y - player.y + (1-step.y) / 2) / ray_dir.y end
-- Camera plane distance
line_height = (buffer.height / perp_wall_dist)
dist = math.max(1 - perp_wall_dist / 20,0.2) -- darken colour on distance
-- Setting colour
local color = {}
color[1] = colors[world[ray_map.x][ray_map.y]][1] * dist
color[2] = colors[world[ray_map.x][ray_map.y]][2] * dist
color[3] = colors[world[ray_map.x][ray_map.y]][3] * dist
if side == 1 then
color[1] = color[1]/2
color[2] = color[2]/2
color[3] = color[3]/2
end
-- find drawing positions
local dstart = -line_height / 2 + buffer.height / 2
if dstart < 0 then dstart = 0 end
local dend = line_height / 2 + buffer.height / 2
if dend >= buffer.height then dend = buffer.height - 1 end
--set the proper colour and then draw it
love.graphics.setColor(color)
love.graphics.rectangle("fill", x, dstart, 1, math.abs(dend-dstart))--dend-dstart)
end
end