조회 수 1580 추천 수 4 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

 


 


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


 


지형을 아주 간단하게 표현할 수 있는 방법으로 높이맵(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번까지 사각형 라인을 그려나갑니다.


 


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


 


 


 


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


 


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


 


 

?

List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
» 언어/기타 [DX&C++] 지형을 만들어 봅시다. (Height Map) Zeprod 2007.04.27 1580
163 언어/기타 흥크립트 팁 A. 미스릴 2007.12.30 1585
162 언어/기타 셔츠그리기 카타린 2006.11.25 1586
161 RPG Maker RPGXP 스크립트를 공부 합시다. -1강- 장아찌 2005.06.05 1587
160 언어/기타 리젠 가능한 액알 블리쳐 2005.06.05 1591
159 RPG Maker [rpg2k] 바로가기를 이용해 테스트 플레이 실행하기 1 베넘 2012.01.14 1595
158 RPG Maker 공격패턴의 다양화 사토루 2006.01.29 1600
157 언어/기타 1. 변수 응용 프로그램 만들기 천영진 2007.02.21 1602
156 RPG Maker 게이지바 공식입니다 CC 2005.08.08 1610
155 RPG Maker 심심해서 생각해본 rpg2000툴로 전략시뮬(실시간) 만들기 감자는칩이다 2006.10.22 1611
154 RPG Maker 포션없다 시스템 비밀소년 2006.07.28 1613
153 언어/기타 Fruity Loops에서 FX탭 사용방법 (1) Mr^Lee 2005.05.18 1613
152 RPG Maker 프린세스메이커3를 만들어보자!!①.오프닝편 Ress 2006.01.16 1615
151 언어/기타 몬스터의 인공지능 재티s 2006.01.17 1618
150 RPG Maker RXP 메뉴/맵 배치/이벤트 설명 『연금술사』 2005.07.23 1622
149 언어/기타 [c++] 생성자,파괴자 챔피온 2005.05.26 1629
148 언어/기타 [다크의 4차원 강좌] 제목 설정의 중요성 1 다크아머 2008.05.19 1651
147 RPG Maker [RPG2000/3 팁] 간편한 이벤트 단축키 하앵 2015.04.06 1666
146 언어/기타 게임 시나리오 쓰기에 앞서 샤르엘 2007.11.09 1668
145 언어/기타 [DX&C++] 3D를 넘어 2D로! Zeprod 2007.04.18 1675
Board Pagination Prev 1 ... 38 39 40 41 42 43 44 45 46 47 ... 51 Next
/ 51






[개인정보취급방침] | [이용약관] | [제휴문의] | [후원창구] | [인디사이드연혁]

Copyright © 1999 - 2016 INdiSide.com/(주)씨엘쓰리디 All Rights Reserved.
인디사이드 운영자 : 천무(이지선) | kernys(김원배) | 사신지(김병국)