[cub3d](1)cub3d과제 개요
1️⃣ cub3d과제 목표
- Raycasting(레이케스팅)을 이용하여 간단한 가상의 3D환경을 구현하는 것입니다.
- Raycasting을 이용하여 만든 대표적인 게임으로는 이드 소프트웨어에서 1992년 개발된 올펜슈타인 3D(Wolfenstein 3D)가 있습니다.
- 올펜슈타인은 16bit의 286컴퓨터에서도 동작하는 게임입니다.
(1) 사용가능한 함수
- open, close, read, write, printf, malloc, free, perror, strerror, exit
- math library의 모든 함수( -lm man man 3 math )
- MinilibX의 모든 함수
(2) 제약조건
- 반드시 miniLibXf를 사용해야 한다. (단, OS별로 가능한 버전을 사용하거나 소스에서 제공되는 것으로 사용해도 된다.)
- 창의 관리가 자연스러워야 합니다. (예를들어 다른 창으로 옮기기, 최소화하기 등등)
- 동서남북에 다른 텍스처(자신이 고른)가 보여야합니다.
- 벽 대신에 아이템(sprite)를 보여줄 수 있어야 합니다.
- Deepthought가 너의 평가를 할 것에 대비하여, 두번째 인자로 ‘–save’가 입력됐을 경우 첫 번째 렌더링된 이미지를 bmp형식으로 정장해야 합니다.
- 두번째 인자가 제공되지 않는다면, 프로그램은 다음규칙에 따라 창안에 이미지를 출력해야 합니다.
- 왼쪽,오른쪽 방향키는 미로의 왼쪽, 오른쪽을 바라볼 수 있어야 합니다.
- W, A, S, D키는 미로안에서 시점을 이동시킬 수 있어야 합니다.
- ESC를 누르면 창이 닫히고 프로그램이 완전히 종료되야 합니다.
- 창의 빨간색 x버튼을 누르면 창이 닫히고 프로그램이 완전히 종료되야 합니다.
- 지도에 나온 화면의 크기가 디스플레이 해상도보다 크다면 현재 디스플레이 해상도에 따라 창 크기를 설정해야 합니다.
- minilibX의 이미지 사용을 강력히 권장합니다.
- 프로그램은 확장자가 ‘.cub’인 장면 설명 파일을 첫번째 인자로 받아야 합니다.
- 맵은 4가지 문자로 이루어져 있어야 합니다. 0: 빈칸, 1: 벽, 2: 아이템, N, S, E, W: 플레이어 시작지점(태어났을때 바라볼 방향)입니다.
- 다음은 위 조건사항을 충족시키는 간단한 맵입니다.
111111
100101
102001
1100N1
111111
- 지도는 반드시 벽으로 둘러 쌓여있어야 합니다. 그렇지 않은 경우 프로그램은 error를 반환해야 합니다.
- 지도를 제외하고, 각 요소들은 한 줄 이상으로 구분될 수 있습니다.
- 끝부분에 위치하는 지도를 제외하고, 각 요소들의 순서는 제각각일 수 있어야 합니다.
- 지도를 제외하고, 각요소의 정보들을 하나 이상의 공백으로 구분될 수 있습니다.
- 지도는 파일에 있는 그대로 파싱 되어야 합니다. 빈공간의 맵이 있을 수 있으며, 그것은 당신이 처리하기에 달려있습니다. 지도의 규칙을 따르는한 당신은 어떤 종류의 맵도 파싱할 수 있어야 합니다.
- 각요소(맵을 제외한)의 첫번째 정보는 유형식별자(type identifier)입니다. (한개 혹은 두개의 글자로 이루어진)
- Resolution:
R 1920 1080 · identifier: R
· x render size
· y render size - North texture:
NO ./path_to_the_north_texture · identifier: NO
· path to the north texure - South texture:
SO ./path_to_the_south_texture · identifier: SO
· path to the south texure - West texture:
WE ./path_to_the_west_texture · identifier: WE
· path to the west texure - East texture:
EA ./path_to_the_east_texture · identifier: EA
· path to the east texure - Sprite texture:
S ./path_to_the_sprite_texture · identifier: S
· path to the sprite texure - Floor color:
F 220,100,0 · identifier: F
· R,G,B colors in range [0,255]: 0, 255, 255
- Resolution:
- Example of the mandatory part with a minimalist .cub scene:
- 파일에서 잘못된 구성이 발견되면 프로그램을 제대로 종료하고, 당신이 작성한 error메시지와 함께 “Error\n”을 반환해야 합니다.
(3) Raycasting학습 사이트
>>>>>>PIKUMA<<<<<<
2️⃣ Raycasting
(1) Raycasting
- Raycasting은 2D맵을 가상의 3D로 표현하는 기술을 말합니다.
- 2D맵에서 벽으로 Ray(광선)을 발사하여 벽으로 부터 distance(거리)를 계산합니다.
- 이렇게 계산된 distance(거리)를 통해 가상의 3D화면의 원근법을 표현할 수 있게하는 원리입니다.
- 벽이
멀리 있을수록짧은 기둥을 세우고 벽이가까이 있을수록긴 기둥을 세웁니다. - 기둥의
색/명도 또한ray distance(광선거리) 에 의존합니다.
- 벽이
(2) Raycasting vs Raytracing
< Raycasting >
![raycasting_sample](https://kirkim.github.io/assets/img/cub3d/cub5.png)
< Raytracing >
![raycasting_sample](https://kirkim.github.io/assets/img/cub3d/cub6.png)
(3) Raycasting 한계(limitations)
- 벽들은 항상 바닥과
perpendicular(수직) 이어야 합니다. - 바닥은 항상
flat(평평) 해야 합니다. - 벽들은
같은크기 의cube(입방체) 로 만들어져야 합니다.(square grid only)