115 lines
3.5 KiB
Markdown
115 lines
3.5 KiB
Markdown
# cube3D
|
|
---
|
|
|
|
### install
|
|
---
|
|
|
|
this project uses submodules recursively, so you after cloning you need to :
|
|
|
|
`git submodule update --init --recursive`
|
|
|
|
|
|
### presentation
|
|
---
|
|
|
|
This project is a 3D mini game, that uses raycasting to produce a FPP (first person perspective), something like Wolfenstein3D or Doom.
|
|
|
|

|
|
|
|
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 :
|
|
|
|

|
|
|
|
You can change the images on the wall :
|
|
|
|

|
|
|
|
And change the map itself :
|
|
|
|

|
|
|
|
|
|
# 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
|
|
|
|

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

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

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

|
|
|
|
5. so a full scan gives the illusion of perspective
|
|
|
|

|
|
|
|
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
|
|
|
|

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

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

|
|
|
|
|
|
|
|
# ressources
|
|
---
|
|
|
|
- [tuto mlx](https://harm-smits.github.io/42docs/libs/minilibx/getting_started.html)
|
|
- [tuto raycasting js](http://www.playfuljs.com/a-first-person-engine-in-265-lines)
|
|
- [course about matrices and transformations in space (chapter 1 to 5)](https://www.youtube.com/watch?v=fNk_zzaMoSs&list=PLZHQObOWTQDPD3MizzM2xVFitgF8hE_ab)
|
|
|