Wczytanie Modelu *.fbx
Ostatnio zmodyfikowano 2025-07-03 14:04
tBane Temat założony przez niniejszego użytkownika |
» 2025-07-03 10:45:27 Wpadłem na kolejny pomysł więc pisze drugą wersję loadera. A mianowicie próbuję podmienić kości w modelScene na te z animScene - ale nie wiem czy to dobre rozwiązanie zaladowano plik: anm\WK_heavy_infantry_06_combat_walk.FBX wykryto animacje... ------------------------------ load animation no 0 : "Take 001" anim start: 0s anim stop: 1.2s
Bone: modelNode: Bip001 animNode: Bip001 bone replaced
Bone: modelNode: Bip001 Pelvis animNode: Bip001 Pelvis bone replaced
Bone: modelNode: Bip001 Spine animNode: Bip001 Spine bone replaced
Bone: modelNode: Bip001 Neck animNode: Bip001 Neck bone replaced
Bone: modelNode: Bip001 Head animNode: Bip001 Head bone replaced
Bone: modelNode: Bip001 L Clavicle animNode: Bip001 L Clavicle bone replaced
Bone: modelNode: Bip001 L UpperArm animNode: Bip001 L UpperArm bone replaced
Bone: modelNode: Bip001 L Forearm animNode: Bip001 L Forearm bone replaced
Bone: modelNode: Bip001 L Hand animNode: Bip001 L Hand bone replaced
Bone: modelNode: Bip001 R Clavicle animNode: Bip001 R Clavicle bone replaced
Bone: modelNode: Bip001 R UpperArm animNode: Bip001 R UpperArm bone replaced
// etc ..
FbxNode * FindChildByName( FbxNode * root, const char * name ) { if( !root ) return nullptr; if( strcmp( root->GetName(), name ) == 0 ) return root; for( int i = 0; i < root->GetChildCount(); i++ ) { FbxNode * found = FindChildByName( root->GetChild( i ), name ); if( found ) return found; } return nullptr; }
void PrintSkeleton( FbxNode * animNode ) { if( !animNode ) return; FbxNodeAttribute * attrAnim = animNode->GetNodeAttribute(); if( attrAnim && attrAnim->GetAttributeType() == FbxNodeAttribute::eSkeleton ) { std::cout << "Bone:\n"; FbxNode * modelNode = FindChildByName( modelScene->GetRootNode(), animNode->GetName() ); FbxNodeAttribute * attrModel = modelNode->GetNodeAttribute(); FbxSkeleton * modelSkeleton = static_cast < FbxSkeleton * >( attrModel ); std::cout << "modelNode:\t" << modelNode->GetName() << "\n"; FbxSkeleton * animSkeleton = static_cast < FbxSkeleton * >( attrAnim ); std::cout << "animNode:\t" << animNode->GetName() << "\n"; modelSkeleton = animSkeleton; std::cout << "bone replaced: " << modelSkeleton->GetName() << "\n"; std::cout << "\n"; } for( int i = 0; i < animNode->GetChildCount(); i++ ) { PrintSkeleton( animNode->GetChild( i ) ); } }
void loadFBXAnimation2( std::wstring pathfile ) { FbxImporter * importer = FbxImporter::Create( manager, "" ); if( !importer->Initialize( ConvertWideToUtf8( pathfile ).c_str(), - 1, manager->GetIOSettings() ) ) { std::wcout << L"Błąd: nie udało się wczytać animacji: " << pathfile << L"\n"; return; } std::cout << "zaladowano plik: " << ConvertWideToUtf8( pathfile ) << "\n"; FbxScene * animScene = FbxScene::Create( manager, "animation" ); importer->Import( animScene ); importer->Destroy(); FbxAnimStack * animStack = animScene->GetSrcObject < FbxAnimStack >( 0 ); if( !animStack ) { std::cout << "Brak animacji\n"; return; } int animCount = animScene->GetSrcObjectCount < FbxAnimStack >(); if( animCount == 0 ) { std::cout << "Brak animacji\n"; return; } std::cout << "wykryto animacje...\n"; std::cout << "------------------------------\n"; for( int i = 0; i < animCount; i++ ) { FbxAnimStack * animStack = animScene->GetSrcObject < FbxAnimStack >( i ); FbxAnimLayer * animLayer = animStack->GetMember < FbxAnimLayer >( 0 ); std::cout << "load animation no " << i << " : \"" << animStack->GetName() << "\"\n"; animScene->SetCurrentAnimationStack( animStack ); FbxTakeInfo * takeInfo = animScene->GetTakeInfo( animStack->GetName() ); std::cout << "anim start: " << takeInfo->mLocalTimeSpan.GetStart().GetSecondDouble() << "s \n"; std::cout << "anim stop: " << takeInfo->mLocalTimeSpan.GetStop().GetSecondDouble() << "s \n"; std::cout << "\n"; PrintSkeleton( animScene->GetRootNode() ); } }
|
|
tBane Temat założony przez niniejszego użytkownika |
» 2025-07-03 14:04:30 eh :-/ poddaje się |
|
1 « 2 » |