Files
42_INT_10_cube3d/README.md
2024-01-20 23:27:26 +01:00

3.3 KiB

cube3D


This project is a 3D mini game, that uses raycasting to produce a FPP (first person perspective), something like Wolfenstein3D or Doom.

moving into the 3D

It creates a 3D view from a map in a text file, and move the view as if we were walking and looking around.

An example of a map :

$> cat -e map.cub
111111111111111111111111$
1......................1$
1......................1$
1......................1$
1.....11111....1.1.1...1$
1.....1...1............1$
1.....1...1....1...1...1$
1.....1...1....E.......1$
1.....11.11....1.1.1...1$
1......................1$
1......................1$
1......................1$
1......................1$
1......................1$
1.......11.............1$
1.......11.............1$
111111..11............11$
11.1....11.............1$
11....1.11............11$
11.1....11.............1$
11.1111111............11$
11...................111$
1111111111..........1111$
111111111111111111111111$
$>

This map will produce this 3D view :

moving into the 3D

You can change the images on the wall :

change the images on the wall

And change the map itself :

change the map

raycasting


Raycasting is a technic that creates the illusion of 3D with low computational power.

This technic has the hability to not show hidden area by design, which is a great simplification for rendering.

How it works :

  1. first you determine the position and orientation of the viewer in the map, and the distance and width of the screen

map with viewer position

  1. then you will scan this fictif screen with rays, each ray will correspond to a column in the 3D view

animation of rays scanning the map and creating columns in 3D view

  1. when a ray reaches a wall, it draw it in the 3D view

example of one ray drawing one column with portion of wall

  1. the height of the wall is inversely proportional to the length of the ray : the shorter the ray, the higher the wall

example of two rays drawing two columns with portion of different height walls

  1. so a full scan gives the illusion of perspective

animation of rays scanning the whole map and creating a 3D with fish eye deformation

  1. but this gives rounded walls, like a fish eye effect, because rays change length while scanning the wall, so we must apply a correction according to the angle

animation of rays scanning the whole map and creating a 3D with fish eye correction

  1. another step by step example to show how drawing gains in precision with more rays :

animation of raytracing with increasing number of rays

  1. example of raycasting in action, with errors, during the construction phase of the raycasting algorithm :

real raycasting during the construction  phase of the project

ressources