Skip to content
aspadm edited this page Oct 20, 2018 · 2 revisions

English version

Формат: FIG

Описание

Трёхмерная модель

Визуализация

структура fig, png изображение

Структура

Файл начинается с "магического числа":

byte magic[3]; // FIG

Далее идёт указание на число хранимых блоков:

byte n;
n -= 48;

В игре используется n = 8. Под блоком подразумевается, что вертексная информация существует в 8 экземплярах, итоговая модель - трилинейная интерполяция над этими значениями по трём характеристикам: сила, ловкость, высота (рост).

Далее хранятся непосредственно данные модели:

uint vertex_count;
uint normal_count;
uint texcoord_count;
uint index_count;

uint vertex_component_count;
uint morph_component_count;

uint unknown; // всегда 0

uint group;

uint texture_number;

vec3 center[n];
vec3 aabb_min[n];
vec3 aabb_max[n];
float radius[n];

Вертексные данные упакованы следующим образом: в n блоках расположены массивы упакованных по 4 вертексов, вида x1, x2, x3, x4, y1, y2, y3, y4, z1, z2, z3, z4:

float vertices[3 * 4 * n * vertex_count];

Нормали упакованы схожим образом: упаковка из 4 осей по 4 элемента:

float normals[4 * 4 * normal_count];

Текстурные координаты и индексы обычные:

vec2 texcoords[texcoord_count];
ushort indices[index_count];

Итоговые вертексы состоят из 3 компонент:

typedef struct
{
    uint16 vertex_index;
    uint16 normal_index;
    uint16 texcoord_index;
} vertex_component;

vertex_component vertex_components[vertex_component_count];

В конце расположены данные морфинга:

typedef struct
{
    uint16 morph_index;
    uint16 vertex_index;
} morph_component;

morph_component morph_components[morph_component_count];

Дополнительная информация

Трилинейная интерполяция

Условно, 8 значений расположены в вершинах куба, тремя пропорциями мы получаем точку внутри куба:

s, d, h - параметры
0..7 - стартовые значения

t1 = 0 + (1 - 0) * s
t2 = 2 + (3 - 2) * s
v1 = t1 + (t2 - t1) * d

t1 = 4 + (5 - 4) * s
t2 = 6 + (7 - 6) * s
v2 = t1 + (t2 - t1) * d

res = v1 + (v2 - v1) * h