Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Wczytanie Modelu *.fbx

Ostatnio zmodyfikowano 2025-07-03 14:04
Autor Wiadomość
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 ..

C/C++
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";
   
}
   
   
// Rekurencja dla dzieci
   
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 );
       
       
// show time of animation
       
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() );
       
       
   
}
}
P-182637
tBane
Temat założony przez niniejszego użytkownika
» 2025-07-03 14:04:30
eh :-/ poddaje się
P-182638
1 « 2 »
Poprzednia strona Strona 2 z 2