참조 페이지 기술
참조 1 : BMP Raw Height Map, 카메라 이동, 충돌 처리, Multi Texture 참조
쌈닭인디유 님의 "Height Map"
http://www.misofruit.co.kr/seojewoo/programming/opengl/opengl-8.htm
참조 2 : TGA Image Loader , Mesh 구조, Vertex Color, Texture3D 참조
바른생활님의 "3D 텍스쳐를 이용한 식생 분포 지도"
http://cafe.naver.com/gld3d/42
Height Map Tool 구현은 다음의 기술 적용을 목표로 진행 한다.
기술 1 : BMP Raw 파일을 읽어와서 Height Map 구성
기술 2 : 기본 방향키로 카메라 이동
기술 3 : Picking 적용
기술 4 : 높이값을 Picking 해서 높 낮이 조절하기
기술 5 : 변경 된 Data 저장 및 불러오기
기술 6 : Texture 불러와서 붙이기
6-1. Map Tile 전부 입히기
6-2. 선택한 Tile에만 입히기
기술 7 : <기술4>에 대하여 Spline 적용해서 볼록(오목)하게 높 낮이 조절하기
2주 동안 짬짬히 시간을 내서 <기술1> <기술2> <기술 3> 까지 구현을 진행 하였다.
Camera는 전(W), 후(S), 좌(A), 우(D), 위로 날기(R), 아래로 날기(F) 가 가능하며
마우스로 Yawing과 Pitch 각도 변환이 가능.
기존 쌈닭님 코드는 오일러 변환 이었는데, 이를 Quaternion 변환으로 수정 함.
(사원수 변환이 맞는지는 모르겠지만 동작은 합니다 ^ㅁ^;)
결과물은 아래와 같다.
BMP File은 http://s3.invisionfree.com/The_Carnivores_Saga/ar/t1161.htm 페이지 에서 얻은 아래의 이미지를 이용 하였다.
(2048x2048 과 1024x1024 두 가지를 구현 해봄)
<glMultiTexCoord2fARB 를 이용해서 2개의 텍스쳐 합성 : 쌈닭인디유님 거 참조>
<glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); 를 이용해서 Wire Frame 표현>
<glTexImage3D(); 함수를 이용해서 6개의 이미지 합성 : 바른 생활님거 참조>
<Per Vertex Color 를 이용한 표현 : 바른생활님거 참조>
마지막으로 Game Programming Gems vol.1 의 "4.17 프렉탈 지형 생성 - 단층 변형" 장에서 "침식 작용의 표현"
을 참조해서 정점 X, Y, Z 에 대해서 Low pass filter 처리를 해주었다.
<Low pass filter 를 이용해서 LERP 처리를 하지 않았을 경우>
<Low pass filter 를 이용해서 LERP 처리를 해주었을 경우>
LERP 처리를 해줄 경우, 급 경사가 약간 부드러워 진다.
// CBMPTR.cpp
float CBMPTR::terrainFilterLerp(float value1, float value0)
{
float kCoff = 0.5f;
value1 = kCoff * value1 + (1.0f - kCoff)*value0;
return value1;
}
// In MeshFiller.cpp
int CMeshFiller::FillWithBMPTR(CMesh* pMesh , CBMPTR* pBMP)
{
x = pBMP->terrainFilterLerp(x, v0[0]);
y = pBMP->terrainFilterLerp(y, v0[1]);
z = pBMP->terrainFilterLerp(z, v0[2]);
}
---------------------
Height Map 자체가 워낙 많은 책(Direct X 용 책 과 해골 책 등)들에서 설명 하고 있으며,
위에 언급한 쌈닭님과 바른생활님 페이지에서도 잘 설명이 되어 있습니다.
프로젝트 소스는 Google Page(http://code.google.com/p/myastro/) 올렸습니다.
혹 필요하신 분은 참고하십시요 ^ㅁ^;
SSISO Community