Формат .fig
#21
Привет ребята.

Вот я добрался и до сюда.
Но меня уже пугает скрытность...

Скажите, пжл, доступна ли какая-либо информация о fig (я так понимаю, это тройка .mod .anm .bon). Есть ли какие-либо утилиты? С чего можно и нужно начать или сразу вешаться Smile
Windows - аналог плохо понятых механизмов Unix
Use Linux - open your mind
Ответ
#22
2v1s0r кю, тебе мыло дошло? Про fig-и там чего-то такое я отправлял ). Там правда только начальный разбор, но хоть что-то ).
Gipat Group
Ответ
#23
2Sagrer всё норм, получил, спс, буду разбираться обязательно.
Сюда я просто на всякий случай написал...
Windows - аналог плохо понятых механизмов Unix
Use Linux - open your mind
Ответ
#24
Готово описание формата fig с друзьями.
Если кто заинтересуется в приведении доки в более удобную форму - пишите. Я сомневаюсь, что получилось доступно и понятно всё объяснить.


Добавил: v1s0r [mergetime]1269368204[/mergetime]
Начать следует с figures.txt, а далее по ссылкам...

Документы обновлены. Улучшено оформление.


Файлы вложений
.txt   lnkfile.txt (Размер: 3.14 KB / Загрузок: 548)
.txt   glossary.txt (Размер: 1.26 KB / Загрузок: 513)
.txt   bonfile.txt (Размер: 2.02 KB / Загрузок: 464)
.txt   anmfile.txt (Размер: 2.79 KB / Загрузок: 496)
.txt   figfile.txt (Размер: 10.19 KB / Загрузок: 493)
.txt   figures.txt (Размер: 2.1 KB / Загрузок: 557)
Windows - аналог плохо понятых механизмов Unix
Use Linux - open your mind
Ответ
#25
Решил попробовать сделать нового монстра "псоглавца". Прикрутил голову волка в unhuma.mod. Вот что получилось:
[Изображение: 54062047a031t.jpg]
Есть ли способ
-изменить ориентацию головы
-изменить относительный размер
-изменить положение текстуры для волчьей головы чтобы сократить замещение текстур
?

К сожалению из описания форматов мне мало что понятно Sad
Ответ
#26
Прощу помощи с анимацией.
Если более конкретно, то со смещениями при анимации.

На данный момент в CE не используются смещения из файла анимации, а считаются на ходу. в том числе смещение базовой кости - собственно поэтому драконы сейчас не летаютSmile Я занимаюсь тем, что пытаюсь это исправить.
У нас из fig8 по комплекции идет расчет смещения кости относительно родительской кости. потом по повороту родительской оси откладываем это смещение и рисуем текущую часть тела. Собственно это все равботает на вид более чем неплохо - за исключением смещения базовой кости.

В анимациях есть уже просчитанное смещение с учетом поворота родительской кости, в том числе для базовой кости. Однако, насколько я понимаю, для каждого кадра анимации есть только один набор смещений костей, что не позволяет правильно пересчитать смещения для текущей комплекции... Мне не удалось догадаться, как же правильно пересчитывать смещения для анимации.

Надеюсь, что кто-нибудь подскажетSmile

PS на скринах смещения из файлов анимации - для кабанчика вполне неплохо(для кабанов побольше - не подходит), а вот лягушка, похоже, должна быть значительно больше чтобы подходить для этих смещений

Врыл
Знаю, что уже почти год прошелSmile но тем не менее, все это можно сделать только через редактирование ресурсов.


Файлы вложений Эскизы(ов)
       
Ответ
#27
Нужен псевдокод, так очень сложно понять даже суть вопроса Smile
Duty is everything, the greatest of joys, the deepest of sorrows.
Ответ
#28
Smile я попробую, но пожалуй лучше это будут части реального кода с комментариями

вот наша функция для расчета смещения - работает вроде бы как надо, по крайней мере на вид (вызывается 3 раза для x, y и z соответственно)
Код:
static float ce_figfile_value_fig8(const float* params,      //массив fig8 - 8 наборов смещений для расчето нужного по комплекции
     size_t stride,      //смещение - 3(x,y,z)
     const ce_complection* complection)  // собственно структура комплекции
{
    float temp1 = params[0 * stride] +
 (params[1 * stride] - params[0 * stride]) * complection->strength;
    float temp2 = params[2 * stride] +
 (params[3 * stride] - params[2 * stride]) * complection->strength;
    float value = temp1 + (temp2 - temp1) * complection->dexterity;
    temp1 = params[4 * stride] +
 (params[5 * stride] - params[4 * stride]) * complection->strength;
    temp2 = params[6 * stride] +
 (params[7 * stride] - params[6 * stride]) * complection->strength;
    temp1 += (temp2 - temp1) * complection->dexterity;
    return value += (temp1 - value) * complection->height;
}

основная структура здесь будет выглядеть так
Код:
typedef struct ce_figbone ce_figbone;

struct ce_figbone {
    ce_vec3 position;  //смещение - сейчас считается из комплекции, надо из anm как поворот
    ce_quat orientation;  //поворот - считается через линейную интерполяцию двух ключевых кадров анимации (из anm)
    ce_vec3 bone_position;    //текущие смещения и поворот - с учетом родительской кости
    ce_quat bone_orientation;    
    ce_anmstate* anmstate;    //текущее состояние анимации - где именно между какими кадрами находимся и прочее
    ce_figbone* parent;  //родительская кость и потомки
    ce_vector* childs;  
};

так выглядит функция для расчета анимации сейчас - смещение из анимации не учитывается, подъем модели из земли получается через хардкодSmile
Код:
static void ce_figbone_update_transform(ce_figbone* figbone,
         ce_renderitem* renderitem)
{
    // TODO: translations from anm file ???

    // update binding pose
    if (NULL == figbone->anmstate->anmfile) {
 figbone->orientation = CE_QUAT_IDENTITY;
    } else {  // линейная интерполяция поворота кости между двумя ключевыми кадрами анимации
 ce_quat q1, q2;
 ce_quat_slerp(&figbone->orientation, figbone->anmstate->coef,
     ce_quat_init_array(&q1, figbone->anmstate->anmfile->rotations +
           (int)figbone->anmstate->prev_frame * 4),
     ce_quat_init_array(&q2, figbone->anmstate->anmfile->rotations +
           (int)figbone->anmstate->next_frame * 4));
    }

    // update bone pose
    if (NULL == figbone->parent) {  // для базовой (корневой?) кости - располагается обычно гдето в районе таза, поэтому без ее смещения модели по пояс в земле
 // bone pose == binding pose
 figbone->bone_position = figbone->position;
 figbone->bone_orientation = figbone->orientation;
    } else {
 //поворачиваем смещение расчитанное в по комплекции - куда повернута родительская кость
 ce_vec3_rot(&figbone->bone_position,
       &figbone->position,
       &figbone->parent->bone_orientation);
 //добавляем к нему смещение родительской кости
 ce_vec3_add(&figbone->bone_position,
       &figbone->bone_position,
       &figbone->parent->bone_position);
 //тут считаем поворот текущей кости с учетом поворота родительской кости
 ce_quat_mul(&figbone->bone_orientation,
       &figbone->orientation,
       &figbone->parent->bone_orientation);
    }
 //ну и все это засовываем как положение и поворот рендер итема
    renderitem->position = figbone->bone_position;
    renderitem->orientation = figbone->bone_orientation;
}

то, над чем я работаю
Код:
static void ce_figbone_update_transform(ce_figbone* figbone,
         ce_renderitem* renderitem,
         ce_complection* complection) // закинул сюда комплекцию на всякий случай
{
    // update binding pose
    if (NULL == figbone->anmstate->anmfile) {
 figbone->orientation = CE_QUAT_IDENTITY;
 figbone->position = CE_VEC3_ZERO;
    } else {  // линейная интерполяция поворота кости между двумя ключевыми кадрами анимации
 ce_quat q1, q2;
 ce_quat_slerp(&figbone->orientation, figbone->anmstate->coef,
     ce_quat_init_array(&q1, figbone->anmstate->anmfile->rotations +
           (int)figbone->anmstate->prev_frame * 4),
     ce_quat_init_array(&q2, figbone->anmstate->anmfile->rotations +
           (int)figbone->anmstate->next_frame * 4));
 //здесь собственно интерполяция смещения кости по аналогии с поворотом
 ce_vec3 v1, v2;
 ce_vec3_lerp(&figbone->position, figbone->anmstate->coef,
 ce_vec3_init_array(&v1,figbone->anmstate->anmfile->translations +
           (int)figbone->anmstate->prev_frame * 3),
  ce_vec3_init_array(&v2,figbone->anmstate->anmfile->translations +
           (int)figbone->anmstate->next_frame * 3));
    }

    // update bone pose
    if (NULL == figbone->parent) {  // для базовой (корневой?) кости - располагается обычно гдето в районе таза, поэтому без ее смещения модели по пояс в земле
 // bone pose == binding pose
 figbone->bone_position = figbone->position;
 figbone->bone_orientation = figbone->orientation;
    } else {
 //поворот смещения, куда повернута родительская кость -  не нужен. смещения из anm расчитаны уже с учетом этого поворота
 //добавляем к нему смещение родительской кости - дальше то же что и раньше
 ce_vec3_add(&figbone->bone_position,
       &figbone->position,
       &figbone->parent->bone_position);
 //тут считаем поворот текущей кости с учетом поворота родительской кости
 ce_quat_mul(&figbone->bone_orientation,
       &figbone->orientation,
       &figbone->parent->bone_orientation);
    }
 //ну и все это засовываем как положение и поворот рендер итема
    renderitem->position = figbone->bone_position;
    renderitem->orientation = figbone->bone_orientation;
}

Ну собственно так это выглядит. тоесть берем просто выбираем смещения из ключевых кадров, интерполируем на текущее состояние анимации и получаем почти то, что нужно - включая смещение базовой кости. но - смещения должны быть подвергнуты корректировке в зависимости от комплекции юнита, как мне кажется именно поэтому у лягушки части находятся отдельно.
Так вот если смещения по комплекции у нас считаются - мы используем все 8 наборов fig8, а если нтерполируем смещение из anm, то совершенно непонятно как его пересчитать по комплекции - набор смещений у нас тут вроде как один.

PS v1s0r - если с описанием/комментами гдето ошибся - поправьSmile
Ответ
#29
А, так вот оно чо... Последняя фраза мне объяснила всю суть проблемы Smile В смысле вот эта вот:
IDoL,Пятница, 15 Июля 2011, 12:13 Написал:Так вот если смещения по комплекции у нас считаются - мы используем все 8 наборов fig8, а если нтерполируем смещение из anm, то совершенно непонятно как его пересчитать по комплекции - набор смещений у нас тут вроде как один.
[right][snapback]40881[/snapback][/right]

Смешения в анимациях заданы одним набором, да, это не ошибка и тут нет логического несоответствия. Для расчета правильной позиции косточки необходимо учитывать не только это смещение, но и "саму кость" (из bon-файла). У меня сейчас, к сожалению, нет возможности посмотреть собственный код, но я точно помню, что классический подход к анимации мне не подошел. Если я правильно помню, мне в итоге вообще пришлось забить на смещения из anm и рендерить анимированный скелет только с помощью вращений. Смещения для косточек используются вроде только в случае корневых костей (первая кость дерева в скелете).

Короче говоря, упрощенно алгоритм для расчета позиции и ориентации некорневой кости на кажом кадре можно представить примерно вот так:

1) Повернуть текущую кость (из bon-файла) на родительскую ориентацию
2) Прибавить к получившемуся смещению смещение родительской кости (предрасчитанное уже)
3) Взять текущую ориентацию и довернуть ее на родительскую ориентацию

В итоге получишь нужные смещение и ориентацию для кости. Под "текущими" ориентациями я понимаю кватернион, считанный из anm.
Duty is everything, the greatest of joys, the deepest of sorrows.
Ответ
#30
Спасибо. Попробую разобраться что у нас там в "самой кости"Smile

по алгоритму расчета некорневой кости - это без учета смещений из anm? очень похоже на то что на данный момент используется. а в anm ведь все смещения уже расчитаны с учетом поворота родительской кости, насколько это получается у меняSmile

Но наиболее интересно смещение корневой кости - ведь оно тоже должно подвергаться корректировке - по высоте по крайней мере точно. Иначе - отрывает от земли или наоборот - это я уже пробовалSmile
Ответ
#31
ALtair,Friday, 15 July 2011, 17:07 Написал:Если я правильно помню, мне в итоге вообще пришлось забить на смещения из anm и рендерить анимированный скелет только с помощью вращений.
Вот-вот. Я также забил, потому что не догнал, как эти смещения использовать. В результате персы нормально анимируются, но не такие живые, как в ПЗ, т.е. без т.н. "покачиваний". Насколько я знаю, IDoL'у удалось смещать корневую кость и добиться правильной анимации. В некоторых случаях...
Windows - аналог плохо понятых механизмов Unix
Use Linux - open your mind
Ответ
#32
IDoL,Пятница, 15 Июля 2011, 18:42 Написал:по алгоритму расчета некорневой кости  - это без учета смещений из anm? [right][snapback]40883[/snapback][/right]
Да, без учета смещений из anm.


IDoL,Пятница, 15 Июля 2011, 18:42 Написал:Но наиболее интересно смещение корневой кости - ведь оно тоже должно подвергаться корректировке - по высоте по крайней мере точно. Иначе - отрывает от земли или наоборот - это я уже пробовалSmile
[right][snapback]40883[/snapback][/right]
Позиция корневой кости скелета считается иначе, да. Во-первых, для нее используется-таки смещение из anm (причем задает абсолютное смещение относительно пивота объекта, никак не расчитывается). Во-вторых, это смещение умножается на корректировку "роста", которая в свою очередь берется из *.adb (там три значения - min. mid и max, смещение же равно (mid != 0 ? (min + height*(max-min))/mid : 1.0f). В-третьих, используется некое смещение центра модели, задаваемое в RaceDatabase (Center shift), которое тоже в свою очередь домножается на корректировку роста.


v1s0r,Суббота, 16 Июля 2011, 16:28 Написал:В результате персы нормально анимируются, но не такие живые, как в ПЗ, т.е. без т.н. "покачиваний".[right][snapback]40885[/snapback][/right]
Я хз, откуда взяться каким-либо "покачиваниям", кроме как из анимации. Корневая кость анимируется смещениями из anm, а значит все "покачивания" надо брать именно оттуда.
Duty is everything, the greatest of joys, the deepest of sorrows.
Ответ
#33
ALtair,Понедельник, 18 Июля 2011, 09:35 Написал:Позиция корневой кости скелета считается иначе, да. Во-первых, для нее используется-таки смещение из anm (причем задает абсолютное смещение относительно пивота объекта, никак не расчитывается). Во-вторых, это смещение умножается на корректировку "роста", которая в свою очередь берется из *.adb (там три значения - min. mid и max, смещение же равно (mid != 0 ? (min + height*(max-min))/mid : 1.0f). В-третьих, используется некое смещение центра модели, задаваемое в RaceDatabase (Center shift), которое тоже в свою очередь домножается на корректировку роста.
[right][snapback]40887[/snapback][/right]
О, как все непросто. Я вот как раз на выходных сам полез в adb уже... Пока ничего особо примечательного не получилось. А что такое RaceDatabase?

Да, все эти покачивания - из anm и естьSmile просто теперь мне нужно правильно расчитать коэффициент для этих смещений
Ответ
#34
IDoL,Понедельник, 18 Июля 2011, 12:10 Написал:А что такое RaceDatabase?[right][snapback]40888[/snapback][/right]
Эмм, ну, как же, Database.res->units.udb->RaceModels.txt
Duty is everything, the greatest of joys, the deepest of sorrows.
Ответ
#35
А. Я туда еще не добрался...
надо смотреть, спасибо
Ответ


Перейти к форуму:


Пользователи, просматривающие эту тему: 2 Гость(ей)