Вот я добрался и до сюда.
Но меня уже пугает скрытность...
Скажите, пжл, доступна ли какая-либо информация о fig (я так понимаю, это тройка .mod .anm .bon). Есть ли какие-либо утилиты? С чего можно и нужно начать или сразу вешаться
Windows - аналог плохо понятых механизмов Unix
Use Linux - open your mind
23.03.2010, 22:16 (Сообщение последний раз редактировалось: 02.04.2010, 20:06 v1s0r.)
Готово описание формата fig с друзьями.
Если кто заинтересуется в приведении доки в более удобную форму - пишите. Я сомневаюсь, что получилось доступно и понятно всё объяснить.
Добавил: v1s0r [mergetime]1269368204[/mergetime]
Начать следует с figures.txt, а далее по ссылкам...
Документы обновлены. Улучшено оформление.
Windows - аналог плохо понятых механизмов Unix
Use Linux - open your mind
12.09.2010, 16:19 (Сообщение последний раз редактировалось: 12.09.2010, 16:20 Врыл.)
Решил попробовать сделать нового монстра "псоглавца". Прикрутил голову волка в unhuma.mod. Вот что получилось:
Есть ли способ
-изменить ориентацию головы
-изменить относительный размер
-изменить положение текстуры для волчьей головы чтобы сократить замещение текстур
?
К сожалению из описания форматов мне мало что понятно
14.07.2011, 12:55 (Сообщение последний раз редактировалось: 14.07.2011, 13:07 IDoL.)
Прощу помощи с анимацией.
Если более конкретно, то со смещениями при анимации.
На данный момент в CE не используются смещения из файла анимации, а считаются на ходу. в том числе смещение базовой кости - собственно поэтому драконы сейчас не летают Я занимаюсь тем, что пытаюсь это исправить.
У нас из fig8 по комплекции идет расчет смещения кости относительно родительской кости. потом по повороту родительской оси откладываем это смещение и рисуем текущую часть тела. Собственно это все равботает на вид более чем неплохо - за исключением смещения базовой кости.
В анимациях есть уже просчитанное смещение с учетом поворота родительской кости, в том числе для базовой кости. Однако, насколько я понимаю, для каждого кадра анимации есть только один набор смещений костей, что не позволяет правильно пересчитать смещения для текущей комплекции... Мне не удалось догадаться, как же правильно пересчитывать смещения для анимации.
Надеюсь, что кто-нибудь подскажет
PS на скринах смещения из файлов анимации - для кабанчика вполне неплохо(для кабанов побольше - не подходит), а вот лягушка, похоже, должна быть значительно больше чтобы подходить для этих смещений
Врыл
Знаю, что уже почти год прошел но тем не менее, все это можно сделать только через редактирование ресурсов.
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;
};
так выглядит функция для расчета анимации сейчас - смещение из анимации не учитывается, подъем модели из земли получается через хардкод
// 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 - если с описанием/комментами гдето ошибся - поправь
15.07.2011, 18:07 (Сообщение последний раз редактировалось: 15.07.2011, 18:09 ALtair.)
А, так вот оно чо... Последняя фраза мне объяснила всю суть проблемы В смысле вот эта вот:
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.
Спасибо. Попробую разобраться что у нас там в "самой кости"
по алгоритму расчета некорневой кости - это без учета смещений из anm? очень похоже на то что на данный момент используется. а в anm ведь все смещения уже расчитаны с учетом поворота родительской кости, насколько это получается у меня
Но наиболее интересно смещение корневой кости - ведь оно тоже должно подвергаться корректировке - по высоте по крайней мере точно. Иначе - отрывает от земли или наоборот - это я уже пробовал
ALtair,Friday, 15 July 2011, 17:07 Написал:Если я правильно помню, мне в итоге вообще пришлось забить на смещения из anm и рендерить анимированный скелет только с помощью вращений.
Вот-вот. Я также забил, потому что не догнал, как эти смещения использовать. В результате персы нормально анимируются, но не такие живые, как в ПЗ, т.е. без т.н. "покачиваний". Насколько я знаю, IDoL'у удалось смещать корневую кость и добиться правильной анимации. В некоторых случаях...
Windows - аналог плохо понятых механизмов Unix
Use Linux - open your mind
IDoL,Пятница, 15 Июля 2011, 18:42 Написал:по алгоритму расчета некорневой кости - это без учета смещений из anm? [right][snapback]40883[/snapback][/right]
Да, без учета смещений из anm.
IDoL,Пятница, 15 Июля 2011, 18:42 Написал:Но наиболее интересно смещение корневой кости - ведь оно тоже должно подвергаться корректировке - по высоте по крайней мере точно. Иначе - отрывает от земли или наоборот - это я уже пробовал
[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.
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 и есть просто теперь мне нужно правильно расчитать коэффициент для этих смещений