본문 바로가기

DirectX/3D

Max Export

*Exporter 제작시 자료의 선택
-Keyfram Animation
-Bone + skin
-BOne + physique
-Bipad + Physique
각각의 방법으로 로딩이 가능하도록 분류하여 출력
ASE 데이터의 종류와 로딩하는 클라스의 종류를 4가지로 프로그래밍

 

*Exporter개발방법
-화일의 종류에 따라서
XML Expoter --일반적 데이터 교환포멧
ASE
X파일 - 템플릿 개념으로 입출력
md2,3 - md2는 속도는 빠르고 pysique는 지원안함.
m2

-프로그래밍 방식에 따라서
Plugin 방식 -- 디버깅의 어려움
script방식 --- 간단한 방식

 

*Max에서 오브젝트 관리법
-Scene Graph
Node의 핵심은 INode Interface Class
최고 상단 Node에서 부터 시작해서 3D변형과 출력에 필요한 모든 정보를 계층구조 형태로 관리
하나의 Node는 자식 노드를 여러개 가질수 있다.
관리는 기본적으로 INode 의 계층구조를 통해서 수행

-Data Exchange Interface
3DXI - 3D Max로부터 데이터 Extract나 export

 

*오브젝트 컬링 방법
지형처럼 똑같은 배열을 만들어서 오브젝트가 있는 위치를 인덱스화 시켜서 이중링크드 리스트로
자료구조의 Hash처럼 해주면 된다.(Hesh : 메모리에서 데이타값이 번지 - 즉시 찾을수 있다.제한을 걸어서
링크드 리스트를 사용)오브젝트가 있는 지형이 출력이 안된다면은 링크되어있는 데이타를 컬링한다.

 

*Skin, Phisique : Modify 이다.

 

*INode Class - Root Node
맥스는 트리구조로 정보를 제시 모든정보는 Root Node에서 파생된다. 이것을 찾으면 모든 작업이 가능
iNode에 모든 정보가 들어있다. INode를 통해서 모든 정보를 참조한다

 

*Scene정보 출력
-ExportGlobalInfo()함수에서 신정보 출력

 

*Max에서 사용하는 함수
Node->NumverOfChildren() : 하위 Node가 몇개인지 리턴
Node->GetChildNode(c)  : gkdnl shemdml vhdlsxjfmf flxjsgksek.

 

*Virtual 함수가 하나라도 있는 클래스는 변수(Instance)를 만들어서는 안된다.
상속받은 클래스는 반듯이 오버라이딩 해야한다.

 

*Vertex에 BoneIndex와 BOne Weight주기
1.스키닝 처리되는 모든 버텍스들은 각 버텍스마다 영향을 주는 본의 Transform Matrix들의 리스트와 영향을 주는 비율인 가중치를 가지고 있다.
2.가중치의 합은 1.0이 되어야 한다.
3. 모든 버텍스들은 영향을 주는 Trnasform Matrix와 가중치 리스트를 가지고 있다
4. 모든 본의 리스트를 만들어 놓고 버텍스에 영향을 주는 본의 번호로 기억
5. 스키닝의 계산방법

 

*스킨 출력
-Skin이 존재하는지 확인
Modifier에 SKIN_CLASSID가 있는지 확인한다.


Modifier* modifier = derivedoject->GetModifier(i);
if(Modifier->ClassID() == SKIN_CLASSID)
{
 return modifier;
}

 

*스킨의 본 리스트의 출력
-스킨은 본 정보에 대한 리스트를 따로 보유
Bone 정보 출력후 - 매트릭스 팔레트에 저장될 정보
버텍스의 본과 Weight값 출력 - 버텍스에 영향을 미치는 가중치와 인덱스 정보
skin->GetBone(i)->GetName();

-Phisique는 Bone정보를 따로 가지고 있지 않고 버텍스 정보를 가지고 있다.

 

*Skin의 본 인덱스와 웨이트 구하기
스킨에서 전체 버텍스 개수를 얻어 그 버택스 개수에 본의 인덱스와 Weight를 출력

 

*Physique 출력하기
1.피부와 본을 제작한 다음 -- Modifier(physique)를 적용
2.피부에 본을 적용하는 Modifier는 피직이를 오브젝트가 가지고 있는 Modifier에서 찾아보면
Modifier* ModifierPtr = DerivedObjectPtr->GetModifier(ModStackIndex);
모디파이어의 인덱스가 PHYSIQUE_CLASS_ID_A,PHYSIQUE_CLASS_ID_B이면 피직이 적용된 오브젝트이다.
Physique인터페이스를 얻는다.
Physique = (IPhysiqueExport*)modifierPhysique->GetInterface(I_PHYXPORT);
스킨과 비슷하다.

 

* AsciiExp 는 SceneExport를 상속 받는다.
* DoExport() 가 메인이다.

 


--------------------------------------------------------------------------------------------------------------------------

두서없이 필기한 내용들이다. PT자료좀 줬으면 좋겠는데.. 죽어도 안준다.. 쳇..

자세히 알려면은 좀 여러번 봤으면 좋겠것만..