나님은 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;
}
}










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