--=GAMER=-- писал(а):А если в обход? из *.x в *.md2 и затем юзать уже *.md2?
Думаю, одинаково, что юзать, вопрос как?
Вот текст "ABox.x" с анимацией (всего 2 ключа):
xof 0302txt 0064
Header {
 1;
 0;
 1;
}
Frame x3ds_top_ABox {
 Frame x3ds_Box01 {
  FrameTransformMatrix {
   1.000000, 0.000000, 0.000000, 0.000000,
   0.000000, 1.000000, 0.000000, 0.000000,
   0.000000, 0.000000, 1.000000, 0.000000,
   0.001000, 0.001000, 0.001000, 1.000000;;
  }
  Mesh Box01 {
    8;
    -5.000000; 0.000000; -10.000000;,
    5.000000; 0.000000; -10.000000;,
    -5.000000; 0.000000; 10.000000;,
    5.000000; 0.000000; 10.000000;,
    -5.000000; 5.000000; -10.000000;,
    5.000000; 5.000000; -10.000000;,
    -5.000000; 5.000000; 10.000000;,
    5.000000; 5.000000; 10.000000;;
    12;
    3;0,3,2;,
    3;3,0,1;,
    3;4,7,5;,
    3;7,4,6;,
    3;0,5,1;,
    3;5,0,4;,
    3;1,7,3;,
    3;7,1,5;,
    3;3,6,2;,
    3;6,3,7;,
    3;2,4,0;,
    3;4,2,6;;
   MeshNormals {
    24;
    0.000000;-1.000000;0.000000;,
    0.000000;0.000000;-1.000000;,
    -1.000000;0.000000;0.000000;,
    0.000000;-1.000000;0.000000;,
    0.000000;0.000000;-1.000000;,
    1.000000;0.000000;0.000000;,
    0.000000;-1.000000;0.000000;,
    0.000000;0.000000;1.000000;,
    -1.000000;0.000000;0.000000;,
    0.000000;-1.000000;0.000000;,
    1.000000;0.000000;0.000000;,
    0.000000;0.000000;1.000000;,
    0.000000;1.000000;0.000000;,
    0.000000;0.000000;-1.000000;,
    -1.000000;0.000000;0.000000;,
    0.000000;1.000000;0.000000;,
    0.000000;0.000000;-1.000000;,
    1.000000;0.000000;0.000000;,
    0.000000;1.000000;0.000000;,
    0.000000;0.000000;1.000000;,
    -1.000000;0.000000;0.000000;,
    0.000000;1.000000;0.000000;,
    1.000000;0.000000;0.000000;,
    0.000000;0.000000;1.000000;;
    12;
    3;0,9,6;,
    3;9,0,3;,
    3;12,21,15;,
    3;21,12,18;,
    3;1,16,4;,
    3;16,1,13;,
    3;5,22,10;,
    3;22,5,17;,
    3;11,19,7;,
    3;19,11,23;,
    3;8,14,2;,
    3;14,8,20;;
   }
  }
 }
}
AnimationSet x3ds_animset_0 {
 Animation x3ds_anim_0 {
 {x3ds_Box01}            
AnimationKey {
   0;
   2;
   0; 4; 1.000000, 0.000000, 0.000000, 0.000000;;,
   1; 4; 0.945519, 0.000000, 0.325568, 0.000000;;;
  }
  AnimationKey {
   2;
   1;
   0; 3; 0.000000, 0.000000, 0.000000;;;
  }
}
}
Изучаю известный софтовый пример для вытаскивания анимации (пример костяшный, это все знают, но я не верю, что нельзя сделать фреймовую). Разложил все "по-полочкам" пытаясь добраться до AnimationKey:
Dim XFileName As String
Dim DataType As String
Dim DataName As String
Dim DataSize As Long
         
XFileName = App.Path + "\ABox.x"
         
Dim XFile As DirectXFile
Dim EnumX As DirectXFileEnum
        
Set XFile = DX.DirectXFileCreate()
Set EnumX = XFile.CreateEnumObject(XFileName)
Dim MainData As DirectXFileData
    
' Step 1
' возвращает
' "3D82AB46-62DA-11cf-AB39-0020AF71E433"
' Name=""  Size=8
Set MainData = EnumX.GetNextDataObject()
DataType = MainData.GetType
DataName = MainData.GetName
DataSize = MainData.GetDataSize("")
         
'MsgBox DataName
'End
' Step 2
' возвращает "TID_D3DRMFrame"
' Name="x3ds_ABox"  Size=0
Set MainData = EnumX.GetNextDataObject()
DataType = MainData.GetType
DataName = MainData.GetName
DataSize = MainData.GetDataSize("")
        
'MsgBox DataSize
'End
                        
' Step 2.1
' возвращает "TID_D3DRMFrame"
' Name="x3ds_Box01" Size=0
Dim Data21 As DirectXFileData
Set Data21 = MainData.GetNextObject()
DataType = Data21.GetType()
DataName = Data21.GetName()
DataSize = Data21.GetDataSize("")
            
'MsgBox DataType
'End
' Step 2.1.1
' возвращает "TID_D3DRMFrameTransformMatrix"
' name=""  Size=64
                      
Dim Data211 As DirectXFileData
Set Data211 = Data21.GetNextObject()
DataType = Data211.GetType()
DataName = Data211.GetName()
DataSize = Data211.GetDataSize("")
'MsgBox DataSize
'End
' Step 2.1.2
' возвращает "TID_D3DRMMesh"
' name="Box01"  Size=296
Dim Data212 As DirectXFileData
Set Data212 = Data21.GetNextObject()
DataType = Data212.GetType()
DataName = Data212.GetName()
DataSize = Data212.GetDataSize("")
'MsgBox DataSize
'End
' Step 2.1.2.1
' возвращает "TID_D3DRMMeshNormals"
' name=""  Size=488
Dim Data2121 As DirectXFileData
Set Data2121 = Data212.GetNextObject()
DataType = Data2121.GetType()
DataName = Data2121.GetName()
DataSize = Data2121.GetDataSize("")
'MsgBox DataSize
'End
' Step 3
' возвращает "TID_D3DRMAnimationSet"
' Name="x3ds_animset_0"   Size=0
Set MainData = EnumX.GetNextDataObject()
DataType = MainData.GetType()
DataName = MainData.GetName()
DataSize = MainData.GetDataSize("")
'DestroyAll
'MsgBox DataSize
'End
' Step 3.1
' возвращает "TID_D3DRMAnimation"
' Name="x3ds_anim_0"   Size=0
Dim Data31 As DirectXFileData
Set Data31 = MainData.GetNextObject()
DataType = Data31.GetType
DataName = Data31.GetName
DataSize = Data31.GetDataSize("")
             
'MsgBox DataSize
'End
А дальше получается глюк! Прога вылетает!
Причина в блоке {x3ds_Box01}. Означает она, какому фрейму принадлежат ключи. В софтовом примере подобные блоки записаны после блоков AnimationKey. Я так и сделал, переставил, заработало:          
 
' Step 3.1.1
' возвращает "TID_D3DRMAnimationKey"
' Name=""     Size=56
Dim Data311 As DirectXFileData
Set Data311 = Data31.GetNextObject()
DataType = Data311.GetType
DataName = Data311.GetName
DataSize = Data311.GetDataSize("")
             
'MsgBox DataSize
'End
         
' Step 3.1.2
' возвращает "TID_D3DRMAnimationKey"
' Name=""     Size=28
Dim Data312 As DirectXFileData
Set Data312 = Data31.GetNextObject()
DataType = Data312.GetType
DataName = Data312.GetName
DataSize = Data312.GetDataSize("")
             
'MsgBox DataType
'End
Вопрос
1. Как можно получить саму запись {x3ds_Box01}?
2. Как обойтись без ручной перестановки записи (тем более, что в бинарном это не возможно)?