Raycasting howto blogs are a dime a dozen, though little about ceiling or floor casting is ever mentioned.
The height of the wall is calculated by taking the normal ray to the wall (in this case, the x direction), and multiplying the focal length of the field of view. The normal is clamped to a small value in case the player gets too close to the screen.
const float normal = ray.x < 1e-2f ? 1e-2f : ray.x; const float size = 0.5f * focal * xres / normal;
The ray is defined as the difference of the vectors of the wall hit and the player:
const Ray ray = sub(wall.hit.where, hero.where);
The top and bottom of the wall can be found by subtracting half the size of the wall from the middle of the screen’s y-resolution.
const int top = (yres + size) / 2.0f; const int bot = (yres - size) / 2.0f;
When the player is parallel to a wall the following scene is rendered:
Ceiling and Floor casting
Ceiling and floor casting require a percentage of the floor in relation to the wall height:
An expression for y:
y = yres / 2 - h / 2
Where h is the size of the wall calculated earlier. With a bit of reordering a percentage (p) expression for y is simply:
p = -h / (2 * y - yres)
As both (h) and (yres) are constant, (y) will vary and change the percentage (p). This percentage is then used to lerp the along the casted ray:
See pcast(). This handles the floor and ceiling casting.