조회 수 1355 추천 수 3 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

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

단축키

Prev이전 문서

Next다음 문서

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

안녕하세요 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);           //삼각형의 갯수를 설정합니다.


 


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


 


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


 


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

?

List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
844 언어/기타 렉없는 자동세이브 스크립트!!! 귀찮아‡ 2007.04.22 1474
843 언어/기타 [DX&C++] 3D를 넘어 2D로! Zeprod 2007.04.18 1675
842 언어/기타 코드진행 기초테크닉 1 나그네M 2007.04.14 709
841 언어/기타 그림 메뉴 2 [제 2의 타이틀 메뉴 (기본 메뉴편)] [거히 치트비법..] file 우드록맨 2007.04.12 771
840 RPG Maker 마우스 이동 스크립트 2 아크로s 2007.04.11 1965
839 언어/기타 '에피소드'형식이 아닌 '화' 형식의 시나리오는 어떨까요? 우드록맨 2007.04.09 1529
838 RPG Maker [초 노가다 시스템]그림 메뉴 1 file 우드록맨 2007.04.08 880
837 언어/기타 [DX&C++]3D공간상 카메라 시점의 대한 정의 실베 2007.04.02 1351
836 언어/기타 [DX&C++] IndexBuffer를 알아보자! Zeprod 2007.03.31 1240
» 언어/기타 3D좌표계에 3D물체를 찍기위환 기초과정 실베 2007.03.31 1355
834 언어/기타 [공개자료] 먼치킨 액알 만들기 책벌레공상가 2007.03.30 2499
833 언어/기타 [DX&C++] 3대 행렬 연산의 사용 Zeprod 2007.03.30 1404
832 언어/기타 숫자 게이지 색에 관한 팁 『덩키동크』 2007.03.30 1427
831 언어/기타 [DX&C++] 3D를 다루는 프로그램의 개요 Zeprod 2007.03.25 1247
830 언어/기타 template에 관한 간단한 예. 김두한 2007.03.12 1180
829 언어/기타 [고난도 시스템] 당구를 만들어 보자 5 SSS 2007.03.12 1197
828 언어/기타 2D격투게임만들기95 황금잉어빵 2007.03.08 2410
827 RPG Maker 1 - 1. 변수 응용 프로그램 만들기 (난수) 천영진 2007.03.06 1279
826 언어/기타 몬스터 성향 괴인X 2007.03.04 1256
825 언어/기타 [DX&C++] 3D 공간에 대한 이해 Zeprod 2007.03.04 1247
Board Pagination Prev 1 ... 4 5 6 7 8 9 10 11 12 13 ... 51 Next
/ 51






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

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