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

유니티 에셋 스토어에는 쓸만한 모델 데이터들이 어마어마합니다. 이러한 리소솓들이 십중팔구는 FBX 포맷을 사용합니다. 즉 유니티 에셋 스토어의 리소스를 자체엔진에서 사용하기 위해서는 FBX 파싱을 해야한 다는 것이죠. 때문에 요즘 FBX 파일을 파싱하기 위해서 FBX SDK를 살펴보고 있는데 좋은 글을 하나 발견하게 되었습니다. FBX SDK를 살펴볼 분이 얼마나 계실지는 모르겠지만 번역좀 해서 올리고자 합니다... 만 귀찮아서 반만 번역하고 음셈체로 썼네요 ㅋㅋ 반말이나 음셈체에 반감 있으신분들은 그냥 원문만 보세요 ㅋ 어짜피 볼 사람도 얼마 안계실테니 다듬고 자시고 하긴 귀챠나여 걍 봐여 ㅋㅋ 번역 오역 의역 악(?)역 쩌니 역시 원문을 추천드림 ㅋㅋ

원문 :


나님은 FBX 파일을 자체포맷으로 변환하는 익스포터를 만들고 싶음. 아놔 FBX 공식 문서가 거지같아서 작업하기 빡셌음. 게다가, FBX 포맷이 게임 엔진만을 위한게 아니라 범용적인 기술을 다루고 있어서 샘플 코드도 게임 개발에 딱 맞지가 않았음. (역자주: 아 개공감 ㅠ)

아 그래서 존나 구글링 했는데 FBX파일을 자체 포맷으로 변환하는 내용에 대해서 쩔게 정리해 놓은 글이 없글래 나님이 정리해놓음. 님들 잘 거져드셈 우걱우걱


이 튜토리얼은 게임 엔진에 특화되어있음. 기본적으로는 게임 엔진에 필요한 데이터를 얻는 방법에 대해 다룰거임. FBX SDK를 초기화하는 방법같은거는 샘플 코드 보면서 알아서 하셈 ㅇㅇ ImportScene 샘플이 딱임

혹시 너님이 관절 에니메이션에 대해 잘 모르면 Buckeye의 글 “Skinned Mesh Animation Using Matrics”를 읽어보셈. 존나 좋음 ㅇㅇ


Mesh Data(position, UV, normal, tangent, binormal)

너님이 맨 처음 해야할 일은 mesh데이터를 얻어오는 것임. 정적 메시를 너님의 엔진에 임포트할 수 있다면 존나 좋을거임.

일단 이 섹션에 대해 명확히 하자면, 나님은 우선 FBX 파일을 순회하는 법에 대해 보여줄거임. 이는 메시 데이터를 얻기 위한 행위를 순차적으로 이해시켜줄거임. 각각의 함수가 정확히 뭥미인지 이해 못하더라도, 각 삼각형 당 3개의 정점을 순회하는 것에 대한 해답을 얻을 수 있을거임. 각각의 함수에 대해서는 차후 설명하겠음


에니메이션을 위한 블렌딩 정보와 연관 된 코드 일부가 요기잉네. 일단 자세한건 알비백 ㅇㅇ


void FBXExporter::ProcessMesh(FbxNode* inNode)
{
FbxMesh* currMesh = inNode->GetMesh();

mTriangleCount = currMesh->GetPolygonCount();
int vertexCounter = 0;
mTriangles.reserve(mTriangleCount);

for (unsigned int i = 0; i < mTriangleCount; ++i)
{
XMFLOAT3 normal[3];
XMFLOAT3 tangent[3];
XMFLOAT3 binormal[3];
XMFLOAT2 UV[3][2];
Triangle currTriangle;
mTriangles.push_back(currTriangle);

for (unsigned int j = 0; j < 3; ++j)
{
int ctrlPointIndex = currMesh->GetPolygonVertex(i, j);
CtrlPoint* currCtrlPoint = mControlPoints[ctrlPointIndex];


ReadNormal(currMesh, ctrlPointIndex, vertexCounter, normal[j]);
// We only have diffuse texture
for (int k = 0; k < 1; ++k)
{
ReadUV(currMesh, ctrlPointIndex, currMesh->GetTextureUVIndex(i, j), k, UV[j][k]);
}


PNTIWVertex temp;
temp.mPosition = currCtrlPoint->mPosition;
temp.mNormal = normal[j];
temp.mUV = UV[j][0];
// Copy the blending info from each control point
for(unsigned int i = 0; i < currCtrlPoint->mBlendingInfo.size(); ++i)
{
VertexBlendingInfo currBlendingInfo;
currBlendingInfo.mBlendingIndex = currCtrlPoint->mBlendingInfo[i].mBlendingIndex;
currBlendingInfo.mBlendingWeight = currCtrlPoint->mBlendingInfo[i].mBlendingWeight;
temp.mVertexBlendingInfos.push_back(currBlendingInfo);
}
// Sort the blending info so that later we can remove
// duplicated vertices
temp.SortBlendingInfoByWeight();

mVertices.push_back(temp);
mTriangles.back().mIndices.push_back(vertexCounter);
++vertexCounter;
}
}

// Now mControlPoints has served its purpose
// We can free its memory
for(auto itr = mControlPoints.begin(); itr != mControlPoints.end(); ++itr)
{
delete itr->second;
}
mControlPoints.clear();
}


FBX가 메쉬의 모든 정보를 어케 가지고 있는지를 설명하게뜸. FBX에는 컨트롤 포인트란게 있음. 요 컨트롤 포인트는 기본적으로 물리적인 버텍스임. 예를 들자면,큐브가 있다고 치셈. 큐브는 버텍스가 8개임. 이 8개의 버텍스는 8개의 컨트롤 포인트임. 결론적으로, 버텍스와 컨트롤포인트는 일맥상통한다고 보면 됨. 위치 정보가 이 컨트롤 포인트에 있음.


아래 코드가 메시의 모든 버텍스의 위치를 얻어오는 코드임


// inNode is the Node in this FBX Scene that contains the mesh
// this is why I can use inNode->GetMesh() on it to get the mesh
void FBXExporter::ProcessControlPoints(FbxNode* inNode)
{
FbxMesh* currMesh = inNode->GetMesh();
unsigned int ctrlPointCount = currMesh->GetControlPointsCount();
for(unsigned int i = 0; i < ctrlPointCount; ++i)
{
CtrlPoint* currCtrlPoint = new CtrlPoint();
XMFLOAT3 currPosition;
currPosition.x = static_cast<float>(currMesh->GetControlPointAt(i).mData[0]);
currPosition.y = static_cast<float>(currMesh->GetControlPointAt(i).mData[1]);
currPosition.z = static_cast<float>(currMesh->GetControlPointAt(i).mData[2]);
currCtrlPoint->mPosition = currPosition;
mControlPoints[i] = currCtrlPoint;
}
}



이어지는글. <- 클릭(아 이글루스 개병신. 글 길게 쓰는게 막혀있어서 두 개로 나눔)

아 폰트랑 글자 크기는 왜 이따구로 나오는거지 망할 이글루 망해라 망해라 거지같은 이글루스


핑백

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

    ... 이전글 &lt;- 클릭 자 이제 너님은 나님에게 "UV랑 노말이랑 탄젠트랑 바이노말은 어케 얻어옴?" 하고 물어볼거임. ㅇㅇ 그럼 잠시 메시에 대해 생각해보기로 하셈. 너님은 ... more

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

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

덧글

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

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

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

    나이스... 게임스쿨의 수염 학생
  • 2016/06/18 13:38 # 삭제 답글 비공개

    비공개 덧글입니다.
댓글 입력 영역


smallBanner

longBanner

rightSmallBanner

mobile

트위터큰거