[cub3d](1)cub3d과제 개요



1️⃣ cub3d과제 목표

  • Raycasting(레이케스팅)을 이용하여 간단한 가상의 3D환경을 구현하는 것입니다.
  • Raycasting을 이용하여 만든 대표적인 게임으로는 이드 소프트웨어에서 1992년 개발된 올펜슈타인 3D(Wolfenstein 3D)가 있습니다.
  • 올펜슈타인은 16bit의 286컴퓨터에서도 동작하는 게임입니다.

Wolfenstein_3D

(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

    • Example of the mandatory part with a minimalist .cub scene: exampe_.cub
    • 파일에서 잘못된 구성이 발견되면 프로그램을 제대로 종료하고, 당신이 작성한 error메시지와 함께 “Error\n”을 반환해야 합니다.

(3) Raycasting학습 사이트

      >>>>>>PIKUMA<<<<<<


2️⃣ Raycasting

(1) Raycasting

  • Raycasting은 2D맵을 가상의 3D로 표현하는 기술을 말합니다.
  • 2D맵에서 벽으로 Ray(광선)을 발사하여 벽으로 부터 distance(거리)를 계산합니다.
  • 이렇게 계산된 distance(거리)를 통해 가상의 3D화면의 원근법을 표현할 수 있게하는 원리입니다.
    • 벽이 멀리있을수록 짧은기둥을 세우고 벽이 가까이있을수록 기둥을 세웁니다.
    • 기둥의 색/명도 또한 ray distance(광선거리)에 의존합니다. 2d_3d_raycasting

(2) Raycasting vs Raytracing

< Raycasting >

raycasting_sample
  • Ray(광선)이 그룹단위로 추척되고 캐스트됩니다.
  • 320x200 display에선 오직 320 Rays추적만 필요합니다.
  • Fast rendering
  • not realistic
  • 실시간 랜더링이 탁월합니다.
  • < Raytracing >

    raycasting_sample
  • Ray(광선)이 개별적으로(픽셀단위) 추척합니다.
  • 320x200 display에선 64,000 Rays추적이 필요합니다.
  • Slow rendering
  • extremely realistic
  • 실시간 랜더링에 적합하지 않습니다. (하지만 요즘 raytracing을 이용한 실시간 랜더링 기술이 발전중)
  • (3) Raycasting 한계(limitations)

    • 벽들은 항상 바닥과 perpendicular(수직)이어야 합니다.
    • 바닥은 항상 flat(평평)해야 합니다.
    • 벽들은 같은크기cube(입방체)로 만들어져야 합니다.(square grid only)




    © 2021.02. by kirim

    Powered by kkrim