FBX SDK 이용 방법 #2 (How to Work with FBX SDK 번역) Game develop

이전글 <- 클릭



자 이제 너님은 나님에게 "UV랑 노말이랑 탄젠트랑 바이노말은 어케 얻어옴?" 하고 물어볼거임. ㅇㅇ 그럼 잠시 메시에 대해 생각해보기로 하셈. 너님은 메시의 형태에 대해 정보를 얻었음. 하지만 이건(역자주:컨트롤포인트를 의미함) 메시의 지오메트리 정보일 뿐임. 표면에 대한 정보는 암것두 없음. 즉, 모양만 있는거지 어케 표현되는 표면인지는 모른다는거임.


FBX는 메시를 덮는 Layer라는 개념을 사용하고있음. 상자인 메시가 있다고 치면 Layer는 이 상자를 포장하는 포장지 같은거로 생각하면 될거임. 이 Layer에서 UV, 노말, 탄젠트, 바이노말을 추출 할 수 있음.


암튼간에, 어케 layer정보를 control point와 연결할 수 있을까 궁금할거임. 이게 좀 거지같은데 이에 관해서 코드를 보여주면서 설명을 좀 하게뜸.  


함수를 보기 전에 파라미터에 대해 설명을 먼저 좀 하겠음.

FbxMesh* inMesh : 우리가 익스포트하려는 바로 그 메시

int inCtrlPointIndex : Control point의 인덱스. 레이어 정보와 버텍스(Control Point)를 연결해주기 위해 필요함

int inVertexCounter : 현재 처리하고 있는 버텍스의 인텍스

XMFLOAT3& outNormal : 아웃풋. 함수 안에서 수정해서 아웃풋으로 사용하기 위해 콜바이 레퍼런스로 넘겨줌.  


파라미터들을 보면 의아한게 좀 있을거임. Control Point랑 버텍스는 같은거 아님? 왜 inCtrlPointIndex랑 inVertexCounter가 따로 존재하는거임? 두개가 같은거 아님?


즐. 두 개 같은거 아님. 앞서 설명했듯이, Control Point는 메시 지오메트리의 물리적인 버텍스임. 사각형으로 예를 들어보겠음. 사각형(두 개의 삼각형)에서는 Control Point가 몇개겠음? 정답은 4개임.


하지만 삼각형 기반의 게임 엔진에서는 버텍스가 몇개가 필요함. 바로 6개임. 삼각형 당 3개의 버텍스가 필요하고 2개의 삼각형이니 2*3=6


이게 FBXSDK의 Control Point와 우리가 생각하는 버텍스의 주요 차이점임. 즉, 버텍스는 삼각형 단위의 개념이지만 FBXSDK의 Control Point는 그렇지 않다는 것임. (역자주: 우리가 쓰던대로 버텍버퍼정보 인덱스버퍼 정보 깔끔하게 나뉘어져 있으면 좋으련만 또 그렇지도 않아서 열라 거지같음)

이제 코드 설명으로 돌아가겠음. 그러니 FBXSDK의 Control Point와 버텍스에 대한 이해가 깨랑까랑해도 일단 걱정마셈.


한가지 명심해야할 점은 이 함수 밖에서 루프를 돌면서 메시의 삼각형들의 모든 버텍스를 순회한다는 것이다. “루프를 돌면서 메시의 삼각형들의 모든 버텍스를 순회한다”는 의미가 헤깔린다면 꺼져가 아니라 위의 Mesh Data(position, UV, normal, tangent, binormal)섹션을 다시 보셈. 암튼 그래서 inCtrlPointIndex와 inVertexCounter가 그래서 필요한거임.


void FBXExporter::ReadNormal(FbxMesh* inMesh, int inCtrlPointIndex, int inVertexCounter, XMFLOAT3& outNormal)
{
if(inMesh->GetElementNormalCount() < 1)
{
throw std::exception("Invalid Normal Number");
}

FbxGeometryElementNormal* vertexNormal = inMesh->GetElementNormal(0);
switch(vertexNormal->GetMappingMode())
{
case FbxGeometryElement::eByControlPoint:
switch(vertexNormal->GetReferenceMode())
{
case FbxGeometryElement::eDirect:
{
outNormal.x = static_cast<float>(vertexNormal->GetDirectArray().GetAt(inCtrlPointIndex).mData[0]);
outNormal.y = static_cast<float>(vertexNormal->GetDirectArray().GetAt(inCtrlPointIndex).mData[1]);
outNormal.z = static_cast<float>(vertexNormal->GetDirectArray().GetAt(inCtrlPointIndex).mData[2]);
}
break;

case FbxGeometryElement::eIndexToDirect:
{
int index = vertexNormal->GetIndexArray().GetAt(inCtrlPointIndex);
outNormal.x = static_cast<float>(vertexNormal->GetDirectArray().GetAt(index).mData[0]);
outNormal.y = static_cast<float>(vertexNormal->GetDirectArray().GetAt(index).mData[1]);
outNormal.z = static_cast<float>(vertexNormal->GetDirectArray().GetAt(index).mData[2]);
}
break;

default:
throw std::exception("Invalid Reference");
}
break;

case FbxGeometryElement::eByPolygonVertex:
switch(vertexNormal->GetReferenceMode())
{
case FbxGeometryElement::eDirect:
{
outNormal.x = static_cast<float>(vertexNormal->GetDirectArray().GetAt(inVertexCounter).mData[0]);
outNormal.y = static_cast<float>(vertexNormal->GetDirectArray().GetAt(inVertexCounter).mData[1]);
outNormal.z = static_cast<float>(vertexNormal->GetDirectArray().GetAt(inVertexCounter).mData[2]);
}
break;

case FbxGeometryElement::eIndexToDirect:
{
int index = vertexNormal->GetIndexArray().GetAt(inVertexCounter);
outNormal.x = static_cast<float>(vertexNormal->GetDirectArray().GetAt(index).mData[0]);
outNormal.y = static_cast<float>(vertexNormal->GetDirectArray().GetAt(index).mData[1]);
outNormal.z = static_cast<float>(vertexNormal->GetDirectArray().GetAt(index).mData[2]);
}
break;

default:
throw std::exception("Invalid Reference");
}
break;
}
}


뭐 코드가 좀 길긴한데 쫄지마셈. 사실 존내 간단한거임.


요건 layer의 노말 정보를 얻는거임


FbxGeometryElementNormal* vertexNormal = inMesh->GetElementNormal(0);


첫 스위치문은 MappinhMode()에 관한 것임. 게임 엔진의 경우라면 FbxGeometryElement::eByControlPoint랑 FbxGeometryElement::eByPolygonVertex 이 두 가지 경우만 고려하면 될 거임. 이 두 모드에 대해 설명하자면, 앞서 언급했다시피 Control Point는 기본적으로 버텍스임. 암튼 요게 문제임.


큐브는 8개의 Control Point를 가지지만, 큐브가 정상적으로 보이려면 노말이 8개보다 많이 필요함. Sharp EDGE를 표현하려면 두개 이상의 노말을 동일한 Control Point에 적용해야함. 그래야 면이 각진걸로 보임. (역자주:이해가 안간다면 이 이미지를 보셈)


이 컨셉을 게임 엔진에 가져온다치면, 위치는 같지만 다른 노말을 가지는 버텍스 세 개를 큐브의 모서리에 위치시켜야함.


암튼 결론적으로, sharp edge를 표현할 필요가 없이 각 control point마다 하나의 노말만 가지고 있는 상황이면 FbxGeometryElement::ebycontrolpoint임. FbxGeometryElement::eByPolygonVertex는 sharp edge를 나타내야하고 각각의 면 마다 각각의 다른 노말을 가지는 버텍스를 다루는 경우임. 같은 control point라도  각각의 면은 서로 다른 노말을가지는거임. 그래서, FbxGeometryElement::eByControlPoint는 control point의 노말을 control point의 인덱스로 접근할 수 있음을 뜻함. 하지만,  FbxGeometryElement::eByPolygonVertex는 면에 있는 버텍스의 노말을 버텍스의 인덱스로 접근해야 함을 뜻함.


이건 FBXSDK의 버텍스와 control point의 차이에 대한 좀 더 구체적인 예시임. 또한, 이 힘수에 대한 파라미터를 설명할 때 inCtrlPointIndex와 inVertexCounter를 나눈 이유이기도 함. 왜냐면 우리는 어느게 필요한 정보러 쓰일 지 모기때문에 일단 둘 다 넘겨준거임.


이제 그 안에 있는 다른 switch 문을 보셈. ReferenceMode()에 의한 분기가 있을거임. 이는 FBX의 최적화 방안같은거임. 우리가 컴퓨터 그래픽에서 알고있는 index buffer 같은거임. 너님은 동일한 vector3를 매번 생성하기 싫으면 대신 인덱스로 접근해서 참조하면 됨.


FbxGeometryElement::eDirect는 페이스 버텍스의 인덱스나 control point의 인덱스를 직접 접근해서 노말을 뽑을 수 있다는 의미임 FbxGeometryElement::eIndexToDirect는 control point의 인덱스나 vertex의 인덱스 사용이 오로지 우리가 원하는 노말의 인덱스만을 가리킨다는 의미임.(역자주:말이 좀 거지같은데 암튼 걍 한단계 더 거쳐서 접근해야한다는 의미임)


이 코드가 우리가 필요한 인덱스를 뽑아줌 ㅇㅇ


int index = vertexNormal->GetIndexArray().GetAt(inVertexCounter);


이게 위치를 넘겨주고 메시의 layer 정보를 넘겨주는 중요 단계임


자 고롬 이제 에니메이션으로 넘어가셈. 이게 FBX  데이터 추출에서 골빠개지는 단계임 ㅇㅇ


(역자주 : 한번에 다 번역할라니 빡심 에니메이션 부분은 다음에 하겠음 오늘은 일단 여기까지 ㅋㅋ)

핑백

  • 오즈라엘 : FBX SDK 이용 방법 #1 (How to Work with FBX SDK 번역) 2014-09-01 17:00:47 #

    ... [2]); currCtrlPoint-&gt;mPosition = currPosition; mControlPoints[i] = currCtrlPoint; }} 이어지는글. &lt;- 클릭(아 이글루스 개병신. 글 길게 쓰는게 막혀있어서 두 개로 나눔) ... more

  • CrazyXIII : [VisualShock] 모델 데이터 2015-04-13 22:41:04 #

    ... 0개의 포멧을 로딩해준단다. 개 멋짐.. 사용법은 Tutorial을 참고해보자! 사실 처음에는 FBX SDK를 이용해서 파싱하려고 했는데, 오즈라엘 아즈씨의 번역 내용을 참고하자! ... more

  • CrazyXIII : FBX 로딩 (1) 2015-07-22 12:58:57 #

    ... 80ce5891-1ec6.htm,topicNumber=d0e3802) 참고자료* How to Work with FBX SDK* FBX SDK 이용방법 #1* FBX SDK 이용방법 #2 딱히 별도로 정리하기 귀찮으니 코드를 연습장으로 (파워) 정리... 전체적은 흐름은 FbxScene을 하나 만들고, File 에서 FbxS ... more

덧글

  • 성격급한 설인 2014/09/01 19:02 # 답글

    S-LINE출~장~대~행 국내1위,애~인~대~행,출~장~대~행,번~개~만~남,조~건~만~남,최고의 만~남
    입장▶1 ▶ http://kat62.com/

    입장 ▶2 ▶ http://kat62.com/
    섹파 원하세요? 최상의 서비스로 고객만족 100 %
    텐프로, 룸살롱, 회사원, 일반인, 여대생 등 등 .
    전국 기본으로 가능하며 /집/모텔 /호텔 /원룸 /회사 /어디든.콜 /즉시 출발 대기중
    매너는 기본인거 아시죠? 여자 도우미 선택 http://kat62.com/ (참고)
    S-LINE출~장~대~행 업체 아가씨 장기적으로 모집중
  • 다음글은ㅠㅠ 2015/02/04 09:56 # 삭제 답글

    애니메이션 글은 어디서 볼수있나요 ㅡㅜ
댓글 입력 영역


smallBanner

longBanner

rightSmallBanner

mobile

트위터큰거