max importer만들기 exporter 만큼이나 쉬운 importer

반응형


시작은 exporter 만들때와 같다.
3dsMax위자드를 통해서 생성할때 "File Importer"로 타입을 지정해서 만들면 된다.
첫 시작은 exporter가 DoExport였듯이 importer에서는 DoImport이다.

1. Import를 한다는건 이미 자체포맷으로 또는 기본 포맷으로 만들어진 데이터가 있다는 말.
   우선 파일을 로드해서 해당 파일에 있는 데이터를 읽어 둔다.

   GetDataFromFile(파일이름)
   요 내부에선 열심히 파일을 읽어서 데이터 구조를 만들고 할것이다.

2. 그리고 현재 화면을 깨끗이 정리할 필요가 있다.
    흡사 dx의 Clear()와 같은 함수가 필요하다.
    이것이 바로 max에서 제공하는 ImpInterface::NewScene() 함수이다.
    이 함수는 scene상의 모든 지오메트리를 제거한다.

3. 재질 초기화.
    Tab<Mtl*>::ZeroCount(), Tab<Mtl*>::Shrink;
    재질의 갯수를 초기화, 공간을 다시 할당해서 버려지는 공간이 없도록 한다.

4. 맵의 로드(재질, diffuse)
   Mtl* mtl;
   StdMat* stdMat;
   Texmap* tex;
   Bitmap* bmTex;

   mtl = stdMat = NewDefaultStdMat();                           기본 재질 생성.
   bmtex->(BitmapTex*)NewDefaultBitmapTex();           기본 비트맵
   bmtex->SetMapName(텍스쳐 이름);
   tex->SetName(맵 번호);
   
  stdMtl->SetSubTexmap(ID_DI, tex);                           디퓨즈 텍스쳐 저장
  stdMtl->SetTexmapAmt(ID_DI, amount, 0);                 used to change the 'Amount' setting of the specified map.

  mtl->SetName( acMtlName );                                   재질 추가
  mtlTab.Insert( m_iMtlCount, 1, &mtl );

이 소스는 디퓨즈 텍스쳐만 고려해서 만든 임시코드이다. 
자신의 프로젝트에 맞게 개량해야 한다.

5. max는 object를 만들어 보자.!!
미리 읽은 데이터로부터 오브젝트를 구성한 데이터를 가져온다.
이는 정점갯수, 인덱스, 텍스쳐 uv정보, 삼각형 정보 등이 될수 있다.
max에서는 모든것이 node를 통해 얻을 수 있다.
새로운 오브젝트를 만들기 위해 INode를 새로 만들 필요가 있다.
ImInterface::CreateNode() 함수를 사용하면 노드를 하나 생성할 수 있다.
메시를 만들기 위해서는 TriObject 구조로 만들어야 한다.
TriObject* tri = CreateNewTriObject().

이제 어느정도 준비물이 갖추어 졌다.
CreateNode를 통해 만든 노드는 TriObject의 레퍼런스로 연결한다.
node->Reference(tri);
이 노드를 통해 tri정보를 실제 화면에 올린다. 화면에 올릴때는 node 형식으로 올린다.
ImInterface::AddNodeToScene(node);

여기까지는 어느정도 셋팅에 가깝다.
scene에 mesh를 올리기 위해 triobject를 만들어서 node로 연결하고 이 node를 scene에 올렸다.

이젠 데이터만 지정해 주면 된다.
node->SetName(메시 이름);
tri->mesh.setNumVerts( 정점갯수 );
tri->mesh.setNumTVerts( 정점갯수 );
tri->mesh.setNumFaces( 삼각형 갯수);
tri->mesh.setNumTVFaces( 삼각형 갯수);

드디어 정점 정보를 입력해주는 순간이 왔다.
정점의 갯수만큼 정점정보들을 추가해 준다
tri->mesh.setVert( iVert, point 자료형 위치값);
tri->mesh.setNormal( iVert, point 자료형 노말값);
tri->mesh.setTVert( iVert, point 자료형 uv 값);

이제 삼각형을 구성하기 위한 삼각형 인덱스 정보를 지정해 줘야 하낟.
이것도 삼각형 갯수만큼 넣어주면 된다.
tri->mesh.faces[iTri].setVerts(인덱스0, 인덱스2, 인덱스1);
tri->mesh.faces[iTri].setSmGroup( 1 );
tri->mesh.faces[iTri].setEdgeVisFlags(1,1,1);          // Sets the visibility of the all the edges.
tri->mesh.tvFace[iTri].t[0] = 인덱스 0;
tri->mesh.tvFace[iTri].t[1] = 인덱스 2;
tri->mesh.tvFace[iTri].t[2] = 인덱스 1;
주의할 것은 SetVerts에서 지정해 주는 값이 dx 기준으로 0,2,1의 순으로 넣어줘야 한다는 것이다.
이부분은 dx와 max의 좌표계 차이 때문이다.

INode::Transform(index, MATRIX). 변환도 셋팅해준다.

realINode->SetMtl( mtl );

// Call this method after you alter vertex or face 
// lists or revise edge visibility flags. 
// It will invalidate the edge and strip database maintained by the mesh.
tri->mesh.InvalidateTopologyCache();

// Computes the bounding box of the splines making up this bezier shape object. 
// The result is stored in the bdgBox data member.
tri->mesh.InvalidateGeomCache();

tri->mesh.buildNormals();
tri->mesh.InvalidateEdgeList();
ip->RedrawViews( 0 );

사실 엣지 처리부분에서는 완벽하게 이해가 안되는 부분이 다소 있다.
자료도 좀 애매하고 그냥 default 예제에 있어서 끌어다 쓴 function도 몇개 있다.



importer 같은 경우는 사실 잘 만들지 않는다.
그닥 필요한 경우가 없어서 그런지도....
export만 만들고 데이터 관리만 잘 해 준다면 전혀 필요가 없다는.......

그리고 애니메이션 데이터 까지 전부 임포팅 하기에는 너무 빡센 작업이다.
export 작업 자체가 맥스 데이터의 일부분을 가공해서 저장하는 것인데
가공된 제품으로 원 재료를 되살리는건 거의 불가능 하다.

그래도 가장 삽질 많이 한 부분은 바로.................max 설치..............ㅡㅡ;..젠장.
컴터 시간을 앞으로 돌리는 꽁수와 dds 텍스쳐를 로드하기 위한 꽁수들.... 헐헐이다..

'Study > Character' 카테고리의 다른 글

Max Export - 1  (0) 2012.01.01
유용한 링크들  (0) 2012.01.01
max import 참고 자료  (0) 2011.05.19
max export 7. 어떻게 애니메이션 시킬까?  (0) 2011.05.03
max export 6. 드디어 Animation !!!!  (0) 2011.04.23
TAGS.

Comments