Files
42_INT_10_cube3d/README.md
2024-01-20 21:17:30 +01:00

3.6 KiB

cube3D


This project is a 3D mini game, that uses raycasting to produce a FPP (first person perspective), just like in 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 very 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 -> png map with eye and screen
  2. then you will scan this fictif screen with rays, each ray will correspond to a column in the 3D view -> gif rays scanning, then columns simutanously appear on both side
  3. when a ray reaches a wall, it draw it in the 3D view -> png one ray on close box
  4. the height of the wall is inversely proportional to the length of the ray : the shorter the ray, the higher the wall -> png two rays, one for each box
  5. so a full scan gives the illusion of perspective -> gif scan of the rays with fish eye
  6. 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 -> gif scan with strait walls

  1. first you determine the position and orientation of the viewer in a plan,

  1. then you cast a ray until it reaches a wall

  1. you can now trace the vertical line on the 3D view

  1. the height of the wall is inversely proportional to the length of the ray : the closer the wall, the heigher it is

  1. finally, if the rays scan the whole picture, you see the perspective appears

  1. but you can also see that walls are rounded, like a fish eye effect. It's because rays change length while scanning the wall, so we must apply a correction according to the angle

  1. a more realistic step by step example looks like this :

example of raycasting with errors in action while construction of the project :

example of raycasting during the construction of the project

ressources