Как масштабировать высоту стен в Raycaster в соответствии с FOV? - PullRequest
0 голосов
/ 25 октября 2019

Я следую этому старому уроку по созданию базового raycaster: https://lodev.org/cgtutor/raycasting.html#The_Basic_Idea_

Проблема, с которой я столкнулся, заключается в том, что все стены выглядят слегка раздавленными или растянутыми в зависимости от размера поля зрения / плоскостииспользуется, как видно на этом изображении: here

Я думаю, что происходит то, что высота стен не зависит от размера плоскости, в то время как ширина равна. Если это так, то мне нужно знать, как повлиять на высоту стен. Тем не менее, это может быть что-то из урока, который я испортил.

Функция рисования (в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...