2008/07/08 15:44

[D3DX] 맵 타일 완성!

사용자 삽입 이미지

3D 세계의 맵을 구성하는 가장 기본적인 단위인 "타일" 이다.
아무리 거대한 맵이라도 이 타일이 합쳐져서 큰 맵하나가 되는것이다.
이제 여기에 Y (높이맵) 값만 적용해주면 그럴싸한 지형이 완성될것이다.!!

이 타일의 버텍스버퍼와 인덱스버퍼를 만드는 코드는 다음과 같이작성했다.

void Cdx3dView::initPlane()
{
 int width = 15; // 가로 버텍스수 15개
 int height = 15; //세로 버텍스수 15개
 int total = width*height; // 총 버텍스수
 float gap = 1.0f; //버텍스 간의 거리
 
 PVertex arrTemp[225];
 for(int i=0;i<width;i++) // 행
 {
  for(int j=0;j<width;j++) // 열
  {
   arrTemp[ j + i*width ].position = D3DXVECTOR3(gap*(float)j, 0.0f, gap*(float)i);  
  }
 }
 void *pTemp;

 m_pd3dDevice->CreateVertexBuffer(sizeof(PVertex)*total, 0, PVertex::FVF, D3DPOOL_MANAGED, &planeVB, 0);
 planeVB->Lock(0, sizeof(PVertex)*total, (void**)&pTemp, 0);
 memcpy(pTemp, arrTemp, sizeof(arrTemp));
 planeVB->Unlock();

 int numPolygon = (width -1) * (width -1) * 2;
 PIndex arrTemp2[392]; // 폴리곤 갯수만큼 인덱스 생성.
 int cntPolygon = 0;
 for(int i=0;i<width-1;i++)
 {
  if(cntPolygon >= numPolygon){ break; }

  for(int j=0;j<width-1;j++)
  {
   //하단 폴리곤
   arrTemp2[cntPolygon].a = i*width + j;
   arrTemp2[cntPolygon].b = i*width + (j+1);
   arrTemp2[cntPolygon].c = (i+1)*width + (j+1);
   cntPolygon++;

   //상단 폴리곤
   arrTemp2[cntPolygon].a = i*width + j;
   arrTemp2[cntPolygon].b = (i+1) * width + j;
   arrTemp2[cntPolygon].c = (i+1) * width + (j+1);
   cntPolygon++;
  }
 }

 m_pd3dDevice->CreateIndexBuffer(sizeof(PIndex)*numPolygon, 0, D3DFMT_INDEX32, D3DPOOL_MANAGED, &planeIB, 0);
 void *pIB;
 planeIB->Lock(0, sizeof(arrTemp2), (void **)&pIB, 0);
 memcpy(pIB, arrTemp2, sizeof(arrTemp2));
 planeIB->Unlock();
}

지금 이걸보면 타일의 중심이 3d 좌표계의 중심과 일치하지않는데.. 이건 좋은방법이 아닌것같다

타일의 중심과 3d 좌표계의 중심(원점)이 일치하게 하는게 좋을것같다

어차피 이 타일이라는것은 월드에서 반복적으로 그려져야 하므로.. 원점을 중심으로 하는 타일을 만들어서

이것을 재활용 하는 방식이 될것이다.. 즉 이 원점을 중심으로 하는 타일이 맵의 "템플릿"(틀) 이 될것이다.

이올린에 북마크하기(0) 이올린에 추천하기(0)
Trackback 0 Comment 0