FDF

그래픽스 기초

**FDF(Fil De Fer)**는 프랑스어로 “철사”라는 뜻으로, 이름 그대로 3차원 형상을 철사로 만든 것처럼 와이어프레임(wireframe) 형태로 렌더링하는 과제이다.


개요

높이 맵(height map)이 담긴 .fdf 파일을 파싱하여, 파일에 기록된 좌표 정보를 3차원 공간에 점으로 배치하고 인접한 점들 사이를 선으로 이어 와이어프레임 지형을 화면에 그려낸다.

아래와 같이 숫자들의 배열로 이루어진 map 파일이 입력으로 주어진다.

0  0  0  0  0  0  0  0  0  0  0  0  0
0  0  0  0  0  0  0  0  0  0  0  0  0
0  0 10 10  0  0 10 10  0  0  0 10 10
0  0 10 10  0  0 10 10  0  0  0  0  0

각 숫자는 다음과 같이 해석된다.

정보의미
숫자의 위치x축 좌표
숫자의 위치y축 좌표
숫자의 z축 좌표(높이)

즉, 값이 0인 숫자들은 평지, 값이 10인 숫자들은 솟아오른 지형을 나타낸다. 이 데이터를 3차원 공간에 배치하고 화면에 투영하면 위 영상과 같은 와이어프레임 지형이 만들어진다.


구현 내용

높이 맵 파싱 및 좌표 구성
.fdf 파일을 읽어 각 숫자를 x, y, z 좌표로 변환하고, 인접한 점들을 선으로 이을 수 있도록 데이터를 구성한다.

Bresenham 직선 알고리즘
두 점 사이에 선을 그을 때, 부동소수점 연산 없이 정수 연산만으로 픽셀을 결정하는 Bresenham 알고리즘을 사용하여 라인을 래스터라이징한다.

행렬 기반 TRS 변환
이동(Translate), 회전(Rotate), 스케일(Scale)을 행렬 연산으로 처리한다. 3차원 좌표에 변환 행렬을 곱하는 방식으로 뷰 조작을 구현했다.

투영 모드 전환
3차원 좌표를 2차원 화면에 투영하는 방식으로 두 가지 모드를 구현했다.

  • 등각 투영(Isometric Projection): 원근감 없이 모든 축의 비율이 동일하게 표현된다.
  • 캐비닛 투영(Cabinet Projection): 정면을 기준으로 깊이 방향을 비스듬하게 표현한다.

실행 방법

먼저 의존성 패키지를 설치한다.

sudo apt-get update && sudo apt-get install xorg libxext-dev zlib1g-dev libbsd-dev

예제 map 파일들은 test_maps 경로에 위치해 있다. 아래와 같이 실행한다.

./fdf ./test_maps/42.fdf

조작 키

창이 열리면 다음 키로 뷰를 조작할 수 있다.

Scale (확대/축소)

  • : 확대
  • : 축소

Rotate (회전)

  • A, D : Y축 회전
  • W, S : X축 회전
  • Q, E : Z축 회전

Translate (이동)

  • I, K : X축 이동
  • J, L : Y축 이동

기타

  • Space : 투영법 전환 (등각 투영 ↔ 캐비닛 투영)
  • ESC : 종료