Насколько мне известно и встречалась запись позиций в файл (бинарный или текстовый) это три числа с плавающей запятой(точкой). В большинстве случаев это три 32-ух битних числа или 12 байт. В этом же файле для записи позиций используется 8 байт. Пример из нескольких строк:
AFF8EFF77A530100 B92AF34D 00800080 8F4E2200 02010000 FC698380 FFFFFFFF 6A10B780 7A510A80
1AF829FB19540100 27183853 00800080 AC2E2500 01000200 FE707D80 FFFFFFFF 720DB580 78570780
CDF7A5FEBB4F0100 519383E9 00800080 96492000 01000200 7275FD80 FFFFFFFF 017B7280 8F027780
3034 <0000101111011010>: 40 bytes
D3DVERTEXELEMENT9[] =
{
{0, 0x00, D3DDECLTYPE_SHORT4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0},
{0, 0x08, D3DDECLTYPE_SHORT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0},
{0, 0x0C, D3DDECLTYPE_SHORT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 1},
{0, 0x10, D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_BLENDWEIGHT, 0},
{0, 0x14, D3DDECLTYPE_UBYTE4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_BLENDINDICES, 0},
{0, 0x18, D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 0},
{0, 0x1C, D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR, 0},
{0, 0x20, D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_FOG, 0},
{0, 0x24, D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_PSIZE, 0},
};
Из файла мне нужно извлечь позицию вертекса, текстурные координаты, весы (BLENDWEIGHT) и к какой кости привязано. Единственное что понятно, как читать, это BLENDWEIGHT 8F4E2200 - 8F 4E 22 00 тут просто, каждый байт делим на 255. результат от 0 до 1. К какой кости привязано, уже не понятно.
02010000 это не значит, что 2 1 0 0, костей больше ста, а цифры чередуются в пределах 6 (в данном файле)
Но вопрос дня, как же всё таки записана позиция?
AFF8 EFF7 7A53 0100 если предположить, что тут три числа Float16, а 0100 это какое-то техническое и не понятно для чего число, получается вот что:
-0.124512, -8156.0, 51808.0 (фигня получается), если читать байты в другом порядке:
-38368.0, -32496.0, 59.8125 (снова фигня)
Пробовал читать как обычное число и делить его на 32767, числа получаются красивые, но не верные)
Как ещё можно попробовать прочитать, чтобы получить правильные координаты vertex?
Судя по скелету (его то я вытащил и построил), в данной модели высота около 3 метров, ширина максимум 1.3
P.S.
Для чтения чисел с половинной точностью написал функцию на Maxscript.
Формула взята отсюда - http://www.softelectro.ru/ieee754.html
-- функция, HEX число в кавычках HalfToFloat "AFE8" (младший разряд справа)
fn HalfToFloat hex =
(
dec = bit.HexAsInt hex
Sign = 0
if (bit.get dec 16) == true then Sign = 1
Expon = 0
for bits=11 to 15 do if (bit.get dec bits) == true then Expon = bit.flip Expon (bits-10)
Mant = 0
for bits=1 to 10 do if (bit.get dec bits) == true then Mant = bit.flip Mant bits
return (-1.0)^Sign * 2.0^(Expon - 15.0) * (1.0 + Mant/2.0^10)
)
Может в скрипте косяк, но я проверял не один раз, всё вроде верно.
AFF8EFF77A530100 B92AF34D 00800080 8F4E2200 02010000 FC698380 FFFFFFFF 6A10B780 7A510A80
1AF829FB19540100 27183853 00800080 AC2E2500 01000200 FE707D80 FFFFFFFF 720DB580 78570780
CDF7A5FEBB4F0100 519383E9 00800080 96492000 01000200 7275FD80 FFFFFFFF 017B7280 8F027780
3034 <0000101111011010>: 40 bytes
D3DVERTEXELEMENT9[] =
{
{0, 0x00, D3DDECLTYPE_SHORT4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0},
{0, 0x08, D3DDECLTYPE_SHORT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0},
{0, 0x0C, D3DDECLTYPE_SHORT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 1},
{0, 0x10, D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_BLENDWEIGHT, 0},
{0, 0x14, D3DDECLTYPE_UBYTE4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_BLENDINDICES, 0},
{0, 0x18, D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 0},
{0, 0x1C, D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR, 0},
{0, 0x20, D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_FOG, 0},
{0, 0x24, D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_PSIZE, 0},
};
Из файла мне нужно извлечь позицию вертекса, текстурные координаты, весы (BLENDWEIGHT) и к какой кости привязано. Единственное что понятно, как читать, это BLENDWEIGHT 8F4E2200 - 8F 4E 22 00 тут просто, каждый байт делим на 255. результат от 0 до 1. К какой кости привязано, уже не понятно.
02010000 это не значит, что 2 1 0 0, костей больше ста, а цифры чередуются в пределах 6 (в данном файле)
Но вопрос дня, как же всё таки записана позиция?
AFF8 EFF7 7A53 0100 если предположить, что тут три числа Float16, а 0100 это какое-то техническое и не понятно для чего число, получается вот что:
-0.124512, -8156.0, 51808.0 (фигня получается), если читать байты в другом порядке:
-38368.0, -32496.0, 59.8125 (снова фигня)
Пробовал читать как обычное число и делить его на 32767, числа получаются красивые, но не верные)
Как ещё можно попробовать прочитать, чтобы получить правильные координаты vertex?
Судя по скелету (его то я вытащил и построил), в данной модели высота около 3 метров, ширина максимум 1.3
P.S.
Для чтения чисел с половинной точностью написал функцию на Maxscript.
Формула взята отсюда - http://www.softelectro.ru/ieee754.html
-- функция, HEX число в кавычках HalfToFloat "AFE8" (младший разряд справа)
fn HalfToFloat hex =
(
dec = bit.HexAsInt hex
Sign = 0
if (bit.get dec 16) == true then Sign = 1
Expon = 0
for bits=11 to 15 do if (bit.get dec bits) == true then Expon = bit.flip Expon (bits-10)
Mant = 0
for bits=1 to 10 do if (bit.get dec bits) == true then Mant = bit.flip Mant bits
return (-1.0)^Sign * 2.0^(Expon - 15.0) * (1.0 + Mant/2.0^10)
)
Может в скрипте косяк, но я проверял не один раз, всё вроде верно.