메뉴 건너뛰기

창조도시 기록보관소

언어 [DX&C++] 지형을 만들어 봅시다. (Height Map)

2007.04.02 15:42

Zeprod 조회 수:492 추천:4

 


 


오늘은 그동안 알려드린 내용을 얼버무려 지형을 만들어내는 과정을 알려드리도록 하겠습니다.


 


지형을 아주 간단하게 표현할 수 있는 방법으로 높이맵(Height Map)이라는 기법이 있습니다.


 


이 기법은 평면 타일을 배열하고, 각각의 높이값만을 변화하면서 지형을 표현하는 방법입니다.


 


 


 


GPG Study의 pinewood 님의 스크린샷이 도움이 될것 같아 이것의 예제그림으로서 첨부하겠습니다.



 


이 스크린샷을 통해 거리에따라 폴리곤의 수를 다르게 사용하는 LOD 기법을 적용한 스크린샷이지만,


 


어떻게 높이를 이용해 지형을 표현하는지 알 수 있으실 것입니다.


 


 


 


일반적으로는 디자인의 편리성을 위하여 높이값을 저장한 그림을 사용하지만, 여기에선 순수하게 코드를 설명하기위해 배열을 이용하겠습니다.


 


 


 


우선 높이를 저장할 수 있는 2중 배열을 만들어 냅니다.


 


float Height[10][10] = {0,}; // 10*10크기의 맵


 


이 배열에 높이 값을 변화하여 지형을 디자인한 후,


 


그 후, 위 배열을 우리가 사용할 버텍스 배열에 정확하게 옮겨주면 됩니다.


 


 


 


CUSTOM_VERTEX map[100]; // 10*10= 100


 


for (int i = 0; i < 10; i++)


{


    for (int j = 0; j < 10; j++)


    {


        map[(i*10)+j].x = i;


        map[(i*10)+j].y = j;


        map[(i*10)+j].z = Height[j][j]; // (i*255)+j 는 1차배열이 256개인 경우의 [i][j]와 같은 기능을 합니다만, 1차원 배열에서 사용하기위한 변환입니다.


    }


}


 


간단하게 커스텀 버텍스배열에 좌표를 입력하였습니다.


 


이때 텍스쳐의 좌표(u,v) 값이나 정점 특유의 색(diffuse) 값 등을 함께 입력하시는 것이 좋습니다.


 


그럼 x, y 좌표는 배열의 순서에 맞게 평면 배치가 될 것이며, 높이는 Height값이 될 것입니다.


 


 


 


이 버텍스들을 그대로 출력한다고 삼각형이 그려지는 것이 아니니, 이제 그림을 그릴 순서를 정해주어야 합니다.


 


인덱스 버퍼를 만들어주는 것이지요.


 


정점들은 (i*255)+j 공식을 이용하여, 좌표 접근이 가능하므로, 자유롭게 그림을 그려줄 수 있습니다.


 


즉 배열의 인덱스를 다음과 같이 생각하시면 됩니다.


 


 0   1   2   3    4   5   6   7  ...


10  11 12  13  14  ...


...


90 ........................... 99


 


이런 인덱스들을 선으로 엮어 하나의 판을 만들어 주는것이 목적입니다.


 


 


 


이때 사각형을 그리는데 사용하는 방식은 다음과 같습니다.


 


1 3 5 ...


2 4 6 ...


 


1부터 순서대로 선을 이어주는 방식으로 TRIANGLE_STRIP을 걸어주시면, 계속 이어지는 사각형을 구성할 수 있지요.


 


이 방식으로 1,2라인의 높이값 사이부분을 채워주시고 (256번째까지), 이것이 끝나면, 다음줄로 이동합니다.


 


   1   3   5  // 1라인


   2   4   6  // 2라인


     - 라인 구분-


   11  9   7  // 2라인


   12 10  8  // 3라인


 


숫자 순서대로 각 라인의 인덱스를 호출해주시면 됩니다. 짝수번째 라인에서는 그리는 방향이 역순이 되는군요.


 


이런 방식으로 라인변환을 하면서 전체의 맵을 구성할 수 있을 것입니다.


 


 


이것을 코드로 구현하면 다음과 같이 됩니다.


 


WORD index[180]; // 20*9 = 180


 


int count = 0;


for (int i = 0; i < 10; i++)


{


    for (int j = 0; j < 10; j++)


    {


         index[count++] = i*10+j;


         index[count++] = (i+1)*10+j;


    }


}


 


여기부터 헷갈리실 것 같네요. 20*9라는 숫자가 어째서 튀어나왔는가 부터 그 밑의 대입까지,,


 


20*9라는 숫자는 다음과 같습니다. 우선 그림을 그리려면 위 아래 두줄을 참조해야 합니다.


 


따라서 1줄당 20개의 인덱스가 필요하지요.


 


그리고 총 10개를 이용하여 그리는 사각형 라인은 9개입니다. (10개의 점 사이 공간이 9개 인것을 생각하세요.)


 


따라서 총 인덱스가 180개가 필요하게 된 것이지요.


 


 


밑에서는 index 배열에 2개씩 순차적으로 접근하면서 1,2 라인의 인덱스 값을 순서대로 적어주게 됩니다.


 


이런 방식으로 0번부터 9번까지 사각형 라인을 그려나갑니다.


 


아주 간단하게 위에서 말한 순서대로 정점 배치가 끝났습니다


 


 


 


이 부분은 저도 실제로 사용하고 있는 부분이지만, 실제로 진행되는 과정을 보여드릴 수 없는 것이 안타깝습니다.


 


이해가 안가는 부분에 대해서 질문해주시면 성심성의를 다하여 답변해드리도록 하겠습니다.


 


 

번호 제목 글쓴이 날짜 조회 수
409 초보자를 위한 그래픽 소스 게임에 넣을 때의 팁. [3] file 한글화마스터 2007.07.15 1025
408 [THDO]판화 세계지도제작 스크립트. [7] file 협객 2007.06.25 1668
407 바실리어트 - 비주얼노벨형 게임 제작용 엔진 [4] 플루비아♥ 2007.06.24 954
406 [스크립트 문제]RPGXP에서 타일셋의 우선순위 문제 해결 [1] file Novelist 2007.06.19 809
405 [C++] 클래스(객체지향) - 기본 생성자와 소멸자 [3] Sirjhswin 2007.06.11 487
404 RPGXP의 기본전투 속도를 더욱 빠르게~ [9] Novelist 2007.06.08 1139
403 [C++] 한글과 영어가 섞인 문자열의 길이 체크 [4] Zeprod 2007.05.27 1427
402 [DX&C++] 화면에 글씨를 써볼까요. [2] Zeprod 2007.05.17 741
401 미소녀 제작기에 대해. Light 사의 Lum 툴....? [4] 협객 2007.05.14 1100
400 윈터뮤트 엔진.....이라는군요. [1] 협객 2007.05.13 592
399 vnap 로드는 load로 되는데 세이브는 save로 안된다??????????? ㅡ.ㅡ; [2] 협객 2007.05.13 550
398 [구기술체험소] Fast Chatting System [2] file 비밀소년 2007.04.30 678
397 [구기술체험소] Fast Animation System [2] file 비밀소년 2007.04.30 763
396 턴알에서 순간데미지 2배이상으로늘리기[턴알] [2] Dship 2007.04.28 716
395 오랜만에 잡담 하나 [4] 아란 2007.04.27 367
394 렉없는 자동세이브 스크립트!!! [5] 귀찮아‡ 2007.04.19 755
393 [DX&C++] 3D를 넘어 2D로! [13] Zeprod 2007.04.11 831
392 마우스 이동 스크립트 [12] 아크로s 2007.04.08 1420
391 '에피소드'형식이 아닌 '화' 형식의 시나리오는 어떨까요? [2] 우드록맨 2007.04.03 544
» [DX&C++] 지형을 만들어 봅시다. (Height Map) [1] Zeprod 2007.04.02 492