mocap на коліні (Skeletal Animations 2)

12 травня 2007 року Jochen Diehl опублікував дуже цікаву статтю «Skeletal Animations».



Коротко викладу суть:

  1. у статті не скелетна анімація (у першому ж реченні автор так і заявив: «This is no true bones animation»)
  2. дані для 10-фреймової анімації представляють собою масив точок (joints)
  3. самі точки автор ВРУЧНУ (наводячи курсор, і виписуючи координати) зібрав з запису ходи людини. Він використовував 10 фреймів, однаково розподілених по-часу
  4. у процесі програвання кліпу, анімація згладжується за допомогою інтерполяції
  5. у кінці статті автор пропонує продовжити експеримент:
    • використовувати time based анімацію замість фреймової з інтерполяцією
    • записати власні дії (стрибки, біг...) і спробувати зробити між ними плавні переходи

    • додати тіні
    • додати скелет і зробити ragdoll, вмираючий, як у житті
    • відписатися на форум
Що привернуло в методі мене:

  1. можливість НЕ заглиблюватися в 3D-моделювання — нехай цим займаються 3D-моделісти
  2. можливість НЕ заглиблюватись в проблематику перенесення 3D у флеш — мені для маленьких проектів це ні до чого
  3. дуже простий метод отримувати найрізноманітніші дії (actions) для персонажів
* якщо буде цікаво, розпишу детально по-пунктам методику додавання нових рухів, персонажів на хабре

Далі:

Насамперед перевів анімацію в time based (тут нічого складного):

public function update(time:Number):void
{
render(currentFrame);

currentFrame+=(actionArray.length*time/actionLoopTime);

currentFrame = int(currentFrame*100)/100;

if(currentFrame>actionFrameNumber)
{
currentFrame-=actionFrameNumber;
}
}


А от далі, в процесі занурення в метод, зрозумів, що є ще, як мінімум, одна привлекательнейшая (для мене) можливість урізноманітнити натовп NPC-персонажів на екрані. Досить просто трохи деформувати первісний «скелет» в ключових кадрах необхідних нам чином, і отримувати безліч варіантів фігур і характерів.

Наприклад (код можна побачити в исходниках Main.handleGUIChange — я тільки суть тут покажу):
  • вкороти ноги і руки (scale*point.y; scale*point.z;) — отримай гнома
  • подовж руки і ноги (scale*point.y; scale*point.z;) — отримай дядю Стьопу
  • заузь талію і розшир стегна (scale*point.x;) — отримай мужеподобную жінку
  • заузь плечі і раширь талію (scale*point.x;) — отримай жінкоподібного чоловіка
  • нахили корпус, підігніть коліна — пригибающийся солдатів
  • нахили корпус, підігніть коліна, тремтіння в суглобах — старий
  • зміни амплітуду помахів руками, ногами — отримай новий настрій
і все це на основі лише однієї єдиної послідовності ключових кадрів (!)

працюючий приклад, зібраний на коліні, можна побачити тут
код прикладу тут

Зауваження:
  • анімацію використовував авторську (Jochen Diehl)
  • нахили в моєму прикладі працюють препаршивейше — це тому, що я нічого не тямлю в математиці і в матрицях повороту зокрема. Якщо якийсь добрий чоловік підкаже, як на підставі наявних даних (дефолтний кут, поточний кут, дані з слайдера) правильно розрахувати результуючу матрицю повороту, я тут же внесу зміни в робочий код, і додам ще купу всяких можливостей по зміні фігури


Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.