luacollision-detectionraycastingti-nspire

Lua raycasting issues


I have worked day-in and day-out on a ray-casting engine I'm building for the Ti Nspire CX (with Lua), and am having issues with ray collision.

I have fiddled around with the area which I believe has the problem, because drawing of rays on the screen has no issues:

a wall

I have also done ALOT of debugging in this, such as displaying the coordinates which the rays are located when being shot outwards from the player. I say that I believe that the collision part has the problem because when I printed the radius of each ray, they all reached the maximum distance, which I set to be 40. This is the collision and single-ray management code:

function ray()
    radius = 1
    for n = 1, 40, 1 do -- increase of testdot
        x_ray = x + (radius * math.cos(rayf * 3.141592653/180))
        y_ray = y - (radius * math.sin(rayf * 3.141592653/180))
        --print(math.floor(x_ray,3), math.floor(y_ray,3), rayf, radius)
        for i = 1, 4, 1 do --for k,v in pairs(map) do -- testing for collision of testdot and a wall
            --print("X  ",v[1],"<-->",math.floor(x_ray),"<-->",v[3])
            --print("Y  ",v[2],"<-->",math.floor(y_ray),"<-->",v[4])'

            ------------------------------------
            if (
                math.min(map[i][1],map[i][3]) <= x_ray and x_ray <= math.max(map[i][1],map[i][3])
            ) and (
                math.min(map[i][2],map[i][4]) <= y_ray and y_ray <= math.max(map[i][2],map[i][4])
            ) then
                print("Collision")
                --return true
            end
            ------------------------------------
        end
        radius = n
    end
end

I know the second for-loop could be condensed, but I did this in my debugging process to find out why this won't function as it should.

The area around the ------------------------------------ is where the rays don't collide/over-reach/miss... I dont know why this isn't working, anyone have any suggestions?

Just for reference, this collision is based off a python program I was having issues with here, in, of course, the collision part.

Values of variables:

x, y is the position of the player (while raycasting this will remain static)

radius is the current radius of a single ray, and will continue to increment as long as no collision is detected

rayf is the current degree of the ray (is not relative to the player). Is calculated at the start of the program by taking the players degree (which isnt shown in here but is called 'facing'), adding 30, then rotating clockwise until the FOV of 60 degrees has been satisfied.

X-ray, y_ray are the current points of a single ray, and will continue to increment towards the specified rayf value, and will increment in values of 1 to make a radius equal to the n in the last for-loop. (Must note that the degrees are the same in a typical unit circle, and are NOT mirrored to match this mirrored y-axis; i.e. 90 degrees is up, 180 degrees is down.)


Solution

  • The reason the rays were always going past 40 was because the for-loop wasnt being canceled, which is a great reason to include a return to break out of the function and continue the code (I thought a return was included, however it wasn't functioning correctly, as you see in the:

    --return true
    

    Past this, the raycasting worked fine, but not math.floor-ing the new ray coord's also made the ray shoot beyond 40, for some unknown reason.