메뉴 건너뛰기

창조도시 기록보관소

언어 3D좌표계에 3D물체를 찍기위환 기초과정

2007.03.30 09:28

실베 조회 수:378 추천:3

안녕하세요 Zeprod님께서 혼자서 열강을 하시고있기에 저의 짧은 지식이나마 도움이 될까해서 한번 올려봅니다.


 


이것으로 Zeprod님의 강의 2개를 더 볼수있겠네요 ^^


 


Zeprod님께서 말씀하셨든 3D공간에 좌표를 찍기위해선 우선 옵션설정이 필요합니다.


 


우선 구조체 설정이 우선인데요.


 


3D공간상의 점의 좌표와 색상과 Texture의 이미지의 위치등을 설정해주는단계입니다.


 


struct CUSTOMVERTEX
{
 D3DXVECTOR3 p;
 DWORD color;
};


 


여기서 D3DXVECTOR3 P는 x,y,z의 좌표를 가지고있는 구조체입니다. 구조체 안에 구조체가 설정이 되어있지요. 저P가 하는일이 3D공간상의 좌표를 가지는 일입니다.


 


그리고 저 CUSTOMVERTEX와 짝지를 지어주는 역할을 하는게 바로 D3DFVF입니다.


 


#define D3DFVF_CUBEVERTEX (D3DFVF_XYZ | D3DFVF_DIFFUSE)


 


이런식으로 Define정의와 Bit연산을 통해서 지금 내가 할 작업이 어떠한 작업인지를 D3D에 알려주는 역할을 합니다.


 


그렇다면 저걸 어떻게 사용하느냐!


 


이야~ 아래가 좀 긴데 걱정하실것 없습니다. 자 그럼 설명드리죠.


 


설명 안하는 부분은 추후 설명을 추가할테니 설명안했다고 욕하지마세요. 전 마음이 여리답니다. *-_-*


 


자 CreateVertexBuffer 함수를 통해서 g_pVB에 내가 설정하고 하는 점의 갯수만큼 공간을 만들어 주는겁니다.


이때 CUSTOMVERTEX와 D3DFVF를 짝지를 지어 알려중야 하죠.


if( FAILED(g_pd3dDevice->CreateVertexBuffer(CubeVertexNum * sizeof(CUSTOMVERTEX),0, D3DFVF_CUBEVERTEX, D3DPOOL_DEFAULT, &g_pVB ) ))


{ return E_FAIL; }


 


빨강색 부분이 체크포인트입니다.


CubeVertexNumb * sizeof(CUSTOMEVERTEX)


CubeVertexNumb = 제가 정의한 큐브의 점의 갯수입니다. 큐브를 만들때 가장 기초적으로 생각하면 36개의 꼭지점이 필요합니다. 물론 간단하게 줄일수도있습니다. 하지나름이죠. 그거에 아까 정의한 구조체를 곱해주면 꼭지점 갯수만큼 공간을 만들어 줍니다. 단. D3DFVF_CUBEVERTEX를 통해서 CUSTOMVERTEX가 가지고 있는 속성값을 알려주는 단계입니다.


속성값은 F12를 누르면 많이 나옵니다.


xyz좌표계와 DIFFUSE를 가지고있으니 우선 공간상점의 좌표와 점의 확산색값을 가지겠다는 뜻입니다. 아직 Texture는 넣지 않았습니다.


void *pVertices;
 if(FAILED(g_pVB->Lock(0,0,(BYTE**)&pVertices,0 ) ) )
 { return false; }
 memcpy( pVertices, &g_CubeVertices[0], CubeVertexNum * sizeof(CUSTOMVERTEX ) );
 g_pVB->Unlock();


 


그리고 g_pVB에 설정한값을 넣기 위해서는 Lock함수를 이용해서 g_pVB를 묶어두어야 합니다.


그래픽카드 메모리가 무한하지 않기때문에 사용하지 않는 데이터는 임시적으로 하드의 임시저장장소로 계속 옴겨졌다가 불러왔다를 반복하기 때문에 g_pVB를 그냥 설정할수는 없습니다 Lock을 하므로서 g_pVB에 자료를 넣겠다고 알려주는것이지요.


그리고 memcpy함수를 이용해서 좌표값과 색상값에 관한 정보를 얼마만큼? Create한 점의 갯수만큼 넘겨줍니다.


그리고 꼭 Unlock함수를 통해서 작업이 끝났다는것을 컴퓨터에게 말해주어야 합니다.


 


자 그러면 점의 좌표를 설정해 볼까요.


 


float NomalSize = 0.5f;
 
 g_CubeVertices[0].x = -NomalSize;
 g_CubeVertices[0].y = +NomalSize;
 g_CubeVertices[0].z = +NomalSize;
 g_CubeVertices[1].x = +NomalSize;
 g_CubeVertices[1].y = +NomalSize;
 g_CubeVertices[1].z = -NomalSize;
 g_CubeVertices[2].x = -NomalSize;
 g_CubeVertices[2].y = +NomalSize;
 g_CubeVertices[2].z = -NomalSize;


 g_CubeVertices[3] = g_CubeVertices[0];
 g_CubeVertices[4].x = +NomalSize;
 g_CubeVertices[4].y = +NomalSize;
 g_CubeVertices[4].z = +NomalSize;
 g_CubeVertices[5] = g_CubeVertices[1];


 g_CubeVertices[6].x = +NomalSize;
 g_CubeVertices[6].y = -NomalSize;
 g_CubeVertices[6].z = +NomalSize;
 g_CubeVertices[7].x = -NomalSize;
 g_CubeVertices[7].y = -NomalSize;
 g_CubeVertices[7].z = -NomalSize;
 g_CubeVertices[8].x = +NomalSize;
 g_CubeVertices[8].y = -NomalSize;
 g_CubeVertices[8].z = -NomalSize;


 g_CubeVertices[9] = g_CubeVertices[6];
 g_CubeVertices[10].x = -NomalSize;
 g_CubeVertices[10].y = -NomalSize;
 g_CubeVertices[10].z = +NomalSize;
 g_CubeVertices[11] = g_CubeVertices[7];


 g_CubeVertices[12] = g_CubeVertices[2];
 g_CubeVertices[13] = g_CubeVertices[8];
 g_CubeVertices[14] = g_CubeVertices[7];
 g_CubeVertices[15] = g_CubeVertices[2];
 g_CubeVertices[16] = g_CubeVertices[1];
 g_CubeVertices[17] = g_CubeVertices[8];


 g_CubeVertices[18] = g_CubeVertices[4];
 g_CubeVertices[19] = g_CubeVertices[10];
 g_CubeVertices[20] = g_CubeVertices[6];
 g_CubeVertices[21] = g_CubeVertices[4];
 g_CubeVertices[22] = g_CubeVertices[0];
 g_CubeVertices[23] = g_CubeVertices[10];


 g_CubeVertices[24] = g_CubeVertices[1];
 g_CubeVertices[25] = g_CubeVertices[6];
 g_CubeVertices[26] = g_CubeVertices[8];
 g_CubeVertices[27] = g_CubeVertices[1];
 g_CubeVertices[28] = g_CubeVertices[4];
 g_CubeVertices[29] = g_CubeVertices[6];


 g_CubeVertices[30] = g_CubeVertices[0];
 g_CubeVertices[31] = g_CubeVertices[7];
 g_CubeVertices[32] = g_CubeVertices[10];
 g_CubeVertices[33] = g_CubeVertices[0];
 g_CubeVertices[34] = g_CubeVertices[2];
 g_CubeVertices[35] = g_CubeVertices[7];


 


 


끼야아아아악 길다~ 물론 이것은 Lock하기전에 모두 끝내놓야아 합니다.


여기서 문제입니다. (지맘대로지요? 그냥 풀어주세요 -_-;;) 제가 설정한 36개의 좌표는 오류가 있습니다. 수치상 오류가 아니라 문법상 오류입니다. 찾아주세요~ 자기가 3D공부를 어느정도 했다 하시는분들은 하지마세요. 눈에 확띄자나요 -_-+


 


제가 사용했던 아주 예전 코드들이 지멋대로 엉켜서 저렇게 놔둔것이니 그냥 넘어가주세요.


 


우선 3D에 큐브를 찍기위해선 눈에 보이는면은 시계방향으로 설정을 해주셔야합니다. 반대방향은 눈에 보이지 않고 화면을 돌리면시계방향으로 돌려서 카메가 위치가 반대로 돌아갔을때 보여야 하므로 반시계 방향으로 설정해주시면 됩니다.


    /---------------/|


  /          2           /  |


/----------------/  |


|                       | 3/


|          1           |  /


|                       | /


|---------------|/


 


큐브가 대충 이렇게 생겼다고 칩시다. 1번 2번 3번 부분은 눈에 보이는 부분으로 설정을 합니다.


그러므로 1번의 꼭지점 4개 그러나 삼각형을 하나씩 그리기 위해선 3개의 좌표가 필요하니깐 하나의 4각형은 6개의 점의 좌표가 필요하지요. 고로 1번의 6개 좌표는 시계방향대로 설정을 해야합니다. 전 설정을


 


0,3        4


 


2          1,5


이런식으로 설정을 했습니다. 시계방향대로 돌아가지요? 이렇게 설정을 해주어야만 바로 육면체의 앞부분이 비쥬얼하게 출력됩니다.


 


물론 반시계 방향으로 한것도 눈에 보이게는 할수있습니다. 그러나 3D의 이미지의 뒷부분이 보인다면? 참 거시기 하겠지요? 그래서 시계방향으로 설정을 해주는겁니다.


 


그리고 36개의 좌표가 모든 설정이 끝나게 되면


Render부분에서 찍어주게 되는데요.


 


 g_pd3dDevice->SetTexture(0, NULL);           //텍스쳐가 없으므로 NULL로 합니다.
 g_pd3dDevice->SetStreamSource(0, m_CubeVB, sizeof(CUSTOMVERTEX)); //VB를 꼽아줍니다.
 g_pd3dDevice->SetVertexShader(D3DFVF_MAKECUBEVERTEX);       //FVF설정으로 어떠한 정보가 있는지를 넘겨줍니다.
 g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 12);           //삼각형의 갯수를 설정합니다.


 


이렇게 되면 비쥬얼하게 보이는 육면체가 나타납니다.


 


이런글이 처음인지라 두서없이 써서 제가 봐도 어렵네요. 고수분들의 깔끔한 정리가 필요합니다. 아흑!


 


어쨌든 도움이 되셨습니다 합니다. 읽다가 이해 안가는 부분은 질문 남겨주세요. 빠르게 답변하도록 노력하겠습니다.

번호 제목 글쓴이 날짜 조회 수
389 [DX&C++]3D공간상 카메라 시점의 대한 정의 [3] 실베 2007.04.01 389
388 [DX&C++] IndexBuffer를 알아보자! [2] Zeprod 2007.03.31 334
387 [DX&C++] 3대 행렬 연산의 비대칭성(unsymmetry) [1] Zeprod 2007.03.31 303
» 3D좌표계에 3D물체를 찍기위환 기초과정 [3] 실베 2007.03.30 378
385 숫자 게이지 색에 관한 팁 [4] 『덩키동크』 2007.03.30 512
384 [공개자료] 먼치킨 액알 만들기 [11] 책벌레공상가 2007.03.26 1598
383 BGM, ME 소리가 안들렸다?[대책을 알아낸.............!!!] smofdz 2007.03.25 630
382 이름 미정의 게임툴 : 레이아웃만 대강 작업중인 그림 [2] file doslaosi 2007.03.22 679
381 [DX&C++] 3대 행렬 연산의 사용 [3] Zeprod 2007.03.16 842
380 [DX&C++] 3D를 다루는 프로그램의 개요 [3] Zeprod 2007.03.13 403
379 template에 관한 간단한 예. [2] 김두한 2007.03.12 237
378 [DX&C++] 3D 공간에 대한 이해 [4] Zeprod 2007.03.01 432
377 2D격투게임만들기95 [1] 황금잉어빵 2007.02.26 994
376 * 기타 - '대기'의 종류 천영진 2007.02.21 507
375 11. 맵배치 (숲길, 건물, 건물 안속 만들기) [4] 천영진 2007.02.21 1044
374 1. 변수 응용 프로그램 만들기 [4] 천영진 2007.02.21 589
373 1 - 1. 변수 응용 프로그램 만들기 (난수) [3] 천영진 2007.02.21 491
372 [DX&C++] DirectX란 무엇인가? [9] Zeprod 2007.02.17 455
371 c언어로 할수있는것 vs 비주얼베이직 [6] 연지 2007.02.17 689
370 몬스터 성향 [1] 괴인X 2007.02.15 518