-
Notifications
You must be signed in to change notification settings - Fork 2
fig_ru
Трёхмерная модель
Файл начинается с "магического числа":
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