조회 수 1397 추천 수 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
번호 분류 제목 글쓴이 날짜 조회 수
1004 언어/기타 목에 좋은것들.... 1 켄타 2005.05.17 2070
1003 RPG Maker 좌표대입(ARPG) 사고실험.[이론편] 늑대소년 2005.05.18 1509
1002 언어/기타 스킬데미지를 10000이상 뜨게해보자.(턴알,액알 둘다) Dship 2005.05.18 1888
1001 언어/기타 Fruity Loops에서 FX탭 사용방법 (1) Mr^Lee 2005.05.18 1709
1000 RPG Maker RPG XP 배워보기 <변수를 마스터하자 상편> 1 덩키동크 2005.05.18 2206
999 언어/기타 100%고수강의!(변수이론) 늑대소년 2005.05.18 2470
998 언어/기타 나름대로 - 변수강좌 켈리시 2005.05.18 1624
997 언어/기타 변수(變數)의 기초 바람을 가르는 자 2005.05.19 1270
996 언어/기타 이번에는 오프닝을! 장아찌 2005.05.20 2635
995 RPG Maker 액션RPG 속성무기를 만들어보자!! 천룡수 2005.05.20 1538
994 RPG Maker 아르바이트를 만들자 . - 1 Norid 2005.05.20 1739
993 언어/기타 플레이어가 자기의 이름을 정한다 . [영어] file Norid 2005.05.21 1780
992 언어/기타 레벨업을 하라 . 그리하면 살것이니.. 1 file Norid 2005.05.22 1574
991 [RPG2000] 가이드북 -7- 창조도시 2005.05.22 11106
990 언어/기타 나라의 PHP 초보탈출 - 1편 나라 2005.05.22 1732
989 RPG Maker 경영 RPG만들기[콤플리트판] 늑대소년 2005.05.24 2039
988 [RPG2000] 가이드북 -1- (표지내용무) 창조도시 2005.05.25 14508
987 언어/기타 [c++] 생성자,파괴자 챔피온 2005.05.26 1668
986 언어/기타 《완벽하게 현실적인 게임을 만들려면 해야되는 조작 몇 가지》-[上편] 자이크로 2005.05.27 1852
985 언어/기타 [R2000] 초간단 단거리액알 2 비밀소년 2005.05.27 2521
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 ... 51 Next
/ 51


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

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