--=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. Как обойтись без ручной перестановки записи (тем более, что в бинарном это не возможно)?