Skip to content

Labin97/cub3D

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

65 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Cub3D


image
NO ./path_to_the_north_texture
SO ./path_to_the_south_texture
WE ./path_to_the_west_texture
EA ./path_to_the_east_texture

F 220,100,0
C 225,30,0

        1111111111111111111111111
        1000000000110000000000001
        1011000001110000000000001
        1001000000000000000000001
111111111011000001110000000000001
100000000011000001110111111111111
11110111111111011100000010001
11110111111111011101010010001
11000000110101011100000010001
10000000000000001100000010001
10000000000000001101010010001
11000001110101011111011110N0111
11110111 1110101 101111010001
11111111 1111111 111111111111

지도가 주어져 있으면 지도의 유효성을 검사하고, 각각의 이미지에 맞게 동서남북 벽의 이미지를 보여준다. 이후 천장과 바닥의 색을 주어진 값과 맞게 표현한다.

맵을 그리는 방법은 raycasting으로 2차원 맵에서 3차원의 원근감을 만드는 렌더링 기술이다. raycasting은 Scott D Roth의 'Ray Casting for Modeling Solids'라는 제목의 논문에서 처음 사용되었고, raycasting 기술을 사용한 게임 중 가장 유명한 게임은 'Wolfenstein 3D'입니다. raycasting 은 스크린의 모든 수직선에 대해 계산(calculation)만 하면 되어서 속도가 빠르다. 컴퓨터가 지금보다 느려서 3D 엔진을 실시간으로 실행할 수 없던 과거에는 레이캐스팅 이 최초의 해결책이었습니다.

image

레이캐스팅의 기본개념은 다음과 같습니다.

  • 2차원 정사각형 그리드로 된 맵 이 있습니다.
  • 맵의 한 칸(square)은 0 또는 양수 값을 갖습니다.
  • 0은 벽이 없음을 나타냅니다.
  • 양수값은 벽이 있음을 나타내고, 특정 색상 또는 특정 질감을 나타냅니다.
  • 화면의 모든 x값(수직선) 에 대해 플레이어 위치에서부터 시작하는 광선(Ray) 을 쏩니다.
  • 이 때 광선의 방향은 플레이어 가 바라보는 방향, 그리고 화면의 x좌표에 의존합니다.
  • 이 광선은 2D맵 위에서 벽에 부딪힐 때까지 직진하다가, 벽에 부딪히면 적중지점(hit point)으로부터 플레이어까지의 거리 를 잽니다.
  • 이 거리에 따라 벽의 높이 가 화면에 얼마만큼으로 그려져야 하는지 결정됩니다. 벽의 높이는 플레이어와 벽 사이의 거리가 멀수록 화면에 더 낮게, 가까울 수록 더 높게 표시됩니다.
  • 이것들은 모두 2차원 계산으로 구할 수 있는 것들입니다.
  • 상단의 이미지에서 위에서 내려다 본 2차원 평면도입니다.
  • 광선(red line)이 플레이어(green spot)에서 시작해서 벽(blue square)에 도달하는 것을 보여줍니다.

image

검사 지점을 모든 지점으로 하는 것보다 광선이 닿는 벽의 모든 면을 검사하는 방법이 더 효율적이다. 그렇기에 DDA(Digital Differential Analysis) 기반으로 하는 알고리즘이 사용된다.

  • DDA 알고리즘은 2차원 그리드를 지나가는 선(line)이 어떤 네모칸과 부딪히는지 찾을 때 일반적으로 사용되는, 속도가 빠른 알고리즘입니다. 그래서 이 알고리즘을 사용해서 광선이 맵에서 어떤 네모칸이랑 부딪히는지 찾아낼 수 있고, 벽에 부딪힌 것이 확인되면 이 알고리즘은 중단됩니다.

image 또한 벡터와 카메라를 이용하여 시야각을 표현한다.

참조

https://github.com/365kim/raycasting_tutorial/tree/master

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published