말머리
안녕하세요.^^.
집에서 뒹굴 뒹굴 하다가 이래선 안되겠다 싶어서
맥스 익스포터(MAX Exporter)에 대해서 공부를 하고자
이렇게 강좌를 올리게 됩니다.(즉, 강좌 == 공부)
개인적인 공부를 위해서 강좌를 올리는 것은 좀 뭐하지만
제가 알고 있는 것을 같이 공유를 하고자 이렇게 글을 적습니다.
일단 익스포터를 꼭 만들 필요가 없다는 것을 알려 드립니다.
MS에서 지원해 주는 X 파일을 이용하는 것이 상당히 편하기 때문이죠.
X 파일을 사용하는 법도 DX(DirectX) 튜토리얼에 나와 있으니까요.
하지만 게임을 만들고자 하는 프로그래머라면 한번쯤(사실 쭈욱) 만들어 봐야겠죠.
그래서 저도 한번 만들어 보고자 투닥거리를 하고 있답니다...
이번 강좌를 통해서 제가 개인적으로 만들고자 했던 "3D 지뢰 찾기"를 만들어 볼 것입니다.
"3D 지뢰 찾기" 에는 몇개의 3D 모델이 필요합니다.
우선 지뢰를 감추고 있을 수 있는 육면체 상자.
그리고 우리의 주인공 지뢰.
그리고 주변에 몇개의 지뢰가 있는지를 가르쳐 주는 숫자가 필요하겠죠.
즉, 총 11개의 모델이 필요하군요.
(숫자는 1~9 까지만 있으면 됩니다)
생각을 해보면 상당히 단순한 모델입니다.
애니메이션도 없고, 멋 훗날에는 입힐지 모르지만 지금은 텍스쳐도 없고...
이정도 수준이면 익스포터를 만들기에 벅차지 않겠죠? ^^
(쉬운 것만 골라하는 녀석이었습니다...T^T)
참고로 아직 머리속으로 구상만 해놨을 뿐 실제로 구현을 해놓은 것은 아무것도 없습니다.
앞으로 같이 해보자구요..ㅎㅎ
이번 익스포터 강좌 시리즈의 최종 목적은 바로 다음과 같습니다.
최종 목적
1. 모델의 정점 정보를 얻어 보자
2. 정점 정보를 얻었으니 인덱스 정보도 갖고 싶다.
3. 조금더 폼나게, 텍스쳐 정보도 갖자.
오늘의 강좌 순서
1. 맥스를 설치한다.(버전 5 이상)
2. 비주얼 스튜디오에 맥스 위자드를 추가한다.
3. 맥스 위자드를 이용한 프로젝트를 생성한다.
4. 생성한 프로젝트에서 필요한 부분을 간략히 알아보고 정리한다.
5. 간단한 테스트(정말 간단한)를 한번 해본다.
위의 순서중에서 1번과 2번은 생략 하겠습니다.
제 지난 강좌 중에 2번에 해당하는 부분이 있군요.
1번은 ... 설마 설치를 못하실려구요...;;
설치시 주의 하실 점은 MAX SDK 를 꼭 설치하시기 바랍니다.
물론 처음에 설치를 안하셨다고 해도 나중에 설치할 수 있으니 부담갖지 마시구요.
자, 그럼 과정 3부터 볼까요~
과정 3 : 맥스 위자드를 이용한 프로젝트를 생성한다
과정 1과 과정 2를 클리어(..) 하셨나요?
그럼 이제 비주얼 스튜디오를 실행시킵니다.
(참고로 저는 닷넷이 아니라 6.0 입니다)
그리고 새로운 프로젝트를 생성합니다.
오호 새로운 프로젝트 위자드가 있습니다.
"3ds max Plugin Wizard R5.0" 이군요.
이 위자드를 선택한 후, 프로젝트 이름을 넣어 주고 다음(OK)으로 갑니다.
"3ds max Plugin Wizard R5.0 - Step 1 of 3" 화면이 나옵니다.
여기서 "File Export"를 선택하고 다음으로 갑니다.
"3ds max Plugin Wizard R5.0 - Step 2 of 3" 에서는 건드릴 것이 없습니다.
클래스 이름을 다르게 하고 싶으시다면 다르게 바꾸셔도 됩니다.
다음으로 갑니다.
"3ds max Plugin Wizard R5.0 - Step 3 of 3" 화면에서 경로 설정을 해줍니다.
영어를 보면 무엇을 뜻하는지 다들 아시겠죠?
첫번째는 MAX SDK 경로를 두번째는 플러그인 폴더 경로를 지정합니다.
그다음 밑에 보면 "Add source code comments"에 체크하는 부분이 있는데
이건 개인 취향에 맡기겠습니다.(심심하니 한번 체크를 해보겠습니다)
이제 맥스 익스포터를 위한 프로젝트의 생성이 완료 되었습니다.
과정 4 : 생성한 프로젝트에서 필요한 부분을 간략히 알아보고 정리한다.
왼쪽에 음..이거 창 이름이 뭐였더라..음 ... 아무튼 간에
왼족에 소스 파일들을 봅니다.
전 프로젝트 이름을 "onestep"으로 했습니다.
그래서 그런지 "onestep.cpp/h/rc" 파일이 있습니다.
다른 파일도 있지만 다른 녀석은 건드리지 맙시다.
그럼 cpp 파일을 먼저 봅시다.
이 파일에는 클래스가 정의되어 있습니다.
솔직히 이해가 안가는 부분이 cpp 파일하고 h 파일을 만들었으면
클래스 정의 부분(모체..?)을 h 파일에 넣고
클래스 소스 부분(자식..?)을 cpp 파일에 따로 따로 넣었으면 보기 편할텐데
왜 이리 했는지 이해가 안갑니다.쩝...
그래서 저는 클래스 정의 부분을 h 파일에다가 옮겨 넣었습니다.
클래스가 두개가 있는데 두개 모두를 옮겼습니다.
그리고 밑에 보면 메시지 콜백 함수가 있습니다.
그냥 무시합니다. 우리가 아는 그 메시지 콜백 함수와 같은 역할을 합니다.
그리고 밑에 보면 이제 본격적인 클래스의 소스 부분이 있습니다.
친절하게 주석으로 이렇게 경계선을 그어 났군요.
//--- onestep -------------------------------------------------------
...귀여운 것들..훗훗훗
자...소스를 봅시다.
오호 여기서 잠시...
클래스 정의 부분을 h 파일에다가 옮겨 놓고 혹시나 저장을 하신 분 계시나요?
저장을 하면 "This file has been modified ...." 라는 메시지 박스가 나옵니다.
이때 아무거나 해도 상관은 없습니다.
하지만 매번 저장할 때 이녀석이 나오면 귀찮죠.
안나오게 합시다.
[Project] -> [Settings] 로 갑니다.
거기서 [Debug] 텝으로 이동을 합니다.
그곳에 보면 "Excutable for debug session" 이라는 항목이 있습니다.
이 항목에다가 맥스 실행 파일을 선택해 줍니다.
옆에 삼각형을 클릭 후 Browse 를 선택 후
경로를 찾아가서 실행 파일을 선택하면 됩니다.
그리고 이제 저장을 해봅니다.
아까의 메시지 박스가 나타나지 않습니다.
그럼 이제 클래스의 소스 부분을 보면서 맴버 함수들의 역할을 알아 보도록 합시다.
1. 기본적으로 생성자와 소멸자가 있습니다.
2. ExtCount()
이거... 뭐하는 건지 모르겠습니다.
//TODO : 라고 되어있는 영어를 직접 해석해 보셔서 알아 보심이 어떠실지...;;
어쨌든 우리는 이 프로젝트를 가지고 하나의 익스포터가 필요합니다. 리턴값 1.
3. Ext()
익스포터의 확장자명을 리턴해 줍니다.
전 "ske"라는 제 아이디 약자를 넣었습니다.
('S'hine 'K'DL 'E'xporter..후훗)
4. LongDesc()
익스포터의 기능을 간략히 적어줍니다.
사실 기능을 적는 곳이라기 보다는 전체 이름을 적는 곳 같습니다.
5. ShortDesc()
익스포터의 짧은 이름을 적어 줍니다.
즉, 여기서 적어준 이름과 위에서 정의한 확장자 이름을 가지고
우리가 맥스에스 플러그인을 선택할 때 "ShortDesc(*.Exp)"가 나타납니다.
예로 들면 저는 이곳에다가 "ShakE Exporter"를 넣어 줬습니다.
그러면 맥스에서 ShakE Exporter(*.SKE) 로 나온다는 것이죠.
음..직접 해보시면 가장 확실히 이해가 갑니다.
6. AuthorName()
익스포터를 만든이의 이름입니다.
이름을 적으셔도 좋고, 닉네임을 적으셔도 좋습니다.
전 "ShineKDL"을...
7. CopyrightMessage()
Copyright...뭔지 아시죠?
전 이게 뭘까 싶어서 네이버를....결과는 "저작권"
8. OtherMessage1()
글쎄요..뭘까요?
메시지를 보여주는 곳일까요?
9. OtherMessage2()
얘는 또 뭘까요?
다른 메시지를 보여주는 곳일까요?
10. Version()
버전을 적는 곳입니다.
만약 버전이 1.23 이라면
123 을 넣어 주시면 됩니다.
11. ShowAbout()
그거죠. 그거.
도움말 정보!!
12. SupportsOptions()
뭔지 모르겠습니다. 코멘트를 해석해 봅시다...
13. DoExport()
이 부분이 달걀의 노란 부분입니다.
이 부분이 지구의 핵 같은 부분입니다.
이 부분이 인간의 심장 같은 부분입니다.
이 부분이 퍽!!
이곳에서 원하는 작업을 합니다.
우선 if (...) {...} 로 되어 있는 부분이 있습니다.
필요 없습니다.
저 같은 경우는 만약이라는 것을 위해 주석을 해두었습니다.
그리고 밑에 리턴을 TRUE 로 바꾸어 줍니다.
FALSE 로 하면 익스포트를 종료할 때 "익스포트 모듈 실패" 라는 메시지가 나옵니다.
즉, 제대로 종료가 안되었다는 것을 뜻하죠.
하지만 앞으론 그런 일이 없길 바라는 마음에 TRUE 로 마꿉니다.
자 간략히 익스포터 클래스에서의 맴버함수가 무엇을 하는지 알아봤습니다.
여기에다가 추가할 부분이 있으면 추가하면서 작업을 진행해 가야겠죠.
과정 5 : 간단한 테스트(정말 간단한)를 한번 해본다.
정말 간략히 테스트를 해보겠습니다.
즉, "니가 한말이 사실 이더냐?" 이거겠죠..;;
그럼 간단히 익스포터를 실행 했을 때
그 익스포터 파일에 내용에
[파일이름 + 파일 출력...]
이 있도록 간단히 작업을 해보도록 하겠습니다.
(즉, 모델에 대한 정보를 얻어 오는 것은 다음 시간부터...)
DoExport() 부분을 봅니다.
그곳에 보면 인자로 받는 것이 꽤 됩니다.
이 중에서 위에서 말한 간단한 테스트를 위해서 필요한 것은 name 입니다.
이 name 는 파일의 이름과 확장자명과 경로에 대한 정보 입니다.
즉, 이녀석을 가지고 파일을 생성하면 되겠죠.
소스 코드를 다음과 같이 추가합니다.
//---------------------------------------------
FILE *fp = fopen( name, "wt" );
if ( fp == NULL ) return FALSE;
fprintf( fp, "%s 파일 출력...", name );
fclose( fp );
//---------------------------------------------
이렇게 하면 우리가 정한 익스포터 확장자를 가지고
텍스트 파일이 하나 생성됩니다.
당연히 확장자는 txt가 아니라 익스포터 확장자가 되겠죠.
파일을 열어 보실 땐 메모장을 이용하시면 됩니다.
자 그럼 컴파일 하고 실행 할까요.
맥스가 실행 됩니다.
[File] -> [Export...] 을 선택하면
파일 저장 화면이 나옵니다.
이때 파일 형식에서 우리가 지정한 익스포터 형식이 있나 봅니다.
저는 있군요.
"ShakE Exporter (*.SKE)"
라고 되어있습니다.
이것을 선택하고 파일을 저장할 폴더를 선택한 후
파일명을 적고 저장을 합니다.
이제 우리가 저장한 폴더로 가서 저장한 파일을 메모장으로 열어서 확인합니다.
마무리
어렵지 않으셨죠?
음...뭔기 허전하다는 느낌이 드실지도 모르겠지만
전 처음에 이정도 알아내느라 바보같은 삽질(삽질이 원래 바보같은 짓...)을 했습니다.
(헤유...IQ가 점점 떨어지다보니 ...;;)
그래서 다음 시간부터는 상자를 맥스에서 그린 후
상자의 정점의 갯수와 정보를 얻어오는 작업을 해봅시다.
정점 정보를 얻어 왔는데 뭔가 아쉽다 싶으면 인덱스 정보도 얻어 오구요.
하지만 제가 게을러서 정점 정보만 얻어 올 듯 하네요.ㅎㅎ.
그럼 수고하셨습니다.^^.
다음 강좌에서 또 만나요~
(유후~밥묵으러 가자~)